merge 0.1.4_rc
authorDa Risk <darisk972@gmail.com>
Mon, 14 Jun 2010 22:47:22 +0200
changeset 774 1b88edb34d96
parent 773 489fde4ab7d4 (current diff)
parent 771 0fb9a16d7c32 (diff)
child 775 014589486da8
merge
res/drawable/beem_icon_launcher_color106.png
res/drawable/beem_icon_launcher_color160.png
res/drawable/beem_icon_launcher_color80.png
res/layout-large-land/login_anim.xml
res/layout-large/login_anim.xml
res/layout-small/login_anim.xml
res/values-de/arrays.xml
res/values-fr/arrays.xml
res/values-ru/arrays.xml
src/com/beem/project/beem/BeemService.java
src/com/beem/project/beem/service/BeemChatManager.java
src/com/beem/project/beem/service/Contact.java
src/com/beem/project/beem/ui/Chat.java
--- a/AndroidManifest.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/AndroidManifest.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -6,7 +6,7 @@
 		android:icon="@drawable/beem_launcher_icon_silver" android:theme="@style/Theme.BEEM.Default"
 		android:debuggable="true" android:name=".BeemApplication">
 		<activity android:name=".ui.Login" android:label="@string/app_name"
-			android:screenOrientation="portrait" android:launchMode="standard">
+			android:launchMode="standard">
 			<intent-filter>
 				<action android:name="android.intent.action.MAIN" />
 				<category android:name="android.intent.category.LAUNCHER" />
--- a/CREDITS	Mon Jun 14 22:45:56 2010 +0200
+++ b/CREDITS	Mon Jun 14 22:47:22 2010 +0200
@@ -1,9 +1,19 @@
 This file contains the name of the people who have contributed to
 BEEM. The names are sorted alphabetically by last name.
 
+Core Team :
 Frederic-Charles Barthelery
 Jean-Manuel Da Silva
 Nikita Kozlov
 Philippe Lago
 Jean Baptiste Vergely
 Vincent Véronis
+
+Contributors :
+Nolan Darilek
+
+Tranlators :
+GoApk http://goapk.com for chinese translations
+
+Thanks to all !
+
--- a/doc/asmack-beem/beem-build-process.patch	Mon Jun 14 22:45:56 2010 +0200
+++ b/doc/asmack-beem/beem-build-process.patch	Mon Jun 14 22:47:22 2010 +0200
@@ -1,5 +1,5 @@
---- asmack-org/build.bash	2010-03-05 02:42:58.978546820 +0100
-+++ asmack/build.bash	2010-03-05 02:35:43.689307349 +0100
+--- asmack-git/build.bash	2010-05-07 22:08:18.000000000 +0200
++++ asmack/build.bash	2010-05-07 22:06:53.000000000 +0200
 @@ -15,11 +15,11 @@
    if ! [ -f "${2}/.svn/entries" ]; then
      mkdir "${2}"
@@ -20,83 +20,14 @@
  fetchall() {
 -  gitfetch "git://github.com/rtreffer/smack.git" "smack"
 -  fetch "http://svn.apache.org/repos/asf/qpid/trunk/qpid/java/management/common/src/main/" "qpid"
--  fetch "http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/" "harmony"
+-  fetch "http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/auth/src/main/java/common/" "harmony"
 -  fetch "https://dnsjava.svn.sourceforge.net/svnroot/dnsjava/trunk" "dnsjava"
 -  fetch "https://kenai.com/svn/jbosh~main/trunk/jbosh/src/main/java" "jbosh"
 +  fetch "http://svn.igniterealtime.org/svn/repos/smack/trunk" "smack" "11644"
 +  fetch "http://svn.apache.org/repos/asf/qpid/trunk/qpid/java/management/common/src/main/" "qpid" "HEAD"
-+  fetch "http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/" "harmony" "HEAD"
++  fetch "http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/auth/src/main/java/common/" "harmony" "HEAD"
 +  fetch "https://dnsjava.svn.sourceforge.net/svnroot/dnsjava/trunk" "dnsjava" "HEAD"
 +  fetch "https://kenai.com/svn/jbosh~main/trunk/jbosh/src/main/java" "jbosh" "HEAD"
  }
  
  copyfolder() {
-@@ -95,7 +95,7 @@
-     buildsrc
-     patchsrc "patch"
-     patchsrc "${dir}"
--    ant -Djar.suffix=`echo ${dir}|sed 's:patch/:-:'`
-+    ant -Dbuild.all=true -Djar.suffix=`echo ${dir}|sed 's:patch/:-:'`
-   done
- }
- 
---- asmack3/build.xml	2010-02-24 16:09:39.000000000 +0100
-+++ asmack-org/build.xml	2010-02-24 00:18:40.000000000 +0100
-@@ -36,6 +36,13 @@
-     </and>
- </condition>
- 
-+<condition property="build-2.1">
-+    <and>
-+        <istrue value="${build.all}" />
-+        <available file="${sdk-location}/platforms/android-2.1/android.jar" />
-+    </and>
-+</condition>
-+
- <target name="compile-jse"  description="Compile for java se">
-     <delete dir="build/classes" failonerror="false" />
-     <mkdir dir="build/classes" />
-@@ -65,6 +72,34 @@
-     />
- </target>
- 
-+<target name="compile-a21" description="Compile for android 2.1" if="build-2.1">
-+    <delete dir="build/classes" failonerror="false" />
-+    <mkdir dir="build/classes" />
-+    <mkdir dir="build/classes/trunk" />
-+    <javac
-+      target="1.5"
-+      srcdir="build/src/trunk"
-+      destdir="build/classes/trunk"
-+      classpath="lib/xmlpull_1_1_3_4c.jar"
-+      bootclasspath="${sdk-location}/platforms/android-2.1/android.jar"
-+      debug="true"
-+      debuglevel="source,lines"
-+    />
-+    <copy todir="build/classes/trunk"><fileset dir="build/src/trunk" includes="META-INF/**" /></copy>
-+    <jar
-+      basedir="build/classes/trunk"
-+      destfile="build/asmack-android-2.1${jar.suffix}.jar"
-+      filesonly="true"
-+      level="9"
-+    />
-+    <zip
-+      basedir="build/src/trunk"
-+      destfile="build/asmack-android-2.1-source${jar.suffix}.zip"
-+      filesonly="true"
-+      level="9"
-+    />
-+</target>
-+
- <target name="compile-a201" description="Compile for android 2.0.1" if="build-2.0.1">
-     <delete dir="build/classes" failonerror="false" />
-     <mkdir dir="build/classes" />
-@@ -208,7 +243,7 @@
- <target
-   name="compile"
-   description="Compile for all targets"
--  depends="compile-jse,compile-a201,compile-a20,compile-a16,compile-a15,compile-a11"
-+  depends="compile-jse,compile-a21,compile-a201,compile-a20,compile-a16,compile-a15,compile-a11"
- />
- 
- </project>
Binary file res/drawable-hdpi/beem_icon_launcher_color.png has changed
Binary file res/drawable-ldpi/beem_icon_launcher_color.png has changed
Binary file res/drawable-mdpi/beem_icon_launcher_color.png has changed
Binary file res/drawable/beem_icon_launcher_color106.png has changed
Binary file res/drawable/beem_icon_launcher_color160.png has changed
Binary file res/drawable/beem_icon_launcher_color80.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/res/drawable/status_icon.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Level list drawable for status icon
+    See src/com/beem/project/beem/utils/Status.java
+    for level values
+-->
+<level-list xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:maxLevel="100" android:drawable="@android:drawable/presence_offline" />
+  <item android:maxLevel="200" android:drawable="@drawable/status_requested" />
+  <item android:maxLevel="300" android:drawable="@android:drawable/presence_away" />
+  <item android:maxLevel="400" android:drawable="@android:drawable/presence_busy" />
+  <item android:maxLevel="600" android:drawable="@android:drawable/presence_online" />
+ </level-list>
--- a/res/layout-large-land/login_anim.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:layout_height="fill_parent" android:layout_width="fill_parent"
-	android:orientation="vertical">
-	<ImageView android:id="@+id/loginanim_logo_anim" android:src="@drawable/beem_icon_launcher_color160"
-		android:layout_height="wrap_content" android:layout_width="wrap_content"
-		android:layout_gravity="center_vertical|center_horizontal|center"
-		android:layout_weight="1" />
-	<TextView android:id="@+id/loginanim_status_text"
-		android:layout_width="fill_parent" android:layout_height="wrap_content"
-		android:textSize="20sp" android:gravity="center" android:textColor="@color/vert_manu"/>
-	<Button android:id="@+id/loginanim_cancel_button"
-		android:layout_height="wrap_content" android:layout_width="fill_parent"
-		android:layout_gravity="bottom" android:text="@string/CancelButton" />
-</LinearLayout>
-
--- a/res/layout-large/login_anim.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:layout_height="fill_parent" android:layout_width="fill_parent"
-	android:orientation="vertical">
-	<ImageView android:id="@+id/loginanim_logo_anim" android:src="@drawable/beem_icon_launcher_color160"
-		android:layout_height="wrap_content" android:layout_width="wrap_content"
-		android:layout_gravity="center_vertical|center_horizontal|center"
-		android:layout_weight="1" />
-	<TextView android:id="@+id/loginanim_status_text"
-		android:layout_width="fill_parent" android:layout_height="wrap_content"
-		android:textSize="20sp" android:gravity="center" android:textColor="@color/vert_manu"/>
-	<Button android:id="@+id/loginanim_cancel_button"
-		android:layout_height="wrap_content" android:layout_width="fill_parent"
-		android:layout_gravity="bottom" android:text="@string/CancelButton" />
-</LinearLayout>
-
--- a/res/layout-small/login_anim.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:layout_height="fill_parent" android:layout_width="fill_parent"
-	android:orientation="vertical">
-	<ImageView android:id="@+id/loginanim_logo_anim" android:src="@drawable/beem_icon_launcher_color80"
-		android:layout_height="wrap_content" android:layout_width="wrap_content"
-		android:layout_gravity="center_vertical|center_horizontal|center"
-		android:layout_weight="1" />
-	<TextView android:id="@+id/loginanim_status_text"
-		android:layout_width="fill_parent" android:layout_height="wrap_content"
-		android:textSize="20sp" android:gravity="center" android:textColor="@color/vert_manu"/>
-	<Button android:id="@+id/loginanim_cancel_button"
-		android:layout_height="wrap_content" android:layout_width="fill_parent"
-		android:layout_gravity="bottom" android:text="@string/CancelButton" />
-</LinearLayout>
-
--- a/res/layout/addcontact.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/addcontact.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -11,21 +11,24 @@
 		<EditText android:id="@+id/addc_login" android:inputType="textEmailAddress"
 			android:imeOptions="actionNext" android:scrollHorizontally="true"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
-			android:layout_margin="3dip" />
+			android:layout_margin="3dip"
+			android:contentDescription="@string/AddCLogin"/>
 		<TextView android:layout_width="fill_parent"
 			android:layout_height="wrap_content" android:text="@string/AddCAlias"
 			style="@style/Label" />
 		<EditText android:id="@+id/addc_alias" android:inputType="text"
 			android:imeOptions="actionNext" android:textSize="16sp"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
-			android:scrollHorizontally="true" android:layout_margin="3dip" />
+			android:scrollHorizontally="true" android:layout_margin="3dip"
+			android:contentDescription="@string/AddCAlias"/>
 		<TextView android:layout_width="fill_parent"
 			android:layout_height="wrap_content" android:text="@string/AddCGroup"
 			style="@style/Label" />
 		<EditText android:id="@+id/addc_group" android:inputType="text"
 			android:textSize="16sp" android:layout_width="fill_parent"
 			android:scrollHorizontally="true" android:layout_height="wrap_content"
-			android:layout_margin="3dip" />
+			android:layout_margin="3dip"
+			android:contentDescription="@string/AddCGroup"/>
 		<View android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:layout_weight="1" android:layout_marginBottom="18dp" />
 		<Button android:id="@+id/addc_ok" android:layout_width="fill_parent"
--- a/res/layout/changestatus.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/changestatus.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -10,7 +10,8 @@
 			android:text="@string/ChangeStatusType" style="@style/Label" />
 		<Spinner android:id="@+id/ChangeStatusSpinner"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
-			android:drawSelectorOnTop="true" android:layout_below="@id/ChangeStatusTypeLabel" />
+			android:drawSelectorOnTop="true" android:layout_below="@id/ChangeStatusTypeLabel"
+			android:contentDescription="@string/ChangeStatusType"/>
 		<TextView android:id="@+id/ChangeStatusMessageLabel"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:layout_below="@id/ChangeStatusSpinner"
@@ -18,6 +19,7 @@
 			android:inputType="textShortMessage|textCapSentences|textAutoCorrect|textMultiLine|textImeMultiLine"
 			android:imeOptions="actionDone"
 			android:selectAllOnFocus="true"
+			android:focusable="true"
 			/>
 		<EditText android:id="@+id/ChangeStatusMessage"
 			android:inputType="textShortMessage|textAutoCorrect"
--- a/res/layout/chat.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/chat.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -7,6 +7,7 @@
 		android:orientation="horizontal" android:gravity="center_vertical"
 		android:background="#222222" android:padding="4px">
 		<ImageView android:id="@+id/chat_contact_status_icon"
+			android:src="@drawable/status_icon"
 			android:adjustViewBounds="true" android:layout_width="wrap_content"
 			android:layout_height="wrap_content" android:gravity="center_vertical" />
 		<LinearLayout android:orientation="vertical"
@@ -15,27 +16,32 @@
 			<TextView android:id="@+id/chat_contact_name"
 				android:layout_width="fill_parent" android:layout_height="wrap_content"
 				android:lines="1" android:singleLine="true" android:textSize="16sp"
-				android:textStyle="bold" android:textColor="#FFFFFF" />
+				android:textStyle="bold" android:textColor="#FFFFFF"
+				android:focusable="true"/>
 			<TextView android:id="@+id/chat_contact_status_msg"
 				android:layout_width="fill_parent" android:layout_height="wrap_content"
 				android:autoLink="all" android:textSize="12sp" android:textColor="#FFFFFF"
-				android:textColorLink="#FFFFFF" />
+				android:textColorLink="#FFFFFF"
+				android:focusable="true"/>
 			<TextView android:id="@+id/chat_contact_chat_state"
 				android:layout_width="fill_parent" android:layout_height="wrap_content"
-				android:textStyle="italic" android:textSize="12sp" />
+				android:textStyle="italic" android:textSize="12sp"
+				android:focusable="true"/>
 		</LinearLayout>
 	</LinearLayout>
 	<View android:layout_width="fill_parent" android:layout_height="2dp"
 		android:fadingEdge="horizontal" android:background="#555555" />
 	<ListView android:id="@+id/chat_messages"
-		android:layout_width="fill_parent" android:layout_height="0px"
+		android:layout_width="fill_parent" android:layout_height="0dip"
 		android:layout_weight="1" android:transcriptMode="normal"
+		android:stackFromBottom="true"
 		android:fastScrollEnabled="true" android:smoothScrollbar="false"
-		android:layout_marginBottom="20sp" android:padding="4px" />
+		android:layout_marginBottom="20sp" android:padding="4px"
+		android:focusable="true"/>
 	<LinearLayout android:layout_width="fill_parent"
 		android:layout_height="wrap_content" android:orientation="horizontal"
 		android:background="#222222" android:padding="8px">
-		<EditText android:id="@+id/chat_input" android:layout_width="wrap_content"
+		<EditText android:id="@+id/chat_input" android:layout_width="0dip"
 			android:layout_height="fill_parent" android:layout_weight="1"
 			android:maxLines="5"
 			android:inputType="textShortMessage|textAutoCorrect|textMultiLine"
--- a/res/layout/contactdialogaliasdialog.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/contactdialogaliasdialog.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -11,5 +11,6 @@
 		android:layout_height="wrap_content" android:layout_width="fill_parent"
 		android:layout_marginLeft="20dip" android:layout_marginRight="20dip"
 		android:scrollHorizontally="true" android:autoText="false"
-		android:capitalize="none" android:gravity="fill_horizontal" />
+		android:capitalize="none" android:gravity="fill_horizontal"
+		android:contentDescription="@string/userinfo_label_alias"/>
 </LinearLayout>
--- a/res/layout/contactlist.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/contactlist.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -8,6 +8,8 @@
 		android:layout_height="fill_parent" android:orientation="horizontal"
 		android:padding="2px">
 		<ListView android:id="@+id/contactlist" android:layout_width="fill_parent"
-			android:layout_height="fill_parent" android:transcriptMode="disabled" />
+		    android:layout_height="fill_parent" android:transcriptMode="disabled"
+		    android:textFilterEnabled="true" />
+
 	</LinearLayout>
 </LinearLayout>
--- a/res/layout/contactlist_groupstub.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/contactlist_groupstub.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -4,7 +4,7 @@
 	android:layout_height="wrap_content">
 	<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
 		android:id="@+id/contactlist_banner" android:layout_width="fill_parent"
-		android:layout_height="42px" android:spacing="42px"
+		android:layout_height="40dp" android:spacing="25dp"
 		android:unselectedAlpha="0.4" android:background="#222222" />
 	<View android:layout_width="fill_parent" android:layout_height="2dp"
 		android:fadingEdge="horizontal" android:background="#555555" />
--- a/res/layout/create_account.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/create_account.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -11,21 +11,24 @@
 		<EditText android:id="@+id/create_account_username"
 			android:inputType="textEmailAddress" android:imeOptions="actionNext"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
-			android:singleLine="true" />
+			android:singleLine="true"
+			android:contentDescription="@string/create_account_username"/>
 		<TextView android:id="@+id/create_account_label_password"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:text="@string/create_account_password" style="@style/Label" />
 		<EditText android:id="@+id/create_account_password"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:inputType="textPassword" android:imeOptions="actionNext"
-			android:password="true" android:singleLine="true" />
+			android:password="true" android:singleLine="true"
+			android:contentDescription="@string/create_account_password"/>
 		<TextView android:id="@+id/create_account_label_confirm_password"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:text="@string/create_account_confirm_password" style="@style/Label" />
 		<EditText android:id="@+id/create_account_confirm_password"
 			android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:inputType="textPassword" android:imeOptions="actionNext"
-			android:password="true" android:singleLine="true" />
+			android:password="true" android:singleLine="true"
+			android:contentDescription="@string/create_account_confirm_password"/>
 		<View android:layout_width="fill_parent" android:layout_height="wrap_content"
 			android:layout_weight="1" android:layout_marginBottom="18dp" />
 		<Button android:id="@+id/create_account_button"
--- a/res/layout/group_list.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/group_list.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -5,11 +5,12 @@
 
 	<ListView android:id="@android:id/list" android:layout_width="fill_parent"
 		android:layout_height="0dip" android:layout_weight="1"
-		android:stackFromBottom="true" android:transcriptMode="normal" />
+		android:stackFromBottom="true" android:transcriptMode="normal"
+		android:focusable="true"/>
 
 	<EditText android:id="@+id/GroupListText"
 		android:layout_width="fill_parent"
 		android:layout_height="wrap_content"
 		android:maxLength="20"
 		android:singleLine="true" />
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
--- a/res/layout/login_anim.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/login_anim.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -3,7 +3,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 	android:layout_height="fill_parent" android:layout_width="fill_parent"
 	android:orientation="vertical">
-	<ImageView android:id="@+id/loginanim_logo_anim" android:src="@drawable/beem_icon_launcher_color106"
+	<ImageView android:id="@+id/loginanim_logo_anim" android:src="@drawable/beem_icon_launcher_color"
 		android:layout_height="wrap_content" android:layout_width="wrap_content"
 		android:layout_gravity="center_vertical|center_horizontal|center"
 		android:layout_weight="1" />
--- a/res/layout/preferences.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/preferences.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -25,11 +25,11 @@
 				android:hint="@string/away_message_hint" />
 		</PreferenceScreen>
 		<PreferenceScreen android:title="@string/notification_preferences">
-			<CheckBoxPreference android:title="@string/notification_disable_vibrate_title"
-				android:defaultValue="false" android:summary="@string/notification_disable_vibrate_sum"
-				android:key="settings_notification_disable_vibrate" />
+			<CheckBoxPreference android:title="@string/notification_enable_vibrate_title"
+				android:defaultValue="false" android:summary="@string/notification_enable_vibrate_sum"
+				android:key="notification_vibrate" />
 			<RingtonePreference
-				android:title="@string/notification_snd_title" android:key="settings_notification_snd"
+				android:title="@string/notification_snd_title" android:key="notification_sound"
 				android:summary="@string/notification_snd_sum" android:ringtoneType="notification"
 				android:showDefault="true" />
 		</PreferenceScreen>
@@ -56,31 +56,31 @@
 			android:summary="@string/settings_proxy_sum">
 			<CheckBoxPreference android:title="@string/SettingsProxyProxy"
 				android:defaultValue="false" android:summary="@string/SettingsProxySummary"
-				android:key="settings_key_proxy_use" />
+				android:key="proxy_use" />
 			<PreferenceCategory android:title="@string/proxy_proxy_settings">
-				<ListPreference android:dependency="settings_key_proxy_use"
+				<ListPreference android:dependency="proxy_use"
 					android:title="@string/SettingsProxyType" android:entries="@array/proxy_types"
 					android:summary="@string/SettingsProxyTypeSummary"
 					android:defaultValue="HTTP" android:entryValues="@array/proxy_types"
-					android:key="settings_key_proxy_type" />
+					android:key="proxy_type" />
 				<EditTextPreference android:singleLine="true"
-					android:dependency="settings_key_proxy_use" android:name="serveur"
+					android:dependency="proxy_use" android:name="serveur"
 					android:summary="@string/SettingsProxyServer" android:title="@string/settings_proxy_server"
-					android:key="settings_key_proxy_server" />
+					android:key="proxy_server" />
 				<EditTextPreference android:singleLine="true"
-					android:dependency="settings_key_proxy_use" android:name="port"
+					android:dependency="proxy_use" android:name="port"
 					android:summary="@string/SettingsProxyPort" android:title="@string/settings_proxy_port"
-					android:key="settings_key_proxy_port" android:numeric="signed" android:hint="@string/comments_proxy_port" />
+					android:key="proxy_port" android:numeric="signed" android:hint="@string/comments_proxy_port" />
 			</PreferenceCategory>
 			<PreferenceCategory android:title="@string/proxy_user_settings">
 				<EditTextPreference android:singleLine="true"
-					android:dependency="settings_key_proxy_use" android:name="Utilisateur"
+					android:dependency="proxy_use" android:name="Utilisateur"
 					android:summary="@string/SettingsProxyUser" android:title="@string/settings_proxy_username"
-					android:key="settings_key_proxy_username" />
+					android:key="proxy_username" />
 				<EditTextPreference android:singleLine="true"
-					android:dependency="settings_key_proxy_use" android:name="pass_user"
+					android:dependency="proxy_use" android:name="pass_user"
 					android:password="true" android:summary="@string/SettingsProxyPassword"
-					android:title="@string/settings_proxy_password" android:key="settings_key_proxy_password" />
+					android:title="@string/settings_proxy_password" android:key="proxy_password" />
 			</PreferenceCategory>
 		</PreferenceScreen>
 		<PreferenceScreen android:key="advanced"
--- a/res/layout/privacy_list.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/privacy_list.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -4,7 +4,9 @@
 	android:layout_height="fill_parent" android:padding="8dp">
 	<ListView android:id="@id/android:list" android:layout_width="fill_parent"
 		android:layout_height="fill_parent" android:layout_weight="1"
-		android:drawSelectorOnTop="false" />
+		android:drawSelectorOnTop="false"
+		android:focusable="true"/>
 	<TextView android:id="@id/android:empty" android:layout_width="fill_parent"
-		android:layout_height="fill_parent" android:text="@string/privacy_list_no_data" />
+		android:layout_height="fill_parent" android:text="@string/privacy_list_no_data"
+		android:focusable="true"/>
 </LinearLayout>
--- a/res/layout/privacy_list_create_dialog.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/privacy_list_create_dialog.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -10,5 +10,6 @@
 		android:layout_height="wrap_content" android:layout_width="fill_parent"
 		android:layout_marginLeft="20dip" android:layout_marginRight="20dip"
 		android:scrollHorizontally="true" android:autoText="false"
-		android:capitalize="none" android:gravity="fill_horizontal" />
+		android:capitalize="none" android:gravity="fill_horizontal"
+		android:contentDescription="@string/privacy_list_create_dialog_list_name_label"/>
 </LinearLayout>
--- a/res/layout/subscription.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/subscription.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -16,7 +16,8 @@
 			android:layout_height="fill_parent" android:autoLink="none"
 			android:id="@+id/SubscriptionText" android:text="@string/SubscriptText"
 			android:textColor="@color/white" android:textSize="14sp"
-			android:layout_weight="1" android:layout_marginBottom="18dp" />
+			android:layout_weight="1" android:layout_marginBottom="18dp"
+			android:focusable="true"/>
 
 		<LinearLayout android:orientation="horizontal"
 			android:layout_width="fill_parent" android:layout_height="wrap_content">
@@ -30,4 +31,4 @@
 				android:layout_weight="1" android:text="@string/RefuseButton" />
 		</LinearLayout>
 	</LinearLayout>
-</ScrollView>
\ No newline at end of file
+</ScrollView>
--- a/res/layout/wizard_account.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/wizard_account.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -16,7 +16,8 @@
 		android:layout_width="fill_parent" android:layout_height="wrap_content"
 		android:text="@string/account_wizard_text1"
 		android:textSize="18sp"
-		android:paddingBottom="10dip" />
+		android:paddingBottom="10dip"
+		android:focusable="true" />
 	    <RadioGroup android:id="@+id/configure_group"
 		android:layout_width="fill_parent" android:layout_height="wrap_content" >
 		<RadioButton android:id="@+id/configure_account"
--- a/res/layout/wizard_account_configure.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/layout/wizard_account_configure.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -24,14 +24,16 @@
 		android:inputType="textEmailAddress" android:imeOptions="actionNext"
 		android:layout_width="fill_parent" android:layout_height="wrap_content"
 		android:singleLine="true" 
-		android:hint="beem@beem-project.com "/>
+		android:hint="beem@beem-project.com "
+		android:contentDescription="@string/JabberID"/>
 	    <TextView
 		android:layout_width="fill_parent" android:layout_height="wrap_content"
 		android:text="@string/Password" style="@style/Label" />
 	    <EditText android:id="@+id/account_password"
 		android:layout_width="fill_parent" android:layout_height="wrap_content"
 		android:inputType="textPassword" android:imeOptions="actionNext"
-		android:password="true" android:singleLine="true" />
+		android:password="true" android:singleLine="true"
+		android:contentDescription="@string/Password"/>
 	</LinearLayout>
     </ScrollView>
 
--- a/res/menu/contact_list.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/menu/contact_list.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -3,6 +3,9 @@
 		android:visible="true"
 		android:title="@string/contact_list_menu_add_contact"
 		android:icon="@drawable/ic_menu_add" />
+	<item android:id="@+id/menu_change_status"
+	    android:visible="true"
+	    android:title="@string/contact_list_menu_status"/>
 	<item android:id="@+id/contact_list_menu_settings"
 		android:visible="true"
 		android:title="@string/contact_list_menu_settings"
--- a/res/values-de/arrays.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-	<string-array name="proxy_types">
-		<item>HTTP</item>
-		<item>SOCKS4</item>
-		<item>SOCKS5</item>
-	</string-array>
-	<string-array name="status_types">
-		<item name="AvailableForChat">Bereit zum Chatten</item>
-		<item name="Available">Online</item>
-		<item name="Busy">Beschäftigt</item>
-		<item name="Away">Abwesend</item>
-		<item name="Unavailable">N/A</item>
-		<item name="Disconnected">Offline</item>
-	</string-array>
-	<string-array name="privacy_list_select_dialog">
-		<item name="@string/privacy_list_select_dialog_buddies">Kontakte</item>
-		<item name="@string/privacy_list_select_dialog_groups">Gruppen</item>
-		<item name="@string/privacy_list_select_dialog_delete">Löschen</item>
-	</string-array>
-	<string-array name="loganim_state">
-		<item name="@string/loganim_connecting">Verbinden...</item>
-		<item name="@string/loganim_authenticating">Authentifizieren...</item>
-		<item name="@string/loganim_login_success">Erfolgreich angemeldet</item>
-		<item name="@string/loganim_login_failed">Anmeldung gescheitert</item>
-	</string-array>
-</resources>
\ No newline at end of file
--- a/res/values-de/strings.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/values-de/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -21,21 +21,6 @@
 	<string name="BeemServiceCreated">Beem Service erstellt</string>
 	<string name="BeemServiceDestroyed">Beem Service verworfen</string>
 
-	<!--  Preferences informations -->
-	<string name="PreferenceStatus">Status</string>
-	<string name="PreferenceStatusText">status_text</string>
-	<string name="PreferenceIsConfigured">preference_is_configured	</string>
-
-	<!-- ContactListSettings class -->
-	<string name="CLSServerConnection">Server Verbindung</string>
-	<string name="CLSUserid">Benutzer id:</string>
-	<string name="CLSPassword">Passwort:</string>
-	<string name="CLSService">Dienst:</string>
-	<string name="CLSHostPort">Port:</string>
-	<string name="CLSProxyInfo">Proxy Informationen</string>
-	<string name="CLSLogin">Anmelden:</string>
-	<string name="CLSOkButton">Ok</string>
-
 	<!--  ContactDialog class -->
 	<string name="CDChat">Chatten</string>
 	<string name="CDCall">Anrufen</string>
@@ -122,8 +107,8 @@
 	<string name="away_message_sum">Angezeigte Abwesendheitsnachricht</string>
 	<string name="away_message_hint">Ich bin abwesend, mein Telefonbildschirm ist aus</string>
 	<string name="notification_preferences">Benachrichtigungseinstellungen</string>
-	<string name="notification_disable_vibrate_title">Vibrieren</string>
-	<string name="notification_disable_vibrate_sum">Deaktivieren Sie vibriert bei eingehenden Nachrichten</string>
+	<string name="notification_enable_vibrate_title">Vibrieren</string>
+	<string name="notification_enable_vibrate_sum">Aktivieren Sie vibriert bei eingehenden Nachrichten</string>
 	<string name="notification_snd_title">Nachrichtensignalton</string>
 	<string name="notification_snd_sum">Lege den Signalton für eingehende Nachrichten fest</string>
 
@@ -135,9 +120,6 @@
 	<string name="SubscriptText">%s will dich zu seiner/ihrer Kontaktliste hinzufügen. Willst du ihn/sie authorisieren ?</string>
 	<string name="SubscriptTitle">Kontakt authorisieren ?</string>
 
-	<!-- ContactList class -->
-	<string name="ConListNotConnected">Offline</string>
-
 	<!--  BeemChatManager -->
 	<string name="BeemChatManagerNewMessage">Du hast eine neue Nachricht</string>
 
@@ -159,9 +141,6 @@
 	<string name="user_info_name">Beem - Benutzerinformation</string>
 
 	<!-- Buttons -->
-	<string name="button_reset">Zurücksetzen</string>
-	<string name="button_login">Anmelden</string>
-	<string name="button_save">Speichern</string>
 	<string name="button_create_account">Dieses Konto erstellen</string>
 	<string name="button_create_login_account">Dieses Konto erstellen und benutzen</string>
 
@@ -179,12 +158,17 @@
 	<string name="login_settings_button">Einstellungen</string>
 	<string name="login_login_button">Anmelden</string>
 	<string name="login_login_progress">Verbinden. Bitte warten...</string>
-	<string name="login_max_retry">Maximaler Wiederholungsversuch</string>
 	<string name="login_error_msg">Leider trat ein Fehler auf.\n\nFehler 		Detail:\n%s</string>
 	<string name="login_menu_login">Anmelden</string>
 	<string name="login_no_connectivity">Keine Internetverbindung gefunden</string>
 	<string name="login_start_msg">Konfiguration der Einstellungen im Menü</string>
 
+	<!-- LoginAnim activity -->
+	<string name="loganim_connecting">Verbinden ...</string>
+	<string name="loganim_authenticating">Authentifizieren ...</string>
+	<string name="loganim_login_success">Erfolgreich angemeldet</string>
+	<string name="loganim_login_failed">Anmeldung gescheitert</string>
+
 	<!-- EditSettings Activity -->
 	<string name="settings_menu_create_account">Konto erstellen</string>
 	<string name="settings_menu_privacy_lists">Meine Privatsphärenliste verwalten</string>
--- a/res/values-fr/arrays.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-	<string-array name="proxy_types">
-		<item>HTTP</item>
-		<item>SOCKS4</item>
-		<item>SOCKS5</item>
-	</string-array>
-	<string-array name="status_types">
-		<item name="AvailableForChat">Disponible pour Bavarder</item>
-		<item name="Available">Disponible</item>
-		<item name="Busy">Occupé(e)</item>
-		<item name="Away">Parti(e)</item>
-		<item name="Unavailable">Indisponible</item>
-		<item name="Disconnected">Déconnecté(e)</item>
-	</string-array>
-	<string-array name="privacy_list_select_dialog">
-		<item name="@string/privacy_list_select_dialog_buddies">Contacts</item>
-		<item name="@string/privacy_list_select_dialog_groups">Groupes</item>
-		<item name="@string/privacy_list_select_dialog_delete">Supprimer</item>
-	</string-array>
-	<string-array name="loganim_state">
-		<item name="@string/loganim_connecting">Connexion en cours...</item>
-		<item name="@string/loganim_authenticating">Authentification...</item>
-		<item name="@string/loganim_login_success">Connexion effectuée</item>
-		<item name="@string/loganim_login_failed">Echec de la connexion</item>
-	</string-array>
-</resources>
--- a/res/values-fr/strings.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/values-fr/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -21,16 +21,6 @@
 	<string name="BeemServiceCreated">BeemService Créé</string>
 	<string name="BeemServiceDestroyed">BeemService détruit</string>
 
-	<!-- ContactListSettings class -->
-	<string name="CLSServerConnection">Connexion au serveur</string>
-	<string name="CLSUserid">Id utilisateur:</string>
-	<string name="CLSPassword">Mot de passe:</string>
-	<string name="CLSService">Service:</string>
-	<string name="CLSHostPort">Port:</string>
-	<string name="CLSProxyInfo">Informations proxy</string>
-	<string name="CLSLogin">Nom d\'utilisateur:</string>
-	<string name="CLSOkButton">Ok</string>
-
 	<!--  ContactDialog class -->
 	<string name="CDChat">Chat</string>
 	<string name="CDCall">Appeler</string>
@@ -114,13 +104,13 @@
 	<string name="settings_proxy_username">Nom d\'utilisateur</string>
 	<string name="settings_proxy_password">Mot de passe</string>
 	<string name="away_chk_title">Activer l\'absence automatique</string>
-	<string name="away_chk_sum">Change votre status en Absent automatiquement quand l\'écran du telephone s\'éteind</string>
-	<string name="away_message_title">Message d\'asbence</string>
+	<string name="away_chk_sum">Change votre status en Absent automatiquement quand l\'écran du telephone s\'éteint</string>
+	<string name="away_message_title">Message d\'absence</string>
 	<string name="away_message_sum">Votre Message d\'absence</string>
-	<string name="away_message_hint">Je suis absent car mon ecran est éteind</string>
+	<string name="away_message_hint">Je suis absent car mon ecran est éteint</string>
 	<string name="notification_preferences">Paramètres des notifications</string>
-	<string name="notification_disable_vibrate_title">Vibreur</string>
-	<string name="notification_disable_vibrate_sum">Désactiver le vibreur pour les messages entrants</string>
+	<string name="notification_enable_vibrate_title">Activer le vibreur</string>
+	<string name="notification_enable_vibrate_sum">Activer le vibreur pour les messages entrants</string>
 	<string name="notification_snd_title">Sonnerie des messages</string>
 	<string name="notification_snd_sum">Configurer la sonnerie des messages entrants</string>
 	
@@ -131,9 +121,6 @@
 	<string name="SubscriptText">%s vient de vous ajouter à sa liste de contacts. Souhaitez-vous l\'autoriser ?</string>
 	<string name="SubscriptTitle">Autoriser ce contact ?</string>
 
-	<!-- ContactList class -->
-	<string name="ConListNotConnected">Non connecté(e)</string>
-
 	<!--  BeemChatManager class -->
 	<string name="BeemChatManagerNewMessage">Vous avez reçu un nouveau message</string>
 
@@ -163,9 +150,6 @@
 	<!--
     	Buttons
     -->
-	<string name="button_reset">Réinitialiser</string>
-	<string name="button_login">Se connecter</string>
-	<string name="button_save">Enregistrer</string>
 	<string name="button_create_account">Créer ce compte</string>
 	<string name="button_create_login_account">Créer puis utiliser ce compte</string>
 
@@ -195,9 +179,13 @@
 	<string name="login_no_connectivity">Pas de connexion internet disponible</string>
 	<string name="login_start_msg">Configuration des informations dans le menu</string>
 
-	<!--
-		EditSettings Activity
-	-->
+	<!-- LoginAnim activity -->
+	<string name="loganim_connecting">Connexion en cours ...</string>
+	<string name="loganim_authenticating">Authentification ...</string>
+	<string name="loganim_login_success">Connexion effectuée</string>
+	<string name="loganim_login_failed">Echec de la connextion</string>
+
+	<!-- EditSettings Activity -->
 	<string name="settings_menu_create_account">Créer un compte</string>
 	<string name="settings_menu_privacy_lists">Gérer mes listes privées</string>
 	<string name="settings_saved_ok">Les paramètres ont été enregistrés avec succès.</string>
@@ -242,6 +230,7 @@
 		ContactList Activity 
 	 -->
 	<string name="contact_list_menu_add_contact">Ajouter un contact</string>
+	<string name="contact_list_menu_status">Changer son status</string>
 	<string name="contact_list_menu_settings">Paramètres</string>
 	<string name="contact_list_menu_disconnect">Se déconnecter</string>
 	<string name="contact_list_all_contact">Tous les contacts</string>
--- a/res/values-ru/arrays.xml	Mon Jun 14 22:45:56 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-	<string-array name="proxy_types">
-		<item>HTTP</item>
-		<item>SOCKS4</item>
-		<item>SOCKS5</item>
-	</string-array>
-	<string-array name="status_types">
-		<item name="AvailableForChat">Готов пообщаться</item>
-		<item name="Available">Доступен</item>
-		<item name="Busy">Занят</item>
-		<item name="Away">Oтсутствии</item>
-		<item name="Unavailable">Недоступен</item>
-		<item name="Disconnected">Не в сети</item>
-	</string-array>
-	<string-array name="privacy_list_select_dialog">
-		<item name="@string/privacy_list_select_dialog_buddies">Собеседники</item>
-		<item name="@string/privacy_list_select_dialog_groups">Groups</item>
-		<item name="@string/privacy_list_select_dialog_delete">Delete</item>
-	</string-array>
-	<string-array name="loganim_state">
-		<item name="@string/loganim_connecting">Соединение...</item>
-		<item name="@string/loganim_authenticating">Аутентификация...</item>
-		<item name="@string/loganim_login_success">Логин успешной</item>
-		<item name="@string/loganim_login_failed">Не удалось войти в сеть</item>
-	</string-array>
-</resources>
--- a/res/values-ru/strings.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/values-ru/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -21,22 +21,6 @@
 <string name="BeemServiceCreated"></string>
 <string name="BeemServiceDestroyed"></string>
 
-<!--  Preferences informations -->
-<string name="PreferenceStatus">Статус</string>
-<string name="PreferenceStatusText"></string>
-<string name="PreferenceIsConfigured">preference_is_configured
-</string>
-
-<!-- ContactListSettings class -->
-<string name="CLSServerConnection">Соединение</string>
-<string name="CLSUserid">Имя пользователя:</string>
-<string name="CLSPassword">Пароль:</string>
-<string name="CLSService">Сервер:</string>
-<string name="CLSHostPort">Порт:</string>
-<string name="CLSProxyInfo">Прокси</string>
-<string name="CLSLogin">Имя пользователя:</string>
-<string name="CLSOkButton">ОК</string>
-
 <!--  ContactDialog class -->
 <string name="CDChat">Написать</string>
 <string name="CDCall">Повонить</string>
@@ -125,8 +109,8 @@
 <string name="away_message_sum"></string>
 <string name="away_message_hint"></string>
 <string name="notification_preferences">Настройка оповещений</string>
-<string name="notification_disable_vibrate_title">Вибрация</string>
-<string name="notification_disable_vibrate_sum">Отключить вибрировать на входящие сообщения</string>
+<string name="notification_enable_vibrate_title">Вибрация</string>
+<string name="notification_enable_vibrate_sum">Активировать вибрировать на входящие сообщения</string>
 <string name="notification_snd_title">Сигнал сообщений</string>
 <string name="notification_snd_sum"></string>
 
@@ -138,9 +122,6 @@
 <string name="SubscriptText"></string>
 <string name="SubscriptTitle"></string>
 
-<!-- ContactList class -->
-<string name="ConListNotConnected">Не подключен</string>
-
 <!--  BeemChatManager -->
 <string name="BeemChatManagerNewMessage">Пришло новое сообщение</string>
 
@@ -162,9 +143,6 @@
 <string name="user_info_name">Информация о пользователе</string>
 
 <!-- Buttons -->
-<string name="button_reset">Очистить</string>
-<string name="button_login">Войти</string>
-<string name="button_save">Сохранить</string>
 <string name="button_create_account"></string>
 <string name="button_create_login_account"></string>
 
@@ -185,13 +163,18 @@
 <string name="login_settings_button">Настройки</string>
 <string name="login_login_button">Войти</string>
 <string name="login_login_progress">Соединяемся, подождите немного...</string>
-<string name="login_max_retry"></string>
 <string name="login_error_msg">Unfortunately, an error occured.\n\nError
 detail:\n%s</string>
 <string name="login_menu_login">Войти</string>
 <string name="login_no_connectivity"></string>
 <string name="login_start_msg"></string>
 
+<!-- LoginAnim activity -->
+<string name="loganim_connecting">Соединение ...</string>
+<string name="loganim_authenticating">Аутентификация ...</string>
+<string name="loganim_login_success">Логин успешной</string>
+<string name="loganim_login_failed">Не удалось войти в сеть</string>
+
 <!-- EditSettings Activity -->
 <string name="settings_menu_create_account">Создать аккаунт</string>
 <string name="settings_menu_privacy_lists">Настроить списки приватности</string>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/res/values-zh-rCN/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+	<!-- Generic terms -->
+	<string name="app_name">Beem</string>
+	<string name="OkButton">确定</string>
+	<string name="ClearButton">清除</string>
+	<string name="CancelButton">取消</string>
+	<string name="AcceptButton">认证</string>
+	<string name="RefuseButton">拒绝</string>
+	<string name="JabberID">Jabber账号 </string>
+	<string name="Password">密码</string>
+
+	<!--  Beem class -->
+	<string name="BeemJabberID">Jabber账号 </string>
+
+	<!--  BeemApplication class -->
+	<string name="BeemApplicationConnect">连接中...</string>
+
+	<!--  BeemService class -->
+	<string name="BeemServiceDescription">使用Beem服务</string>
+	<string name="BeemServiceCreated">Beem服务已创建</string>
+	<string name="BeemServiceDestroyed">Beem服务已取消</string>
+
+	<!--  ContactDialog class -->
+	<string name="CDChat">聊天</string>
+	<string name="CDCall">呼叫</string>
+	<string name="CDInfos">用户管理</string>
+
+	<!-- AddContact class -->
+	<string name="AddCActTitle">Beem - 添加连接</string>
+
+	<string name="AddCLogin">用户名</string>
+	<string name="AddCAlias">别名</string>
+	<string name="AddCGroup">组</string>
+	<string name="AddCOkButton">添加</string>
+	<string name="AddCContactAdded">联系人已成功添加</string>
+	<string name="AddCContactAddedError">联系人添加错误</string>
+	<string name="AddCContactAddedLoginError">登录错误</string>
+	<string name="AddCBadForm">格式错误</string>
+	<string name="AddCContactAlready">联系人已存在</string>
+
+	<!--  ChangeStatus class -->
+	<string name="ChangeStatusActTitle">Beem - 改变我的状态</string>
+	<string name="ChangeStatusType">我的状态</string>
+	<string name="ChangeStatusMessage">我的个人消息</string>
+	<string name="OpenContactList">打开联系人列表</string>
+	
+	<string name="MenuAddContact">添加心联系人</string>
+	<string name="MenuAccountAbout">Beem项目</string>
+	<string name="MenuAccountCreate">创建账号</string>
+	<string name="MenuConnection">编辑账号</string>
+	<string name="ChangeStatusOk">更新状态</string>
+	<string name="ChangeStatusNoChange">没有东西需要改变</string>
+
+	<!-- Settings class -->
+	<string name="SettingsText">修改用户名</string>
+	<string name="SettingsPassword">修改密码</string>
+	<string name="SettingsProxy">代理</string>
+	<string name="SettingsProxyProxy">使用代理服务器</string>
+	<string name="SettingsProxySummary">通过代理服务器登录</string>
+	<string name="SettingsProxyType">协议</string>
+	<string name="SettingsProxyTypeSummary">选择代理类型</string>
+	<string name="SettingsProxyServer">修改代理服务器地址</string>
+	<string name="SettingsProxyPort">修改地理服务器端口</string>
+	<string name="SettingsProxyUser">可选,允许在代理服务器上注册</string>
+	<string name="SettingsProxyPassword">可选,允许在代理服务器上注册</string>
+	<string name="SettingsAdvanced">高级</string>
+	<string name="SettingsAdvancedOptions">特定服务器选项</string>
+	<string name="SettingsAdvancedRecoDelay">修改重连延时</string>
+	<string name="SettingsAdvancedSpecOpt">勾选此选项以连接到特定的服务器.</string>
+	<string name="SettingsAdvancedAddOpt">编辑服务器地址</string>
+	<string name="SettingsAdvancedPortOpt">编辑服务器端口</string>
+	<string name="SettingsResourceTitle">资源</string>
+	<string name="SettingsPriorityTitle">优先级</string>
+	<string name="SettingsResourceSummary">设定客户端XMPP资源</string>
+	<string name="SettingsPrioritySummary">设定客户端优先级</string>
+	<string name="contact_list_preferences">好友列表</string>
+	<string name="contact_list_preferences_sum">好友列表显示选项
+	</string>
+	<string name="CLP_hide_groups">隐藏组</string>	
+	<string name="CLP_hide_groups_sum">勾选此选项隐藏组</string>
+	<string name="CLP_hidden_contact">隐藏好友</string>
+	<string name="CLP_hidden_contact_sum">勾选此选项隐藏未登录好友
+	</string>
+	<string name="settings_account_username">用户名</string>
+	<string name="login_username_info_default">beem@beem-project.com</string>
+	<string name="settings_account_password">密码</string>
+	<string name="settings_account_server">服务器</string>
+	<string name="settings_account_port">端口</string>
+	<string name="settings_advanced_service_behaviour">服务器行为</string>
+	<string name="settings_advanced_sum">高级用户设置</string>
+	<string name="settings_xmpp_server">地址</string>
+	<string name="comments_xmpp_server">example.com</string>
+	<string name="settings_xmpp_port">端口</string>
+	<string name="settings_xmpp_use_tls">使用SSL/TLS</string>
+	<string name="settings_reco_delay">重连延时</string>
+	<string name="comments_xmpp_port">默认端口:5222</string>
+	<string name="settings_proxy_sum">代理设置</string>
+	<string name="settings_proxy_use">使用代理连接</string>
+	<string name="settings_proxy_type_prompt">选择代理类型</string>
+	<string name="settings_proxy_server">服务器</string>
+	<string name="settings_proxy_port">端口</string>
+	<string name="comments_proxy_port">默认端口:1080</string>
+	<string name="settings_proxy_username">用户名</string>
+	<string name="settings_proxy_password">密码</string>
+	<string name="away_chk_title">启用自动离开</string>
+	<string name="away_chk_sum">当屏幕关闭是将状态改为离开</string>
+	<string name="away_message_title">离开留言</string>
+	<string name="away_message_sum">将会显示的离开留言</string>
+	<string name="away_message_hint">我现在不在,我的手机屏幕关闭了</string>
+	<string name="notification_preferences">通知设置</string>
+	<string name="notification_disable_vibrate_title">振动</string>
+	<string name="notification_disable_vibrate_sum">取消接收消息振动</string>
+	<string name="notification_snd_title">消息提示音</string>
+	<string name="notification_snd_sum">设定消息提示音</string>
+
+	
+	<!-- Subscription class -->
+	<string name="SubscriptAccept">订阅已经接受</string>
+	<string name="SubscriptError">订阅错误</string>
+	<string name="SubscriptRefused">订阅被拒绝</string>
+	<string name="SubscriptText">%s 想要添加你到他/她的好友列表.批准他/她的请求吗?</string>
+	<string name="SubscriptTitle">批准好友请求?</string>
+
+	<!--  BeemChatManager -->
+	<string name="BeemChatManagerNewMessage">你有一个新消息</string>
+
+	<!--  BeemBroadcastReceiver class -->
+	<string name="BeemBroadcastReceiverDisconnect">BEEM:你的连接已断开</string>
+
+	<!--  XmppConnectionAdapter class -->
+	<string name="AcceptContactRequest">%s刚将你添加到他/她的好友列表.</string>
+	<string name="AcceptContactRequestFrom">批准%s联系你</string>
+
+	<!-- Activities -->
+	<string name="login_tag">Beem - 登录中</string>
+	<string name="edit_settings_name">Beem - 设置</string>
+	<string name="edit_settings_tag">Beem - 编制设置</string>
+	<string name="create_account_name">Beem - 创建新账号 </string>
+	<string name="create_account_tag">Beem - 创建新账号中</string>
+	<string name="contact_list_name">Beem - 联系人</string>
+	<string name="contact_list_tag">Beem - 联系人列表</string>
+	<string name="user_info_name">Beem - 用户信息</string>
+
+	<!-- Buttons -->
+	<string name="button_create_account">创建这个账户</string>
+	<string name="button_create_login_account">创建并使用这个账户</string>
+
+	<!-- LogAs Activity -->
+	<string name="login_username">用户名</string>
+	<string name="login_password">密码</string>
+	<string name="login_error_dialog_title">登录 - 错误</string>
+	<string name="login_close_dialog_button">关闭</string>
+	<string name="login_menu_create_account">创建一个账号</string>
+	<string name="login_menu_settings">设置</string>
+	<string name="login_menu_about">关于</string>
+	<string name="login_about_title">Beem %s - 关于</string>
+	<string name="login_about_msg">
+		Beem是一个欧洲理工学院的创新项目.访问我们的网站
+		http://www.beem-project.com !
+	</string>
+	<string name="login_about_button">关闭</string>
+	<string name="login_settings_button">设置</string>
+	<string name="login_login_button">登录</string>
+	<string name="login_login_progress">连接中,请等待...</string>
+	<string name="login_error_msg">很遗憾,发生一个错误.\n\nE错误
+		详情:\n%s</string>
+	<string name="login_menu_login">登陆</string>
+	<string name="login_no_connectivity">没有可用连接</string>
+	<string name="login_start_msg">菜单设置配置</string>
+
+	<!-- EditSettings Activity -->
+	<string name="settings_menu_create_account">创建一个账号</string>
+	<string name="settings_menu_privacy_lists">管理隐私列表</string>
+	<string name="settings_saved_ok">设置已成功保存</string>
+
+
+
+	<!-- EditSettings Activity Categories -->
+	<string name="general_preferences">通用选项</string>
+	<string name="user_preferences">用户设置 (必须)</string>
+	<string name="user_preferences_advanced">高级用户设置(可选)</string>
+	<string name="network_preferences">网络选项</string>
+	<string name="proxy_proxy_settings">代理选项</string>
+	<string name="proxy_user_settings">代理选项</string>
+
+	<!-- EditSettings Activity Tabs -->
+	<string name="settings_tab_tag_account">edit_settings_tab_account</string>
+	<string name="settings_tab_label_account">帐户</string>
+	<string name="settings_tab_tag_xmpp">edit_settings_tab_xmpp</string>
+	<string name="settings_tab_label_xmpp">XMPP</string>
+	<string name="settings_tab_tag_proxy">edit_settings_tab_proxy</string>
+	<string name="settings_tab_label_proxy">代理</string>
+
+
+	<!-- wizard activities -->
+	<string name="account_wizard_text1"><b>欢迎使用BEEM.</b>\n\n您还没有设定XMPP (Jabber)账户.请选择下面的选项。\n请选择下面的选项:</string>
+	<string name="account_wizard_configure_text"><b>请输入您已有账号的信息</b></string>
+	<string name="account_wizard_configure_account">我想使用我已有的账号</string>
+	<string name="account_wizard_create_account">我想创建一个新账号</string>
+
+	<!-- Create an account Activity -->
+	<string name="create_account_instr_dialog_title">创建新账号 - 向导</string>
+	<string name="create_account_err_dialog_title">创建新账号 - 错误</string>
+	<string name="create_account_err_dialog_settings_button">修改设置</string>
+	<string name="create_account_close_dialog_button">关闭</string>
+	<string name="create_account_successfull_after">账号%s已成功创建</string>
+	<string name="create_account_err_username">错误的Jabber ID</string>
+	<string name="create_account_err_passwords">密码不匹配。</string>
+	<string name="create_account_username">用户名</string>
+	<string name="create_account_password">密码</string>
+	<string name="create_account_confirm_password">确认密码</string>
+
+	<!-- ContactList Activity  -->
+	<string name="contact_list_menu_add_contact">添加联系人</string>
+	<string name="contact_list_menu_settings">设置</string>
+	<string name="contact_list_menu_disconnect">断开连接</string>
+	<string name="contact_list_all_contact">所有联系人</string>
+	<string name="contact_list_no_group">没有组</string>
+
+	<!-- UserInfo dialog -->
+	<string name="userinfo_label_alias">别名</string>
+	<string name="userinfo_label_chg_group">管理组</string>
+	<string name="userinfo_label_re_subscription">重新发送邀请</string>
+	<string name="userinfo_label_block">阻止</string>
+	<string name="userinfo_label_delete">删除</string>
+	<string name="userinfo_resend">重新发送订阅</string>
+	<string name="userinfo_sure2delete">确定删除该联系人?
+	</string>
+	<string name="userinfo_yes">是</string>
+	<string name="userinfo_no">否</string>
+	<string name="userinfo_sureresend">确定要重新发送邀请吗?</string>
+
+	<string name="chat_name">Beem - 聊天</string>
+	<string name="chat_input_default_value">输入信息</string>
+	<string name="chat_self">我</string>
+	<string name="chat_error">错误</string>
+	<string name="chat_send_message">发送</string>
+	<string name="chat_menu_contacts_list">联系人列表</string>
+	<string name="chat_menu_change_chat">切换聊天窗口</string>
+	<string name="chat_dialog_change_chat_title">打开聊天窗口</string>
+	<string name="chat_menu_close_chat">关闭聊天窗口</string>
+	<string name="chat_no_more_chats">没有活动的聊天窗口</string>
+	<string name="chat_state_composing">正在输入信息</string>
+	<string name="chat_state_gone">已经离开了会话</string>
+	<string name="chat_state_active">关注会话</string>
+	<string name="chat_state_inactive">正在做其他事情</string>
+
+	<string name="contact_status_msg_available">我有空</string>
+	<string name="contact_status_msg_available_chat">我有空聊天</string>
+	<string name="contact_status_msg_dnd">请勿打扰</string>
+	<string name="contact_status_msg_away">离开</string>
+	<string name="contact_status_msg_xa">没有空</string>
+	<string name="contact_status_msg_offline">连接已断开</string>
+
+	<string name="privacy_list_name">Beem - 管理我的隐私列表</string>
+	<string name="privacy_list_no_data">没有隐私列表</string>
+	<string name="privacy_list_menu_create">创建隐私列表</string>
+	<string name="privacy_list_create_dialog_title">创建隐私列表</string>
+	<string name="privacy_list_create_dialog_list_name_label">标题</string>
+	<string name="privacy_list_create_dialog_create_button">创建</string>
+	<string name="privacy_list_select_dialog_buddies">好友</string>
+	<string name="privacy_list_select_dialog_groups">组</string>
+	<string name="privacy_list_select_dialog_delete">删除</string>
+	<string name="privacy_list_delete_dialog_msg">确定要删除 \'%s\'隐私列表吗 ?</string>
+	<string name="privacy_list_delete_dialog_yes">是</string>
+	<string name="privacy_list_delete_dialog_no">否</string>
+
+	<string name="UpdateButton">更新</string>
+	
+	<!-- Error messages -->
+	
+	<string name="error_login_authentication">验证时发生错误,用户名或者密码错误.</string>
+	
+	<string name="interna_server_error">远程服务器错误</string>
+	<string name="bad_request">bad-request</string>
+	<string name="forbidden">被拒绝</string>
+	<string name="item_not_found">item-not-found</string>
+	<string name="conflict">冲突</string>
+	<string name="feature_not_implemented">feature-not-implemented</string>
+	<string name="gone">离开</string>
+	<string name="jid_malformed">jid-malformed</string>
+	<string name="no_acceptable">no-acceptable</string>
+	<string name="not_allowed">not-allowed</string>
+	<string name="not_authorized">not-authorized</string>
+	<string name="payment_required">payment-required</string>
+	<string name="recipient_unavailable">recipient-unavailable</string>
+	<string name="redirect">redirect</string>
+	<string name="registration_required">registration-required</string>
+	<string name="remote_server_not_found">未发现远程服务器</string>
+	<string name="remote_server_timeout">远程服务器未响应</string>
+	<string name="remote_server_error">远程服务器错误</string>
+	<string name="resource_constraint">resource-constraint</string>
+	<string name="service_unavailable">service-unavailable</string>
+	<string name="subscription_required">subscription-required</string>
+	<string name="undefined_condition">undefined-condition</string>
+	<string name="unexpected_condition">unexpected-condition</string>
+	<string name="request_timeout">request-timeout</string>
+</resources>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/res/values-zh-rTW/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+	<!-- Generic terms -->
+	<string name="app_name">Beem</string>
+	<string name="OkButton">確定</string>
+	<string name="ClearButton">清除</string>
+	<string name="CancelButton">取消</string>
+	<string name="AcceptButton">認證</string>
+	<string name="RefuseButton">拒絕</string>
+	<string name="JabberID">Jabber賬號 </string>
+	<string name="Password">密碼</string>
+
+	<!--  Beem class -->
+	<string name="BeemJabberID">Jabber賬號 </string>
+
+	<!--  BeemApplication class -->
+	<string name="BeemApplicationConnect">連接中...</string>
+
+	<!--  BeemService class -->
+	<string name="BeemServiceDescription">使用Beem服務</string>
+	<string name="BeemServiceCreated">Beem服務已建立</string>
+	<string name="BeemServiceDestroyed">Beem服務已取消</string>
+
+	<!--  ContactDialog class -->
+	<string name="CDChat">聊天</string>
+	<string name="CDCall">呼叫</string>
+	<string name="CDInfos">使用者管理</string>
+
+	<!-- AddContact class -->
+	<string name="AddCActTitle">Beem - 新增連接</string>
+
+	<string name="AddCLogin">使用者名</string>
+	<string name="AddCAlias">別名</string>
+	<string name="AddCGroup">組</string>
+	<string name="AddCOkButton">新增</string>
+	<string name="AddCContactAdded">聯繫人已成功新增</string>
+	<string name="AddCContactAddedError">聯繫人新增錯誤</string>
+	<string name="AddCContactAddedLoginError">登入錯誤</string>
+	<string name="AddCBadForm">格式錯誤</string>
+	<string name="AddCContactAlready">聯繫人已存在</string>
+
+	<!--  ChangeStatus class -->
+	<string name="ChangeStatusActTitle">Beem - 改變我的狀態</string>
+	<string name="ChangeStatusType">我的狀態</string>
+	<string name="ChangeStatusMessage">我的個人訊息</string>
+	<string name="OpenContactList">開啟聯繫人清單</string>
+	
+	<string name="MenuAddContact">新增心聯繫人</string>
+	<string name="MenuAccountAbout">Beem項目</string>
+	<string name="MenuAccountCreate">建立賬號</string>
+	<string name="MenuConnection">編輯賬號</string>
+	<string name="ChangeStatusOk">更新狀態</string>
+	<string name="ChangeStatusNoChange">沒有東西需要改變</string>
+
+	<!-- Settings class -->
+	<string name="SettingsText">修改使用者名</string>
+	<string name="SettingsPassword">修改密碼</string>
+	<string name="SettingsProxy">代理</string>
+	<string name="SettingsProxyProxy">使用代理伺服器</string>
+	<string name="SettingsProxySummary">通過代理伺服器登入</string>
+	<string name="SettingsProxyType">協議</string>
+	<string name="SettingsProxyTypeSummary">選取代理類型</string>
+	<string name="SettingsProxyServer">修改代理伺服器位址</string>
+	<string name="SettingsProxyPort">修改地理伺服器通訊埠</string>
+	<string name="SettingsProxyUser">可選,允許在代理伺服器上註冊</string>
+	<string name="SettingsProxyPassword">可選,允許在代理伺服器上註冊</string>
+	<string name="SettingsAdvanced">進階</string>
+	<string name="SettingsAdvancedOptions">特定伺服器選項</string>
+	<string name="SettingsAdvancedRecoDelay">修改重連延時</string>
+	<string name="SettingsAdvancedSpecOpt">勾選此選項以連接到特定的伺服器.</string>
+	<string name="SettingsAdvancedAddOpt">編輯伺服器位址</string>
+	<string name="SettingsAdvancedPortOpt">編輯伺服器通訊埠</string>
+	<string name="SettingsResourceTitle">資源</string>
+	<string name="SettingsPriorityTitle">優先級</string>
+	<string name="SettingsResourceSummary">設定用戶端XMPP資源</string>
+	<string name="SettingsPrioritySummary">設定用戶端優先級</string>
+	<string name="contact_list_preferences">好友清單</string>
+	<string name="contact_list_preferences_sum">好友清單顯示選項
+	</string>
+	<string name="CLP_hide_groups">隱藏組</string>	
+	<string name="CLP_hide_groups_sum">勾選此選項隱藏組</string>
+	<string name="CLP_hidden_contact">隱藏好友</string>
+	<string name="CLP_hidden_contact_sum">勾選此選項隱藏未登入好友
+	</string>
+	<string name="settings_account_username">使用者名</string>
+	<string name="login_username_info_default">beem@beem-project.com</string>
+	<string name="settings_account_password">密碼</string>
+	<string name="settings_account_server">伺服器</string>
+	<string name="settings_account_port">通訊埠</string>
+	<string name="settings_advanced_service_behaviour">伺服器行為</string>
+	<string name="settings_advanced_sum">進階使用者設定</string>
+	<string name="settings_xmpp_server">位址</string>
+	<string name="comments_xmpp_server">example.com</string>
+	<string name="settings_xmpp_port">通訊埠</string>
+	<string name="settings_xmpp_use_tls">使用SSL/TLS</string>
+	<string name="settings_reco_delay">重連延時</string>
+	<string name="comments_xmpp_port">預設通訊埠:5222</string>
+	<string name="settings_proxy_sum">代理設定</string>
+	<string name="settings_proxy_use">使用代理連接</string>
+	<string name="settings_proxy_type_prompt">選取代理類型</string>
+	<string name="settings_proxy_server">伺服器</string>
+	<string name="settings_proxy_port">通訊埠</string>
+	<string name="comments_proxy_port">預設通訊埠:1080</string>
+	<string name="settings_proxy_username">使用者名</string>
+	<string name="settings_proxy_password">密碼</string>
+	<string name="away_chk_title">啟用自動離開</string>
+	<string name="away_chk_sum">當屏幕關閉是將狀態改為離開</string>
+	<string name="away_message_title">離開留言</string>
+	<string name="away_message_sum">將會顯示的離開留言</string>
+	<string name="away_message_hint">我現在不在,我的手機屏幕關閉了</string>
+	<string name="notification_preferences">通知設定</string>
+	<string name="notification_disable_vibrate_title">振動</string>
+	<string name="notification_disable_vibrate_sum">取消接收訊息振動</string>
+	<string name="notification_snd_title">訊息提示音</string>
+	<string name="notification_snd_sum">設定訊息提示音</string>
+
+	
+	<!-- Subscription class -->
+	<string name="SubscriptAccept">訂閱已經接受</string>
+	<string name="SubscriptError">訂閱錯誤</string>
+	<string name="SubscriptRefused">訂閱被拒絕</string>
+	<string name="SubscriptText">%s 想要新增你到他/她的好友清單.批准他/她的要求嗎?</string>
+	<string name="SubscriptTitle">批准好友要求?</string>
+
+	<!--  BeemChatManager -->
+	<string name="BeemChatManagerNewMessage">你有一個新訊息</string>
+
+	<!--  BeemBroadcastReceiver class -->
+	<string name="BeemBroadcastReceiverDisconnect">BEEM:你的連接已中斷</string>
+
+	<!--  XmppConnectionAdapter class -->
+	<string name="AcceptContactRequest">%s剛將你新增到他/她的好友清單.</string>
+	<string name="AcceptContactRequestFrom">批准%s聯繫你</string>
+
+	<!-- Activities -->
+	<string name="login_tag">Beem - 登入中</string>
+	<string name="edit_settings_name">Beem - 設定</string>
+	<string name="edit_settings_tag">Beem - 編製設定</string>
+	<string name="create_account_name">Beem - 建立新賬號 </string>
+	<string name="create_account_tag">Beem - 建立新賬號中</string>
+	<string name="contact_list_name">Beem - 聯繫人</string>
+	<string name="contact_list_tag">Beem - 聯繫人清單</string>
+	<string name="user_info_name">Beem - 使用者訊息</string>
+
+	<!-- Buttons -->
+	<string name="button_create_account">建立這個賬戶</string>
+	<string name="button_create_login_account">建立並使用這個賬戶</string>
+
+	<!-- LogAs Activity -->
+	<string name="login_username">使用者名</string>
+	<string name="login_password">密碼</string>
+	<string name="login_error_dialog_title">登入 - 錯誤</string>
+	<string name="login_close_dialog_button">關閉</string>
+	<string name="login_menu_create_account">建立一個賬號</string>
+	<string name="login_menu_settings">設定</string>
+	<string name="login_menu_about">關於</string>
+	<string name="login_about_title">Beem %s - 關於</string>
+	<string name="login_about_msg">
+		Beem是一個歐洲理工學院的創新項目.存取我們的網站
+		http://www.beem-project.com !
+	</string>
+	<string name="login_about_button">關閉</string>
+	<string name="login_settings_button">設定</string>
+	<string name="login_login_button">登入</string>
+	<string name="login_login_progress">連接中,請等待...</string>
+	<string name="login_error_msg">很遺憾,發生一個錯誤.\n\nE錯誤
+		詳情:\n%s</string>
+	<string name="login_menu_login">登陸</string>
+	<string name="login_no_connectivity">沒有可用連接</string>
+	<string name="login_start_msg">選單設定設定</string>
+
+	<!-- EditSettings Activity -->
+	<string name="settings_menu_create_account">建立一個賬號</string>
+	<string name="settings_menu_privacy_lists">管理隱私清單</string>
+	<string name="settings_saved_ok">設定已成功儲存</string>
+
+
+
+	<!-- EditSettings Activity Categories -->
+	<string name="general_preferences">通用選項</string>
+	<string name="user_preferences">使用者設定 (必須)</string>
+	<string name="user_preferences_advanced">進階使用者設定(可選)</string>
+	<string name="network_preferences">網路選項</string>
+	<string name="proxy_proxy_settings">代理選項</string>
+	<string name="proxy_user_settings">代理選項</string>
+
+	<!-- EditSettings Activity Tabs -->
+	<string name="settings_tab_tag_account">edit_settings_tab_account</string>
+	<string name="settings_tab_label_account">帳戶</string>
+	<string name="settings_tab_tag_xmpp">edit_settings_tab_xmpp</string>
+	<string name="settings_tab_label_xmpp">XMPP</string>
+	<string name="settings_tab_tag_proxy">edit_settings_tab_proxy</string>
+	<string name="settings_tab_label_proxy">代理</string>
+
+
+	<!-- wizard activities -->
+	<string name="account_wizard_text1"><b>歡迎使用BEEM.</b>\n\n您還沒有設定XMPP (Jabber)賬戶.請選取下面的選項。\n請選取下面的選項:</string>
+	<string name="account_wizard_configure_text"><b>請輸入您已有賬號的訊息</b></string>
+	<string name="account_wizard_configure_account">我想使用我已有的賬號</string>
+	<string name="account_wizard_create_account">我想建立一個新賬號</string>
+
+	<!-- Create an account Activity -->
+	<string name="create_account_instr_dialog_title">建立新賬號 - 嚮導</string>
+	<string name="create_account_err_dialog_title">建立新賬號 - 錯誤</string>
+	<string name="create_account_err_dialog_settings_button">修改設定</string>
+	<string name="create_account_close_dialog_button">關閉</string>
+	<string name="create_account_successfull_after">賬號%s已成功建立</string>
+	<string name="create_account_err_username">錯誤的Jabber ID</string>
+	<string name="create_account_err_passwords">密碼不符合。</string>
+	<string name="create_account_username">使用者名</string>
+	<string name="create_account_password">密碼</string>
+	<string name="create_account_confirm_password">確認密碼</string>
+
+	<!-- ContactList Activity  -->
+	<string name="contact_list_menu_add_contact">新增聯繫人</string>
+	<string name="contact_list_menu_settings">設定</string>
+	<string name="contact_list_menu_disconnect">中斷連接</string>
+	<string name="contact_list_all_contact">所有聯繫人</string>
+	<string name="contact_list_no_group">沒有組</string>
+
+	<!-- UserInfo dialog -->
+	<string name="userinfo_label_alias">別名</string>
+	<string name="userinfo_label_chg_group">管理組</string>
+	<string name="userinfo_label_re_subscription">重新傳送邀請</string>
+	<string name="userinfo_label_block">阻止</string>
+	<string name="userinfo_label_delete">刪除</string>
+	<string name="userinfo_resend">重新傳送訂閱</string>
+	<string name="userinfo_sure2delete">確定刪除該聯繫人?
+	</string>
+	<string name="userinfo_yes">是</string>
+	<string name="userinfo_no">否</string>
+	<string name="userinfo_sureresend">確定要重新傳送邀請嗎?</string>
+
+	<string name="chat_name">Beem - 聊天</string>
+	<string name="chat_input_default_value">輸入訊息</string>
+	<string name="chat_self">我</string>
+	<string name="chat_error">錯誤</string>
+	<string name="chat_send_message">傳送</string>
+	<string name="chat_menu_contacts_list">聯繫人清單</string>
+	<string name="chat_menu_change_chat">切換聊天視窗</string>
+	<string name="chat_dialog_change_chat_title">開啟聊天視窗</string>
+	<string name="chat_menu_close_chat">關閉聊天視窗</string>
+	<string name="chat_no_more_chats">沒有活動的聊天視窗</string>
+	<string name="chat_state_composing">正在輸入訊息</string>
+	<string name="chat_state_gone">已經離開了會話</string>
+	<string name="chat_state_active">關注會話</string>
+	<string name="chat_state_inactive">正在做其他事情</string>
+
+	<string name="contact_status_msg_available">我有空</string>
+	<string name="contact_status_msg_available_chat">我有空聊天</string>
+	<string name="contact_status_msg_dnd">請勿打擾</string>
+	<string name="contact_status_msg_away">離開</string>
+	<string name="contact_status_msg_xa">沒有空</string>
+	<string name="contact_status_msg_offline">連接已中斷</string>
+
+	<string name="privacy_list_name">Beem - 管理我的隱私清單</string>
+	<string name="privacy_list_no_data">沒有隱私清單</string>
+	<string name="privacy_list_menu_create">建立隱私清單</string>
+	<string name="privacy_list_create_dialog_title">建立隱私清單</string>
+	<string name="privacy_list_create_dialog_list_name_label">標題</string>
+	<string name="privacy_list_create_dialog_create_button">建立</string>
+	<string name="privacy_list_select_dialog_buddies">好友</string>
+	<string name="privacy_list_select_dialog_groups">組</string>
+	<string name="privacy_list_select_dialog_delete">刪除</string>
+	<string name="privacy_list_delete_dialog_msg">確定要刪除 \'%s\'隱私清單嗎 ?</string>
+	<string name="privacy_list_delete_dialog_yes">是</string>
+	<string name="privacy_list_delete_dialog_no">否</string>
+
+	<string name="UpdateButton">更新</string>
+	
+	<!-- Error messages -->
+	
+	<string name="error_login_authentication">驗證時發生錯誤,使用者名或者密碼錯誤.</string>
+	
+	<string name="interna_server_error">遠端伺服器錯誤</string>
+	<string name="bad_request">bad-request</string>
+	<string name="forbidden">被拒絕</string>
+	<string name="item_not_found">item-not-found</string>
+	<string name="conflict">衝突</string>
+	<string name="feature_not_implemented">feature-not-implemented</string>
+	<string name="gone">離開</string>
+	<string name="jid_malformed">jid-malformed</string>
+	<string name="no_acceptable">no-acceptable</string>
+	<string name="not_allowed">not-allowed</string>
+	<string name="not_authorized">not-authorized</string>
+	<string name="payment_required">payment-required</string>
+	<string name="recipient_unavailable">recipient-unavailable</string>
+	<string name="redirect">redirect</string>
+	<string name="registration_required">registration-required</string>
+	<string name="remote_server_not_found">未發現遠端伺服器</string>
+	<string name="remote_server_timeout">遠端伺服器未響應</string>
+	<string name="remote_server_error">遠端伺服器錯誤</string>
+	<string name="resource_constraint">resource-constraint</string>
+	<string name="service_unavailable">service-unavailable</string>
+	<string name="subscription_required">subscription-required</string>
+	<string name="undefined_condition">undefined-condition</string>
+	<string name="unexpected_condition">unexpected-condition</string>
+	<string name="request_timeout">request-timeout</string>
+</resources>
--- a/res/values/arrays.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/values/arrays.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -6,12 +6,12 @@
 		<item>SOCKS5</item>
 	</string-array>
 	<string-array name="status_types">
-		<item name="AvailableForChat">Available to chat</item>
-		<item name="Available">Available</item>
-		<item name="Busy">Busy</item>
-		<item name="Away">Away</item>
-		<item name="Unavailable">Unavailable</item>
-		<item name="Disconnected">Disconnected</item>
+		<item name="AvailableForChat">@string/contact_status_msg_available_chat</item>
+		<item name="Available">@string/contact_status_msg_available</item>
+		<item name="Busy">@string/contact_status_msg_dnd</item>
+		<item name="Away">@string/contact_status_msg_away</item>
+		<item name="Unavailable">@string/contact_status_msg_xa</item>
+		<item name="Disconnected">@string/contact_status_msg_offline</item>
 	</string-array>
 	<string-array name="privacy_list_select_dialog">
 		<item name="@string/privacy_list_select_dialog_buddies">Buddies</item>
@@ -19,9 +19,9 @@
 		<item name="@string/privacy_list_select_dialog_delete">Delete</item>
 	</string-array>
 	<string-array name="loganim_state">
-		<item name="@string/loganim_connecting">Connecting...</item>
-		<item name="@string/loganim_authenticating">Authenticating...</item>
-		<item name="@string/loganim_login_success">Login success</item>
-		<item name="@string/loganim_login_failed">Login failed</item>
+		<item>@string/loganim_connecting</item>
+		<item>@string/loganim_authenticating</item>
+		<item>@string/loganim_login_success</item>
+		<item>@string/loganim_login_failed</item>
 	</string-array>
 </resources>
--- a/res/values/strings.xml	Mon Jun 14 22:45:56 2010 +0200
+++ b/res/values/strings.xml	Mon Jun 14 22:47:22 2010 +0200
@@ -21,16 +21,6 @@
 	<string name="BeemServiceCreated">Beem Service Created</string>
 	<string name="BeemServiceDestroyed">Beem Service Destroyed</string>
 
-	<!-- ContactListSettings class -->
-	<string name="CLSServerConnection">Server connection</string>
-	<string name="CLSUserid">User id:</string>
-	<string name="CLSPassword">Password:</string>
-	<string name="CLSService">Service:</string>
-	<string name="CLSHostPort">Port:</string>
-	<string name="CLSProxyInfo">Proxy informations</string>
-	<string name="CLSLogin">Login:</string>
-	<string name="CLSOkButton">Ok</string>
-
 	<!--  ContactDialog class -->
 	<string name="CDChat">Chat</string>
 	<string name="CDCall">Call</string>
@@ -119,8 +109,8 @@
 	<string name="away_message_sum">The away message that will be displayed</string>
 	<string name="away_message_hint">I\'m away, my cellphone screen is off</string>
 	<string name="notification_preferences">Notification settings</string>
-	<string name="notification_disable_vibrate_title">Vibrate</string>
-	<string name="notification_disable_vibrate_sum">Disable vibrate on incoming messages</string>
+	<string name="notification_enable_vibrate_title">Enable vibrate</string>
+	<string name="notification_enable_vibrate_sum">Enable vibrate on incoming messages</string>
 	<string name="notification_snd_title">Message ringtone</string>
 	<string name="notification_snd_sum">Set your incoming message ringtone</string>
 
@@ -132,9 +122,6 @@
 	<string name="SubscriptText">%s wants to add you to his/her buddy list. Do you want to authorize him/her ?</string>
 	<string name="SubscriptTitle">Authorize buddy ?</string>
 
-	<!-- ContactList class -->
-	<string name="ConListNotConnected">Not connected</string>
-
 	<!--  BeemChatManager -->
 	<string name="BeemChatManagerNewMessage">You\'ve a new message</string>
 
@@ -156,9 +143,6 @@
 	<string name="user_info_name">Beem - User Info</string>
 
 	<!-- Buttons -->
-	<string name="button_reset">Reset</string>
-	<string name="button_login">Login</string>
-	<string name="button_save">Save</string>
 	<string name="button_create_account">Create this account</string>
 	<string name="button_create_login_account">Create and use this account</string>
 
@@ -179,13 +163,18 @@
 	<string name="login_settings_button">Settings</string>
 	<string name="login_login_button">Log in</string>
 	<string name="login_login_progress">Connecting. Please wait...</string>
-	<string name="login_max_retry">Max retry</string>
 	<string name="login_error_msg">Unfortunately, an error occured.\n\nError
 		detail:\n%s</string>
 	<string name="login_menu_login">Login</string>
 	<string name="login_no_connectivity">No internet connection found</string>
 	<string name="login_start_msg">Settings configuration in menu</string>
 
+	<!-- LoginAnim activity -->
+	<string name="loganim_connecting">Connecting ...</string>
+	<string name="loganim_authenticating">Authenticating ...</string>
+	<string name="loganim_login_success">Login success</string>
+	<string name="loganim_login_failed">Login failed</string>
+
 	<!-- EditSettings Activity -->
 	<string name="settings_menu_create_account">Create an account</string>
 	<string name="settings_menu_privacy_lists">Manage my privacy lists</string>
@@ -230,6 +219,7 @@
 
 	<!-- ContactList Activity  -->
 	<string name="contact_list_menu_add_contact">Add a contact</string>
+	<string name="contact_list_menu_status">Change status</string>
 	<string name="contact_list_menu_settings">Settings</string>
 	<string name="contact_list_menu_disconnect">Disconnect</string>
 	<string name="contact_list_all_contact">All contacts</string>
--- a/src/com/beem/project/beem/BeemApplication.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/BeemApplication.java	Mon Jun 14 22:47:22 2010 +0200
@@ -67,6 +67,23 @@
     public static final String STATUS_KEY = "status";
     /** Preference key for status message. */
     public static final String STATUS_TEXT_KEY = "status_text";
+    /** Preference key for the use of a proxy. */
+    public static final String PROXY_USE_KEY = "proxy_use";
+    /** Preference key for the type of proxy. */
+    public static final String PROXY_TYPE_KEY = "proxy_type";
+    /** Preference key for the proxy server. */
+    public static final String PROXY_SERVER_KEY = "proxy_server";
+    /** Preference key for the proxy port. */
+    public static final String PROXY_PORT_KEY = "proxy_port";
+    /** Preference key for the proxy username. */
+    public static final String PROXY_USERNAME_KEY = "proxy_username";
+    /** Preference key for the proxy password. */
+    public static final String PROXY_PASSWORD_KEY = "proxy_password";
+    /** Preference key for vibrate on notification. */
+    public static final String NOTIFICATION_VIBRATE_KEY = "notification_vibrate";
+    /** Preference key for notification sound. */
+    public static final String NOTIFICATION_SOUND_KEY = "notification_sound";
+
     //TODO add the other one
 
     private boolean mIsConnected;
--- a/src/com/beem/project/beem/BeemService.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/BeemService.java	Mon Jun 14 22:47:22 2010 +0200
@@ -66,6 +66,7 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.net.ConnectivityManager;
+import android.net.Uri;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.preference.PreferenceManager;
@@ -79,7 +80,9 @@
 import com.beem.project.beem.utils.Status;
 
 /**
- * This class is for the Beem service. The connection to the xmpp server will be made asynchronously when the service
+ * This class is for the Beem service.
+ * It must contains every global informations needed to maintain the background service.
+ * The connection to the xmpp server will be made asynchronously when the service
  * will start.
  * @author darisk
  */
@@ -121,13 +124,13 @@
      * Initialize the connection.
      */
     private void initConnectionConfig() {
-	mUseProxy = mSettings.getBoolean("settings_key_proxy_use", false);
+	mUseProxy = mSettings.getBoolean(BeemApplication.PROXY_USE_KEY, false);
 	if (mUseProxy) {
-	    String stype = mSettings.getString("settings_key_proxy_type", "HTTP");
-	    String phost = mSettings.getString("settings_key_proxy_server", "");
-	    String puser = mSettings.getString("settings_key_proxy_username", "");
-	    String ppass = mSettings.getString("settings_key_proxy_password", "");
-	    int pport = Integer.parseInt(mSettings.getString("settings_key_proxy_port", "1080"));
+	    String stype = mSettings.getString(BeemApplication.PROXY_TYPE_KEY, "HTTP");
+	    String phost = mSettings.getString(BeemApplication.PROXY_SERVER_KEY, "");
+	    String puser = mSettings.getString(BeemApplication.PROXY_USERNAME_KEY, "");
+	    String ppass = mSettings.getString(BeemApplication.PROXY_PASSWORD_KEY, "");
+	    int pport = Integer.parseInt(mSettings.getString(BeemApplication.PROXY_PORT_KEY, "1080"));
 	    ProxyInfo.ProxyType type = ProxyType.valueOf(stype);
 	    mProxyInfo = new ProxyInfo(type, phost, pport, puser, ppass);
 	} else {
@@ -158,21 +161,16 @@
 	return mBind;
     }
 
-    /* (non-Javadoc)
-     * @see android.app.Service#onUnbind(android.content.Intent)
-     */
     @Override
     public boolean onUnbind(Intent intent) {
 	Log.d(TAG, "ONUNBIND()");
 	if (!mConnection.getAdaptee().isConnected()) {
-	    Log.d(TAG, "DESTROYED");
 	    this.stopSelf();
 	}
 	return true;
     }
 
 
-
     /**
      * {@inheritDoc}
      */
@@ -222,7 +220,6 @@
     @Override
     public void onDestroy() {
 	super.onDestroy();
-	Log.d("Service", "onDestroy");
 	resetStatus();
 	mNotificationManager.cancelAll();
 	unregisterReceiver(mReceiver);
@@ -249,11 +246,16 @@
     }
 
     /**
-     * Show a notification.
+     * Show a notification using the preference of the user.
      * @param id the id of the notification.
      * @param notif the notification to show
      */
     public void sendNotification(int id, Notification notif) {
+	if (mSettings.getBoolean(BeemApplication.NOTIFICATION_VIBRATE_KEY, true))
+	    notif.defaults |= Notification.DEFAULT_VIBRATE;
+	notif.defaults |= Notification.DEFAULT_LIGHTS;
+	String ringtoneStr = mSettings.getString(BeemApplication.NOTIFICATION_SOUND_KEY, "");
+	notif.sound = Uri.parse(ringtoneStr);
 	mNotificationManager.notify(id, notif);
     }
 
@@ -298,6 +300,15 @@
     }
 
     /**
+     * Get the notification manager system service.
+     *
+     * @return the notification manager service.
+     */
+    public NotificationManager getNotificationManager() {
+	return mNotificationManager;
+    }
+
+    /**
      * A sort of patch from this thread: http://www.igniterealtime.org/community/thread/31118. Avoid ClassCastException
      * by bypassing the classloading shit of Smack.
      * @param pm The ProviderManager.
@@ -399,9 +410,6 @@
 	public BeemServicePreferenceListener() {
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
 	    if ("settings_away_chk".equals(key)) {
@@ -426,24 +434,23 @@
 	private int mOldMode;
 
 	/**
-	 * ctor.
+	 * Constructor.
 	 */
 	public BeemServiceBroadcastReceiver() {
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void onReceive(final Context context, final Intent intent) {
 	    String intentAction = intent.getAction();
 	    if (intentAction.equals(Intent.ACTION_SCREEN_OFF)) {
 		mOldMode = mConnection.getPreviousMode();
 		mOldStatus = mConnection.getPreviousStatus();
-		mConnection.changeStatus(Status.CONTACT_STATUS_AWAY,
-		    mSettings.getString("settings_away_message", "Away"));
+		if (mConnection.isAuthentificated())
+		    mConnection.changeStatus(Status.CONTACT_STATUS_AWAY,
+			    mSettings.getString("settings_away_message", "Away"));
 	    } else if (intentAction.equals(Intent.ACTION_SCREEN_ON)) {
-		mConnection.changeStatus(mOldMode, mOldStatus);
+		if (mConnection.isAuthentificated())
+		    mConnection.changeStatus(mOldMode, mOldStatus);
 	    }
 	}
     }
--- a/src/com/beem/project/beem/service/BeemChatManager.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/service/BeemChatManager.java	Mon Jun 14 22:47:22 2010 +0200
@@ -56,7 +56,6 @@
 import android.app.PendingIntent;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.net.Uri;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.preference.PreferenceManager;
@@ -75,8 +74,8 @@
  * @author darisk
  */
 public class BeemChatManager extends IChatManager.Stub {
-    /** Tag to use with log methods. */
-    public static final String TAG = "BeemChatManager";
+
+    private static final String TAG = "BeemChatManager";
     private final ChatManager mAdaptee;
     private final Map<String, ChatAdapter> mChats = new HashMap<String, ChatAdapter>();
     private final ChatListener mChatListener = new ChatListener();
@@ -95,9 +94,6 @@
 	mAdaptee.addChatListener(mChatListener);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void addChatCreationListener(IChatManagerListener listener) throws RemoteException {
 	if (listener != null)
@@ -259,7 +255,8 @@
 	 */
 	private PendingIntent makeChatIntent(IChat chat) {
 	    Intent chatIntent = new Intent(mService, com.beem.project.beem.ui.Chat.class);
-	    chatIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+	    chatIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP
+		    | Intent.FLAG_ACTIVITY_NEW_TASK);
 	    try {
 		chatIntent.setData(chat.getParticipant().toUri());
 	    } catch (RemoteException e) {
@@ -281,13 +278,9 @@
 		.getName();
 		Notification notification = new Notification(android.R.drawable.stat_notify_chat, tickerText, System
 		    .currentTimeMillis());
-		if (!pref.getBoolean("settings_notification_disable_vibrate", true))
-		    notification.defaults -= Notification.DEFAULT_VIBRATE;
 		notification.flags = Notification.FLAG_AUTO_CANCEL;
 		notification.setLatestEventInfo(mService, tickerText, mService
 		    .getString(R.string.BeemChatManagerNewMessage), makeChatIntent(chat));
-		String ringtoneStr = pref.getString("settings_notification_snd", "");
-		notification.sound = Uri.parse(ringtoneStr);
 		mService.sendNotification(chat.getParticipant().getJID().hashCode(), notification);
 	    } catch (RemoteException e) {
 		Log.e(TAG, e.getMessage());
--- a/src/com/beem/project/beem/service/Contact.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/service/Contact.java	Mon Jun 14 22:47:22 2010 +0200
@@ -79,20 +79,14 @@
 
     private int mID;
     private int mStatus;
-    private String mJID;
+    private final String mJID;
     private String mSelectedRes;
     private String mMsgState;
     private List<String> mRes;
-    private List<String> mGroups;
+    private final List<String> mGroups = new ArrayList<String>();
     private String mName;
 
     /**
-     * Constructor.
-     */
-    public Contact() {
-    }
-
-    /**
      * Construct a contact from a parcel.
      * @param in parcel to use for construction
      */
@@ -104,7 +98,6 @@
 	mName = in.readString();
 	mMsgState = in.readString();
 	mRes = new ArrayList<String>();
-	mGroups = new ArrayList<String>();
 	in.readStringList(mRes);
 	in.readStringList(mGroups);
     }
@@ -123,7 +116,6 @@
 	mSelectedRes = res;
 	if (!"".equals(res))
 	    mRes.add(res);
-	mGroups = new ArrayList<String>();
     }
 
     /**
@@ -143,7 +135,6 @@
 	String res = StringUtils.parseResource(enduri);
 	mSelectedRes = res;
 	mRes.add(res);
-	mGroups = new ArrayList<String>();
     }
 
     /**
@@ -283,7 +274,8 @@
      * @param groups the mGroups to set
      */
     public void setGroups(List<String> groups) {
-	this.mGroups = groups;
+	mGroups.clear();
+	mGroups.addAll(groups);
     }
 
     /**
@@ -295,14 +287,6 @@
     }
 
     /**
-     * Set the Jabber ID of the contact.
-     * @param jid the jabber ID to set
-     */
-    public void setJID(String jid) {
-	mJID = jid;
-    }
-
-    /**
      * Set the resource of the contact.
      * @param resource to set.
      */
@@ -365,7 +349,6 @@
     public void setStatus(PresenceAdapter presence) {
 	mStatus = presence.getStatus();
 	mMsgState = presence.getStatusText();
-
     }
 
     /**
@@ -423,4 +406,20 @@
 	    build.append('/').append(mSelectedRes);
 	return build.toString();
     }
+
+    @Override
+    public boolean equals(Object other) {
+	if (!(other instanceof Contact))
+	    return false;
+	if (other == this)
+	    return true;
+	Contact c = (Contact) other;
+	return c.getJID().equals(getJID());
+    }
+
+    @Override
+    public int hashCode() {
+	return mJID.hashCode();
+    }
+
 }
--- a/src/com/beem/project/beem/service/RosterAdapter.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/service/RosterAdapter.java	Mon Jun 14 22:47:22 2010 +0200
@@ -112,20 +112,6 @@
 	    Log.e(TAG, "Error while adding new contact", e);
 	    return null;
 	}
-	if (groups != null) {
-	    for (String groupStr : groups) {
-		RosterGroup group = mAdaptee.getGroup(groupStr);
-		if (group == null) {
-		    group = mAdaptee.createGroup(groupStr);
-		}
-		try {
-		    group.addEntry(contact);
-		} catch (XMPPException e) {
-		    e.printStackTrace();
-		    return null;
-		}
-	    }
-	}
 	return getContactFromRosterEntry(contact);
     }
 
@@ -147,11 +133,8 @@
      */
     @Override
     public void createGroup(String groupname) throws RemoteException {
-	try {
+	if (mAdaptee.getGroup(groupname) == null)
 	    mAdaptee.createGroup(groupname);
-	} catch (IllegalArgumentException e) {
-	    Log.v(TAG, "Error while creating group", e);
-	}
     }
 
     /**
@@ -170,17 +153,10 @@
     @Override
     public List<Contact> getContactList() throws RemoteException {
 	boolean add = true;
-	List<Contact> coList = new ArrayList<Contact>(mAdaptee.getEntries().size());
-	for (RosterEntry entry : mAdaptee.getEntries()) {
-	    for (Contact c : coList) {
-		if (c.getJID().equals(entry.getUser())) {
-		    add = false;
-		    break;
-		}
-	    }
-	    // Because getEntries return duplicated user.
-	    if (add)
-		coList.add(getContactFromRosterEntry(entry));
+	Collection<RosterEntry> list = mAdaptee.getEntries();
+	List<Contact> coList = new ArrayList<Contact>(list.size());
+	for (RosterEntry entry : list) {
+	    coList.add(getContactFromRosterEntry(entry));
 	}
 	return coList;
     }
@@ -335,7 +311,6 @@
 	 */
 	@Override
 	public void entriesDeleted(Collection<String> addresses) {
-	    Log.i(TAG, "Suppression de l'entry");
 	    final int n = mRemoteRosListeners.beginBroadcast();
 
 	    List<String> tab = new ArrayList<String>();
@@ -377,14 +352,13 @@
 	@Override
 	public void presenceChanged(Presence presence) {
 	    final int n = mRemoteRosListeners.beginBroadcast();
+	    Log.v(TAG, ">>> Presence changed for " + presence.getFrom());
 
 	    for (int i = 0; i < n; i++) {
 		IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
 		try {
-		    Log.d(TAG, ">>> Presence changed.");
 		    if (presence.getStatus() == null || "".equals(presence.getStatus())) {
 			presence.setStatus(mDefaultStatusMessages.get(Status.getStatusFromPresence(presence)));
-			Log.d(TAG, ">>> Default status added.");
 		    }
 		    listener.onPresenceChanged(new PresenceAdapter(presence));
 		} catch (RemoteException e) {
--- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Mon Jun 14 22:47:22 2010 +0200
@@ -61,10 +61,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.net.Uri;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
-import android.preference.PreferenceManager;
 import android.util.Log;
 
 import com.beem.project.beem.BeemService;
@@ -204,6 +202,8 @@
     public boolean login() throws RemoteException {
 	if (mAdaptee.isAuthenticated())
 	    return true;
+	if (!mAdaptee.isConnected())
+	    return false;
 	try {
 	    mAdaptee.login(mLogin, mPassword, mResource);
 	    mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService);
@@ -339,7 +339,8 @@
 
 	mStatusNotification.setLatestEventInfo(mService, "Beem Status", text, PendingIntent.getActivity(mService, 0,
 	    new Intent(mService, ChangeStatus.class), 0));
-	mService.sendNotification(BeemService.NOTIFICATION_STATUS_ID, mStatusNotification);
+	// bypass the preferences for notification
+	mService.getNotificationManager().notify(BeemService.NOTIFICATION_STATUS_ID, mStatusNotification);
     }
 
     /**
@@ -571,10 +572,10 @@
 		    String from = packet.getFrom();
 		    Notification notif = new Notification(android.R.drawable.stat_notify_more, mService.getString(
 			R.string.AcceptContactRequest, from), System.currentTimeMillis());
-		    notif.defaults = Notification.DEFAULT_ALL;
 		    notif.flags = Notification.FLAG_AUTO_CANCEL;
 		    Intent intent = new Intent(mService, Subscription.class);
-		    intent.putExtra("from", from);
+		    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+			.putExtra("from", from);
 		    notif.setLatestEventInfo(mService, from, mService
 			.getString(R.string.AcceptContactRequestFrom, from), PendingIntent.getActivity(mService, 0,
 			    intent, PendingIntent.FLAG_ONE_SHOT));
@@ -620,16 +621,11 @@
 	    if (p.getType() != Presence.Type.subscribe)
 		return;
 	    String from = p.getFrom();
-	    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mService);
 	    Notification notification = new Notification(android.R.drawable.stat_notify_more, mService.getString(
 		R.string.AcceptContactRequest, from), System.currentTimeMillis());
-	    if (!pref.getBoolean("settings_notification_disable_vibrate", true))
-		notification.defaults -= Notification.DEFAULT_VIBRATE;
 	    notification.flags = Notification.FLAG_AUTO_CANCEL;
 	    Intent intent = new Intent(mService, Subscription.class);
 	    intent.putExtra("from", from);
-	    String ringtoneStr = pref.getString("settings_notification_snd", "");
-	    notification.sound = Uri.parse(ringtoneStr);
 	    notification.setLatestEventInfo(mService, from, mService
 		.getString(R.string.AcceptContactRequestFrom, from), PendingIntent.getActivity(mService, 0,
 		    intent, PendingIntent.FLAG_ONE_SHOT));
--- a/src/com/beem/project/beem/ui/Chat.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/ui/Chat.java	Mon Jun 14 22:47:22 2010 +0200
@@ -135,6 +135,7 @@
     private final BeemBroadcastReceiver mBroadcastReceiver = new BeemBroadcastReceiver();
     private final BeemRosterListener mBeemRosterListener = new BeemRosterListener();
     private IXmppFacade mXmppFacade;
+    private boolean mBinded;
 
     /**
      * Constructor.
@@ -161,6 +162,7 @@
 	mMessagesListView.setAdapter(mMessagesListAdapter);
 	mInputField = (EditText) findViewById(R.id.chat_input);
 	mInputField.setOnKeyListener(this);
+	mInputField.requestFocus();
 	mSendButton = (Button) findViewById(R.id.chat_send_message);
 	mSendButton.setOnClickListener(new OnClickListener() {
 	    @Override
@@ -176,8 +178,10 @@
     protected void onResume() {
 	super.onResume();
 	mContact = new Contact(getIntent().getData());
-	if (mXmppFacade == null)
+	if (!mBinded) {
 	    bindService(SERVICE_INTENT, mConn, BIND_AUTO_CREATE);
+	    mBinded = true;
+	}
     }
 
     /**
@@ -207,8 +211,10 @@
 	} catch (RemoteException e) {
 	    Log.e(TAG, e.getMessage());
 	}
-	if (mXmppFacade != null)
+	if (mBinded) {
 	    unbindService(mConn);
+	    mBinded = false;
+	}
 	mXmppFacade = null;
 	mRoster = null;
 	mChat = null;
@@ -593,7 +599,7 @@
      * Update the contact status icon.
      */
     private void updateContactStatusIcon() {
-	mContactStatusIcon.setImageBitmap(mStatusIconsMap.get(mContact.getStatus()));
+	mContactStatusIcon.setImageLevel(mContact.getStatus());
     }
 
     /**
--- a/src/com/beem/project/beem/ui/ContactList.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/ui/ContactList.java	Mon Jun 14 22:47:22 2010 +0200
@@ -43,11 +43,13 @@
 package com.beem.project.beem.ui;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.jivesoftware.smack.util.StringUtils;
 
@@ -58,8 +60,7 @@
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.SharedPreferences;
-import android.graphics.BitmapFactory;
-import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.LevelListDrawable;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -76,6 +77,8 @@
 import android.view.ViewStub;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
+import android.widget.Filter;
+import android.widget.Filterable;
 import android.widget.Gallery;
 import android.widget.LinearLayout;
 import android.widget.ListView;
@@ -94,45 +97,48 @@
 import com.beem.project.beem.ui.dialogs.builders.ResendSubscription;
 import com.beem.project.beem.utils.BeemBroadcastReceiver;
 import com.beem.project.beem.utils.Status;
+import com.beem.project.beem.utils.SortedList;
 
 /**
  * The contact list activity displays the roster of the user.
  */
 public class ContactList extends Activity {
 
-    // private static final String TAG = "CONTACTLIST_ACT";
     private static final Intent SERVICE_INTENT = new Intent();
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
     }
 
-    private static final int REQUEST_CODE = 1;
     private static final String SETTINGS_HIDDEN_CONTACT = "settings_key_hidden_contact";
     private static final String TAG = "ContactList";
     private final BeemContactList mAdapterContactList = new BeemContactList();
-    private final BeemBanner mAdapterBanner = new BeemBanner();
     private final List<String> mListGroup = new ArrayList<String>();
+
+    /** Map containing a list of the different contacts of a given group.
+     * Each list is a @{link SortedList} so there is no need to sort it again.
+     * */
     private final Map<String, List<Contact>> mContactOnGroup = new HashMap<String, List<Contact>>();
+    private final BeemContactListOnClick mOnContactClick = new BeemContactListOnClick();
     private final Handler mHandler = new Handler();
     private final ServiceConnection mServConn = new BeemServiceConnection();
     private final BeemBroadcastReceiver mReceiver = new BeemBroadcastReceiver();
     private final ComparatorContactListByStatusAndName<Contact> mComparator =
 	new ComparatorContactListByStatusAndName<Contact>();
     private final BeemRosterListener mBeemRosterListener = new BeemRosterListener();
-    private final Map<Integer, BitmapDrawable> mIconsMap = new HashMap<Integer, BitmapDrawable>();
     private List<Contact> mListContact;
+    private String mSelectedGroup;
     private IRoster mRoster;
-    private String mCurGroup;
-    private Contact mContact;
+    private Contact mSelectedContact;
     private IXmppFacade mXmppFacade;
     private SharedPreferences mSettings;
     private LayoutInflater mInflater;
+    private BeemBanner mAdapterBanner;
+    private boolean mBinded;
 
     /**
      * Constructor.
      */
     public ContactList() {
-
     }
 
     /**
@@ -152,23 +158,23 @@
     public final boolean onOptionsItemSelected(MenuItem item) {
 	switch (item.getItemId()) {
 	    case R.id.contact_list_menu_settings:
-		startActivityForResult(new Intent(this, Settings.class), REQUEST_CODE);
+		startActivity(new Intent(this, Settings.class));
 		return true;
 	    case R.id.contact_list_menu_add_contact:
 		startActivity(new Intent(ContactList.this, AddContact.class));
 		return true;
+	    case R.id.menu_change_status:
+		startActivity(new Intent(ContactList.this, ChangeStatus.class));
+		return true;
 	    case R.id.menu_disconnect:
-		    stopService(SERVICE_INTENT);
-		    finish();
+		stopService(SERVICE_INTENT);
+		finish();
 		return true;
 	    default:
 		return false;
 	}
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 	super.onCreateContextMenu(menu, v, menuInfo);
@@ -177,38 +183,35 @@
 	AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
 	Contact c = mListContact.get(info.position);
 	try {
-	    mContact = mRoster.getContact(c.getJID());
+	    mSelectedContact = mRoster.getContact(c.getJID());
 	} catch (RemoteException e) {
 	    e.printStackTrace();
 	}
-	menu.setHeaderTitle(mContact.getJID());
+	menu.setHeaderTitle(mSelectedContact.getJID());
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public boolean onContextItemSelected(MenuItem item) {
 	Intent in;
 	boolean result;
-	if (mContact != null) {
+	if (mSelectedContact != null) {
 	    switch (item.getItemId()) {
 		case R.id.contact_list_context_menu_chat_item:
-		    List<String> res = mContact.getMRes();
+		    List<String> res = mSelectedContact.getMRes();
 		    if (res.isEmpty()) {
 			result = false;
 			break;
 		    }
 		    for (String resv : res) {
 			in = new Intent(this, Chat.class);
-			in.setData(mContact.toUri(resv));
+			in.setData(mSelectedContact.toUri(resv));
 			item.getSubMenu().add(resv).setIntent(in);
 		    }
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_call_item:
 		    try {
-			mXmppFacade.call(mContact.getJID() + "/psi");
+			mXmppFacade.call(mSelectedContact.getJID() + "/psi");
 			result = true;
 		    } catch (RemoteException e) {
 			e.printStackTrace();
@@ -216,22 +219,23 @@
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_user_info:
-		    item.getSubMenu().setHeaderTitle(mContact.getJID());
+		    item.getSubMenu().setHeaderTitle(mSelectedContact.getJID());
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_userinfo_alias:
-		    Dialog alias = new Alias(ContactList.this, mRoster, mContact).create();
+		    Dialog alias = new Alias(ContactList.this, mRoster, mSelectedContact).create();
 		    alias.show();
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_userinfo_group:
 		    in = new Intent(this, GroupList.class);
-		    in.putExtra("contact", mContact);
+		    in.putExtra("contact", mSelectedContact);
 		    startActivity(in);
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_userinfo_subscription:
-		    Dialog subscription = new ResendSubscription(ContactList.this, mXmppFacade, mContact).create();
+		    Dialog subscription = new ResendSubscription(ContactList.this,
+			    mXmppFacade, mSelectedContact).create();
 		    subscription.show();
 		    result = true;
 		    break;
@@ -239,7 +243,7 @@
 		    result = true;
 		    break;
 		case R.id.contact_list_context_menu_userinfo_delete:
-		    Dialog delete = new DeleteContact(ContactList.this, mRoster, mContact).create();
+		    Dialog delete = new DeleteContact(ContactList.this, mRoster, mSelectedContact).create();
 		    delete.show();
 		    result = true;
 		    break;
@@ -252,25 +256,6 @@
 	return super.onContextItemSelected(item);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-	super.onActivityResult(requestCode, resultCode, data);
-	if (requestCode == REQUEST_CODE) {
-	    if (resultCode == RESULT_OK) {
-		mListContact.clear();
-		stopService(SERVICE_INTENT);
-		finish();
-	    }
-	}
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     @Override
     protected void onCreate(Bundle saveBundle) {
 	super.onCreate(saveBundle);
@@ -280,24 +265,19 @@
 	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
 
 	mInflater = getLayoutInflater();
-	prepareIconsStatus();
+	mAdapterBanner = new BeemBanner(mInflater, mListGroup);
+	mListContact = new ArrayList<Contact>();
+	ListView listView = (ListView) findViewById(R.id.contactlist);
+	listView.setOnItemClickListener(mOnContactClick);
+	registerForContextMenu(listView);
+	listView.setAdapter(mAdapterContactList);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     protected void onResume() {
 	super.onResume();
-	if (mXmppFacade == null)
-	    bindService(SERVICE_INTENT, mServConn, BIND_AUTO_CREATE);
-	else {
-	    if (!mSettings.getBoolean("settings_key_hide_groups", false))
-		buildBanner();
-	    else
-		hideGroups();
-	    buildContactList();
-	}
+	if (!mBinded)
+	    mBinded = bindService(SERVICE_INTENT, mServConn, BIND_AUTO_CREATE);
     }
 
     /**
@@ -314,14 +294,13 @@
 	} catch (RemoteException e) {
 	    Log.d("ContactList", "Remote exception", e);
 	}
-	unbindService(mServConn);
+	if (mBinded) {
+	    unbindService(mServConn);
+	    mBinded = false;
+	}
 	mXmppFacade = null;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see android.app.Activity#onDestroy()
-     */
     @Override
     protected void onDestroy() {
 	super.onDestroy();
@@ -330,38 +309,543 @@
     }
 
     /**
-     * Comparator Contact by Name.
+     * Build and display the contact list.
+     * @param group name of the contact list.
+     */
+    private void buildContactList(String group) {
+	mListContact = mContactOnGroup.get(group);
+	mSelectedGroup = group;
+	Log.d(TAG, "buildContactList for group " + group);
+	mAdapterContactList.notifyDataSetChanged();
+    }
+
+    /**
+     * Show the groups view.
      */
-    @SuppressWarnings("unused")
-    private class ComparatorContactListByName<T> implements Comparator<T> {
+    private void showGroups() {
+
+	ViewStub stub = (ViewStub) findViewById(R.id.contactlist_stub);
+	if (stub != null) {
+	    View v = stub.inflate();
+	    Gallery g = (Gallery) v.findViewById(R.id.contactlist_banner);
+	    g.setOnItemClickListener(new OnItemClickGroupName());
+	    g.setAdapter(mAdapterBanner);
+	    g.setSelection(0);
+	} else {
+	    ((LinearLayout) findViewById(R.id.contactlist_groupstub)).setVisibility(View.VISIBLE);
+	    Gallery g = (Gallery) findViewById(R.id.contactlist_banner);
+	    g.setSelection(0);
+	}
+    }
+
+    /**
+     * Hide the groups view.
+     */
+    private void hideGroups() {
+	View v = findViewById(R.id.contactlist_groupstub);
+	if (v != null)
+	    v.setVisibility(View.GONE);
+    }
+
+    /**
+     * Listener on service event.
+     */
+    private class BeemRosterListener extends IBeemRosterListener.Stub {
 	/**
 	 * Constructor.
 	 */
-	public ComparatorContactListByName() {
+	public BeemRosterListener() {
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * Simple stategy to handle the onEntriesAdded event.
+	 * if contact has to be shown :
+	 * <ul>
+	 * <li> add him to his groups</li>
+	 * <li> add him to the specials groups</>
+	 * </ul>
+	 */
+	@Override
+	public void onEntriesAdded(final List<String> addresses) throws RemoteException {
+	    final boolean hideDisconnected = mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false);
+	    for (String newName : addresses) {
+		Contact contact = mRoster.getContact(newName);
+		boolean visible = !hideDisconnected || Status.statusOnline(contact.getStatus());
+		List<String> groups = contact.getGroups();
+		if (visible) {
+		    for (String group : groups) {
+			if (!mListGroup.contains(group)) {
+			    mListGroup.add(mListGroup.size() - 1, group);
+			    List<Contact> tmplist = new SortedList<Contact>(new LinkedList<Contact>(), mComparator);
+			    mContactOnGroup.put(group, tmplist);
+			}
+			List<Contact> contactByGroups = mContactOnGroup.get(group);
+			if (mSelectedGroup.equals(group)) {
+			    updateCurrentList(group, contact);
+			    continue;
+			}
+			contactByGroups.add(contact);
+		    }
+
+		    // add the contact to all and no groups
+		    addToSpecialList(contact);
+		}
+	    }
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * Simple stategy to handle the onEntriesDeleted event.
+	 * <ul>
+	 * <li> Remove the contact from all groups</li>
+	 * </ul>
+	 */
+	@Override
+	public void onEntriesDeleted(final List<String> addresses) throws RemoteException {
+	    Log.d(TAG, "onEntries deleted " + addresses);
+	    for (String cToDelete : addresses) {
+		Contact contact = new Contact(cToDelete);
+		for (Map.Entry<String, List<Contact>> entry : mContactOnGroup.entrySet()) {
+		    List<Contact> contactByGroups = entry.getValue();
+		    if (mSelectedGroup.equals(entry.getKey())) {
+			updateCurrentList(entry.getKey(), contact);
+			continue;
+		    }
+		    contactByGroups.remove(contact);
+		}
+		cleanBannerGroup();
+	    }
+
+	    mHandler.post(new Runnable() {
+		public void run() {
+		    mSelectedGroup = getString(R.string.contact_list_all_contact);
+		    mListContact = mContactOnGroup.get(mSelectedGroup);
+
+		    mAdapterContactList.notifyDataSetChanged();
+		}
+	    });
+
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * Simple stategy to handle the onEntriesUpdated event.
+	 * <ul>
+	 * <li> Remove the contact from all groups</li>
+	 * <li> if contact has to be shown add it to his groups</li>
+	 * <li> if contact has to be shown add it to the specials groups</li>
+	 * </ul>
+	 */
+	@Override
+	public void onEntriesUpdated(final List<String> addresses) throws RemoteException {
+	    final boolean hideDisconnected = mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false);
+	    for (String adr : addresses) {
+		Contact contact = mRoster.getContact(adr);
+		boolean visible = !hideDisconnected || Status.statusOnline(contact.getStatus());
+		List<String> groups = contact.getGroups();
+		for (Map.Entry<String, List<Contact>> entry : mContactOnGroup.entrySet()) {
+		    List<Contact> contactByGroups = entry.getValue();
+		    if (mSelectedGroup.equals(entry.getKey())) {
+			updateCurrentList(entry.getKey(), contact);
+			continue;
+		    }
+		    contactByGroups.remove(contact);
+		    if (visible) {
+			for (String group : groups) {
+			    if (!mListGroup.contains(group)) {
+				mListGroup.add(mListGroup.size() - 1, group);
+				List<Contact> tmplist = new SortedList<Contact>(
+					new LinkedList<Contact>(), mComparator);
+				mContactOnGroup.put(group, tmplist);
+			    }
+			    mContactOnGroup.get(group).remove(contact);
+			}
+		    }
+
+		}
+
+		// add the contact to all and no groups
+		if (visible) {
+		    addToSpecialList(contact);
+		}
+	    }
+	    cleanBannerGroup();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * Simple stategy to handle the onPresenceChanged event.
+	 * <ul>
+	 * <li> Remove the contact from all groups</li>
+	 * <li> if contact has to be shown add it to his groups</li>
+	 * <li> if contact has to be shown add it to the specials groups</li>
+	 * </ul>
+	 */
+	@Override
+	public void onPresenceChanged(PresenceAdapter presence) throws RemoteException {
+	    Log.d(TAG, "presence");
+	    String from = presence.getFrom();
+	    final boolean hideDisconnected = mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false);
+	    final Contact contact = mRoster.getContact(StringUtils.parseBareAddress(from));
+	    boolean visible = !hideDisconnected || Status.statusOnline(contact.getStatus());
+	    List<String> groups = contact.getGroups();
+	    for (Map.Entry<String, List<Contact>> entry : mContactOnGroup.entrySet()) {
+		List<Contact> contactByGroups = entry.getValue();
+		if (mSelectedGroup.equals(entry.getKey())) {
+		    updateCurrentList(entry.getKey(), contact);
+		    continue;
+		}
+		contactByGroups.remove(contact);
+		if (visible) {
+		    if (groups.contains(entry.getKey())) {
+			contactByGroups.add(contact);
+		    }
+		}
+	    }
+	    if (visible) {
+		addToSpecialList(contact);
+	    }
+	}
+
+	/**
+	 * Add a contact to the special list No Group and All contacts.
+	 * The contact will be added if the list is not the current list otherwise
+	 * the list must be modified in a Handler.
+	 *
+	 * @param contact the contact to add.
+	 */
+	private void addToSpecialList(Contact contact) {
+	    List<String> groups = contact.getGroups();
+	    List<Contact> list = mContactOnGroup.get(getString(R.string.contact_list_all_contact));
+	    if (list != mListContact) {
+		list.add(contact);
+	    }
+	    list = mContactOnGroup.get(getString(R.string.contact_list_no_group));
+	    if (list != mListContact && groups.isEmpty()) {
+		list.add(contact);
+	    }
+	}
+
+	/**
+	 * Update the current list with the status of contact.
+	 *
+	 * @param listName name of the current list
+	 * @param contact contact to update
+	 */
+	private void updateCurrentList(String listName, final Contact contact) {
+	    final boolean hideDisconnected = mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false);
+	    final List<String> groups = contact.getGroups();
+	    String noGroup = getString(R.string.contact_list_no_group);
+	    String allGroup = getString(R.string.contact_list_all_contact);
+	    final boolean add = ((!hideDisconnected || Status.statusOnline(contact.getStatus())) &&	// must show and
+		    (
+		     (listName.equals(noGroup) && groups.isEmpty()) ||			// in no group
+		     groups.contains(listName) ||					// or in current
+		     listName.equals(allGroup)						// or in all
+		    ));
+	    mHandler.post(new Runnable() {
+		public void run() {
+		    mListContact.remove(contact);
+		    if (add) {
+			mListContact.add(contact);
+		    }
+		    mAdapterContactList.notifyDataSetChanged();
+		}
+	    });
+
+	}
+
+	/**
+	 * Remove old groups on the banner.
+	 * @throws RemoteException if an error occur when communicating with the service
+	 */
+	private void cleanBannerGroup() throws RemoteException {
+	    List<String> rosterGroups = mRoster.getGroupsNames();
+	    List<String> realGroups = mListGroup.subList(1, mListContact.size() - 1);
+	    realGroups.retainAll(rosterGroups);
+	}
+
+    }
+
+    /**
+     * Adapter contact list.
+     */
+    private class BeemContactList extends BaseAdapter implements Filterable {
+
+	private final ContactFilter mFilter;
+
+	/**
+	 * Constructor.
+	 */
+	public BeemContactList() {
+	    mFilter = new ContactFilter();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	@Override
-	public int compare(T c1, T c2) {
-	    return ((Contact) c1).getName().compareToIgnoreCase(((Contact) c2).getName());
+	public int getCount() {
+	    return mListContact.size();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Object getItem(int position) {
+	    return mListContact.get(position);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public long getItemId(int position) {
+	    return mListContact.get(position).hashCode();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public View getView(int position, View convertView, ViewGroup parent) {
+	    View v = convertView;
+	    if (convertView == null) {
+		v = mInflater.inflate(R.layout.contactlistcontact, null);
+	    }
+	    Contact c = mListContact.get(position);
+	    if (mRoster != null) {
+		try {
+		    c = mRoster.getContact(c.getJID());
+		} catch (RemoteException e) {
+		    e.printStackTrace();
+		}
+	    }
+	    bindView(v, c);
+	    return v;
+	}
+
+	@Override
+	public Filter getFilter() {
+	    return mFilter;
+	}
+
+	/**
+	 * Adapte curContact to the view.
+	 * @param view the row view.
+	 * @param curContact the current contact.
+	 */
+	private void bindView(View view, Contact curContact) {
+	    if (curContact != null) {
+		TextView v = (TextView) view.findViewById(R.id.contactlistpseudo);
+		LevelListDrawable mStatusDrawable = (LevelListDrawable) getResources()
+		    .getDrawable(R.drawable.status_icon);
+		mStatusDrawable.setLevel(curContact.getStatus());
+		v.setCompoundDrawablesWithIntrinsicBounds(mStatusDrawable, null, null, null);
+		v.setText(curContact.getName());
+		v = (TextView) view.findViewById(R.id.contactlistmsgperso);
+		v.setText(curContact.getMsgState());
+	    }
+	}
+
+	/**
+	 * A Filter which select Contact to display by searching in ther Jid.
+	 */
+	private class ContactFilter extends Filter {
+
+	    /**
+	     * Create a ContactFilter.
+	     */
+	    public ContactFilter() { }
+
+	    @Override
+	    protected Filter.FilterResults performFiltering(CharSequence constraint) {
+		Log.d(TAG, "performFiltering");
+		List<Contact> result = mListContact;
+		if (constraint.length() > 0) {
+		    result = new LinkedList<Contact>();
+		    for (Contact c : mContactOnGroup.get(mSelectedGroup)) {
+			if (c.getJID().contains(constraint))
+			    result.add(c);
+		    }
+		}
+		Filter.FilterResults fr = new Filter.FilterResults();
+		fr.values = result;
+		fr.count = result.size();
+		return fr;
+	    }
+
+	    @Override
+	    protected void publishResults(CharSequence constraint, Filter.FilterResults  results) {
+		Log.d(TAG, "publishResults");
+		List<Contact> contacts = (List<Contact>) results.values;
+		mListContact = contacts;
+		notifyDataSetChanged();
+	    }
 	}
     }
 
     /**
+     * Adapter banner list.
+     */
+    private static class BeemBanner extends BaseAdapter {
+	private List<String> mGroups;
+	private LayoutInflater mInflater;
+
+	/**
+	 * Constructor.
+	 * @param inflater the inflater use to create the view for the banner
+	 * @param groups list of the differents groups to adapt
+	 */
+	public BeemBanner(final LayoutInflater inflater, final List<String> groups) {
+	    mGroups = groups;
+	    mInflater = inflater;
+	}
+
+	@Override
+	public int getCount() {
+	    return mGroups.size();
+	}
+
+	@Override
+	public Object getItem(int position) {
+	    return mGroups.get(position);
+	}
+
+	@Override
+	public long getItemId(int position) {
+	    return position;
+	}
+
+	@Override
+	public View getView(int position, View convertView, ViewGroup parent) {
+	    View v = convertView;
+	    if (convertView == null) {
+		v = mInflater.inflate(R.layout.contactlist_group, null);
+	    }
+	    ((TextView) v).setText(mGroups.get(position));
+	    return v;
+	}
+    }
+
+    /**
+     * The service connection used to connect to the Beem service.
+     */
+    private class BeemServiceConnection implements ServiceConnection {
+
+	/**
+	 * Constructor.
+	 */
+	public BeemServiceConnection() {
+	}
+
+	@Override
+	public void onServiceConnected(ComponentName name, IBinder service) {
+	    mXmppFacade = IXmppFacade.Stub.asInterface(service);
+	    try {
+		mRoster = mXmppFacade.getRoster();
+		if (mRoster != null) {
+		    List<Contact> tmpContactList = mRoster.getContactList();
+		    List<String> tmpGroupList = mRoster.getGroupsNames();
+		    Collections.sort(tmpGroupList);
+		    mListGroup.clear();
+		    mListGroup.add(getString(R.string.contact_list_all_contact));
+		    mListGroup.addAll(tmpGroupList);
+		    mListGroup.add(getString(R.string.contact_list_no_group));
+		    assignContactToGroups(mRoster.getContactList(), tmpGroupList);
+		    makeSortedList(mContactOnGroup);
+		    if (!mSettings.getBoolean("settings_key_hide_groups", false))
+			showGroups();
+		    else
+			hideGroups();
+		    String group = getString(R.string.contact_list_all_contact);
+		    buildContactList(group);
+		    mRoster.addRosterListener(mBeemRosterListener);
+		    Log.d(TAG, "add rester listneer");
+		}
+	    } catch (RemoteException e) {
+		e.printStackTrace();
+	    }
+	}
+
+	@Override
+	public void onServiceDisconnected(ComponentName name) {
+	    try {
+		mRoster.removeRosterListener(mBeemRosterListener);
+	    } catch (RemoteException e) {
+		e.printStackTrace();
+	    }
+	    mXmppFacade = null;
+	    mRoster = null;
+	    mListContact.clear();
+	    mListGroup.clear();
+	    mContactOnGroup.clear();
+	    mBinded = false;
+	}
+
+	/**
+	 * Assign the differents contact to their groups.
+	 * This methods will fill the mContactOnGroup map.
+	 *
+	 * @param contacts list of contacts
+	 * @param groupNames list of existing groups
+	 */
+	private void assignContactToGroups(List<Contact> contacts, List<String> groupNames) {
+	    boolean hideDisconnected = mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false);
+	    mContactOnGroup.clear();
+	    List<Contact> all = new LinkedList<Contact>();
+	    List<Contact> noGroups = new LinkedList<Contact>();
+	    for (String group : groupNames) {
+		mContactOnGroup.put(group, new LinkedList<Contact>());
+	    }
+	    for (Contact c : contacts) {
+		if (hideDisconnected && !Status.statusOnline(c.getStatus())) {
+		    continue;
+		}
+		all.add(c);
+		List<String> groups = c.getGroups();
+		if (groups.isEmpty())
+		    noGroups.add(c);
+		else {
+		    for (String currentGroup : groups) {
+			List<Contact> contactsByGroups = mContactOnGroup.get(currentGroup);
+			contactsByGroups.add(c);
+		    }
+		}
+	    }
+	    mContactOnGroup.put(getString(R.string.contact_list_no_group), noGroups);
+	    mContactOnGroup.put(getString(R.string.contact_list_all_contact), all);
+	}
+
+	/**
+	 * Make the List of the map became Insertion sorted list.
+	 *
+	 * @param map the map to convert.
+	 */
+	private void makeSortedList(Map<String, List<Contact>> map) {
+	    for (Map.Entry<String, List<Contact>> entry : map.entrySet()) {
+		List<Contact> l = entry.getValue();
+		entry.setValue(new SortedList<Contact>(l, mComparator));
+	    }
+	}
+    }
+
+
+
+
+    /**
      * Comparator Contact by status and name.
      */
-    private class ComparatorContactListByStatusAndName<T> implements Comparator<T> {
+    private static class ComparatorContactListByStatusAndName<T> implements Comparator<T> {
 	/**
 	 * Constructor.
 	 */
 	public ComparatorContactListByStatusAndName() {
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public int compare(T c1, T c2) {
 	    if (((Contact) c1).getStatus() < ((Contact) c2).getStatus()) {
@@ -374,35 +858,6 @@
     }
 
     /**
-     * Contact List construction.
-     */
-    private void buildContactList() {
-	if (mCurGroup != null) {
-	    mListContact = mContactOnGroup.get(mCurGroup);
-	}
-	sortBeemContactList();
-	ListView listView = (ListView) findViewById(R.id.contactlist);
-	listView.setOnItemClickListener(new BeemContactListOnClick());
-	registerForContextMenu(listView);
-	listView.setAdapter(mAdapterContactList);
-    }
-
-    /**
-     * buildBanner.
-     */
-    private void buildBanner() {
-
-	ViewStub stub = (ViewStub) findViewById(R.id.contactlist_stub);
-	if (stub != null)
-	    stub.inflate();
-	else
-	    ((LinearLayout) findViewById(R.id.contactlist_groupstub)).setVisibility(View.VISIBLE);
-	Gallery g = (Gallery) findViewById(R.id.contactlist_banner);
-	g.setOnItemClickListener(new OnItemClickGroupName());
-	g.setAdapter(mAdapterBanner);
-    }
-
-    /**
      * Event simple click on item of the contact list.
      */
     private class BeemContactListOnClick implements OnItemClickListener {
@@ -437,409 +892,9 @@
 
 	@Override
 	public void onItemClick(AdapterView<?> arg0, View v, int i, long l) {
-	    mCurGroup = mListGroup.get(i);
-	    buildContactList();
-	}
-    }
-
-    /**
-     * Prepare Bitmap Map.
-     */
-    private void prepareIconsStatus() {
-	mIconsMap.put(Status.CONTACT_STATUS_AVAILABLE, new BitmapDrawable(BitmapFactory.decodeResource(getResources(),
-	    android.R.drawable.presence_online)));
-	mIconsMap.put(Status.CONTACT_STATUS_AVAILABLE_FOR_CHAT,
-	    new BitmapDrawable(BitmapFactory.decodeResource(getResources(), android.R.drawable.presence_online)));
-	mIconsMap.put(Status.CONTACT_STATUS_AWAY,
-	    new BitmapDrawable(BitmapFactory.decodeResource(getResources(), android.R.drawable.presence_away)));
-	mIconsMap.put(Status.CONTACT_STATUS_BUSY,
-	    new BitmapDrawable(BitmapFactory.decodeResource(getResources(), android.R.drawable.presence_busy)));
-	mIconsMap.put(Status.CONTACT_STATUS_DISCONNECT, new BitmapDrawable(BitmapFactory.decodeResource(getResources(),
-	    android.R.drawable.presence_offline)));
-	mIconsMap.put(Status.CONTACT_STATUS_UNAVAILABLE, new BitmapDrawable(BitmapFactory.decodeResource(getResources(),
-	    R.drawable.status_requested)));
-    }
-
-    /**
-     * Sort the contact list.
-     */
-    private void sortBeemContactList() {
-	Collections.sort(mListContact, mComparator);
-    }
-
-    /**
-     * Listener on service event.
-     */
-    private class BeemRosterListener extends IBeemRosterListener.Stub {
-	/**
-	 * Constructor.
-	 */
-	public BeemRosterListener() {
-	}
-
-	/**
-	 * Refresh the contact list.
-	 */
-	private class RunnableChange implements Runnable {
-	    /**
-	     * Constructor.
-	     */
-	    public RunnableChange() {
-
-	    }
-
-	    /**
-	     * {@inheritDoc}
-	     */
-	    @Override
-	    public void run() {
-		sortBeemContactList();
-		mAdapterContactList.notifyDataSetChanged();
-		mAdapterBanner.notifyDataSetChanged();
-	    }
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void onEntriesAdded(List<String> addresses) throws RemoteException {
-	    for (String newName : addresses) {
-		Contact c = mRoster.getContact(newName);
-		mContactOnGroup.get(getString(R.string.contact_list_all_contact)).add(c);
-		if (c.getGroups().size() == 0)
-		    mContactOnGroup.get(getString(R.string.contact_list_no_group)).add(c);
-		else {
-		    for (String group : c.getGroups()) {
-			if (!mListGroup.contains(group)) {
-			    mListGroup.add(mListGroup.size() - 1, group);
-			    List<Contact> tmplist = new ArrayList<Contact>();
-			    mContactOnGroup.put(group, tmplist);
-			}
-			mContactOnGroup.get(group).add(c);
-			if (group.equals(mCurGroup) && !mListContact.contains(c))
-			    mListContact.add(c);
-		    }
-		}
-	    }
-	    mHandler.post(new RunnableChange());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void onEntriesDeleted(List<String> addresses) throws RemoteException {
-	    for (String cToDelete : addresses) {
-		for (Contact c : mListContact) {
-		    if (c.getJID().equals(cToDelete)) {
-			for (String group : mListGroup) {
-			    mContactOnGroup.get(group).remove(c);
-			    if (mContactOnGroup.get(group).size() == 0) {
-				//mContactOnGroup.remove(group);
-				//mListGroup.remove(group);
-			    }
-			}
-			mListContact.remove(c);
-			break;
-		    }
-		}
-	    }
-	    mListContact = mContactOnGroup.get(getString(R.string.contact_list_all_contact));
-	    mHandler.post(new RunnableChange());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void onEntriesUpdated(List<String> addresses) throws RemoteException {
-	    for (String adr : addresses) {
-		Contact c = mRoster.getContact(adr);
-		if (c.getGroups() != null) {
-		    if (mContactOnGroup.get(getString(R.string.contact_list_no_group)).contains(c)) {
-			mContactOnGroup.get(getString(R.string.contact_list_no_group)).remove(c);
-		    }
-		}
-	    }
-	    mHandler.post(new RunnableChange());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void onPresenceChanged(PresenceAdapter presence) throws RemoteException {
-	    String from = presence.getFrom();
-	    boolean resfound = false;
-	    for (Contact curContact : mListContact) {
-		if (curContact.getJID().equals(StringUtils.parseBareAddress(from))) {
-		    String pres = StringUtils.parseResource(from);
-		    for (String res : curContact.getMRes()) {
-			if (res.equals(pres)) {
-			    resfound = true;
-			    break;
-			}
-		    }
-		    curContact.setStatus(mRoster.getPresence(StringUtils.parseBareAddress(presence.getFrom())));
-		    int status = presence.getStatus();
-		    if (!resfound && !Status.statusOnline(status))
-			curContact.addRes(pres);
-		    else if (resfound && Status.statusOnline(status))
-			curContact.delRes(pres);
-		    mHandler.post(new RunnableChange());
-		    return;
-		}
-	    }
+	    String group = mListGroup.get(i);
+	    buildContactList(group);
 	}
     }
 
-    /**
-     * Adapter contact list.
-     */
-    private class BeemContactList extends BaseAdapter {
-
-	/**
-	 * Constructor.
-	 */
-	public BeemContactList() {
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int getCount() {
-	    if (mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false)) {
-		int res = 0;
-		for (Contact c : mListContact) {
-		    if (Status.statusOnline(c.getStatus()))
-			res++;
-		}
-		return res;
-	    } else {
-		return mListContact.size();
-	    }
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Object getItem(int position) {
-	    Contact c = null;
-	    if (mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false)) {
-		int res = 0;
-		for (Contact cur : mListContact) {
-		    if (res == position && Status.statusOnline(cur.getStatus())) {
-			c = cur;
-			break;
-		    }
-		    if (Status.statusOnline(cur.getStatus()))
-			res++;
-		}
-	    } else
-		c = mListContact.get(position);
-	    return c;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public long getItemId(int position) {
-	    return position;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public View getView(int position, View convertView, ViewGroup parent) {
-	    View v = convertView;
-	    if (convertView == null) {
-		v = mInflater.inflate(R.layout.contactlistcontact, null);
-	    }
-	    Contact c = null;
-	    if (mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false)) {
-		int res = 0;
-		for (Contact cur : mListContact) {
-		    if (res == position && Status.statusOnline(cur.getStatus())) {
-			c = cur;
-			break;
-		    }
-		    if (Status.statusOnline(cur.getStatus()))
-			res++;
-		}
-	    } else
-		c = mListContact.get(position);
-	    if (mRoster != null) {
-		try {
-		    c = mRoster.getContact(c.getJID());
-		} catch (RemoteException e) {
-		    e.printStackTrace();
-		}
-	    }
-	    if (mSettings.getBoolean(SETTINGS_HIDDEN_CONTACT, false) && !Status.statusOnline(c.getStatus())) {
-		v.setVisibility(View.GONE);
-	    } else {
-		bindView(v, c);
-	    }
-	    return v;
-	}
-
-	/**
-	 * Adapte curContact to the view.
-	 * @param view the row view.
-	 * @param curContact the current contact.
-	 */
-	private void bindView(View view, Contact curContact) {
-
-	    if (curContact != null) {
-		TextView v = (TextView) view.findViewById(R.id.contactlistpseudo);
-		v.setCompoundDrawablesWithIntrinsicBounds(mIconsMap.get(curContact.getStatus()), null, null, null);
-		v.setText(curContact.getName());
-		v = (TextView) view.findViewById(R.id.contactlistmsgperso);
-		v.setText(curContact.getMsgState());
-	    }
-	}
-    }
-
-    /**
-     * Adapter banner list.
-     */
-    private class BeemBanner extends BaseAdapter {
-	/**
-	 * Constructor.
-	 */
-	public BeemBanner() {
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int getCount() {
-	    return mListGroup.size();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Object getItem(int position) {
-	    return mListGroup.get(position);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public long getItemId(int position) {
-	    return position;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public View getView(int position, View convertView, ViewGroup parent) {
-	    View v = convertView;
-	    if (convertView == null) {
-		v = mInflater.inflate(R.layout.contactlist_group, null);
-	    }
-	    ((TextView) v).setText(mListGroup.get(position));
-	    return v;
-	}
-
-    }
-
-    /**
-     * Create dialog resend subscription.
-     */
-
-    /**
-     * The service connection used to connect to the Beem service.
-     */
-    private class BeemServiceConnection implements ServiceConnection {
-
-	/**
-	 * Constructor.
-	 */
-	public BeemServiceConnection() {
-	}
-
-	@Override
-	public void onServiceConnected(ComponentName name, IBinder service) {
-	    mXmppFacade = IXmppFacade.Stub.asInterface(service);
-	    try {
-		mRoster = mXmppFacade.getRoster();
-		if (mRoster != null) {
-		    mRoster.addRosterListener(mBeemRosterListener);
-		    List<Contact> tmpContactList = mRoster.getContactList();
-		    List<String> tmpGroupList = mRoster.getGroupsNames();
-		    Collections.sort(tmpGroupList);
-		    if (mListGroup.size() > 0)
-			mListGroup.clear();
-		    mListGroup.add(getString(R.string.contact_list_all_contact));
-		    mListGroup.addAll(tmpGroupList);
-		    mListGroup.add(getString(R.string.contact_list_no_group));
-		    mContactOnGroup.clear();
-		    if (tmpGroupList.size() > 0) {
-			List<Contact> tmpNoGroup = new ArrayList<Contact>();
-			for (String s : tmpGroupList) {
-			    List<Contact> tmpList = new ArrayList<Contact>();
-			    for (Contact c : tmpContactList) {
-				if (c.getGroups().size() == 0 && !tmpNoGroup.contains(c))
-				    tmpNoGroup.add(c);
-				else if (c.getGroups().contains(s))
-				    tmpList.add(c);
-			    }
-			    mContactOnGroup.put(s, tmpList);
-			}
-			mContactOnGroup.put(getString(R.string.contact_list_no_group), tmpNoGroup);
-		    } else {
-			mContactOnGroup.put(getString(R.string.contact_list_no_group), tmpContactList);
-		    }
-		    mContactOnGroup.put(getString(R.string.contact_list_all_contact), tmpContactList);
-		    mCurGroup = getString(R.string.contact_list_all_contact);
-		    if (!mSettings.getBoolean("settings_key_hide_groups", false))
-			buildBanner();
-		    else
-			hideGroups();
-		    buildContactList();
-		}
-	    } catch (RemoteException e) {
-		e.printStackTrace();
-	    }
-	}
-
-	@Override
-	public void onServiceDisconnected(ComponentName name) {
-	    try {
-		mRoster.removeRosterListener(mBeemRosterListener);
-	    } catch (RemoteException e) {
-		e.printStackTrace();
-	    }
-	    mXmppFacade = null;
-	    mRoster = null;
-	    mListContact.clear();
-	    mListGroup.clear();
-	    mContactOnGroup.clear();
-	}
-    }
-
-    @Override
-    protected void finalize() {
-	Log.e(TAG, "FINALIZE");
-    }
-
-    /**
-     * Hide the groups view.
-     */
-    private void hideGroups() {
-	ViewStub stub = (ViewStub) findViewById(R.id.contactlist_stub);
-	if (stub == null)
-	    ((LinearLayout) findViewById(R.id.contactlist_groupstub)).setVisibility(View.GONE);
-    }
 }
--- a/src/com/beem/project/beem/ui/CreateAccount.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/ui/CreateAccount.java	Mon Jun 14 22:47:22 2010 +0200
@@ -172,7 +172,7 @@
      * @return Registered proxy password
      */
     private String getRegisteredProxyPassword() {
-	return mSettings.getString("settings_key_proxy_password", DEFAULT_STRING_VALUE);
+	return mSettings.getString(BeemApplication.PROXY_PASSWORD_KEY, DEFAULT_STRING_VALUE);
     }
 
     /**
@@ -180,7 +180,7 @@
      * @return Registered proxy port
      */
     private int getRegisteredProxyPort() {
-	return Integer.parseInt(mSettings.getString("settings_key_proxy_port", DEFAULT_STRING_VALUE));
+	return Integer.parseInt(mSettings.getString(BeemApplication.PROXY_PORT_KEY, DEFAULT_STRING_VALUE));
     }
 
     /**
@@ -188,7 +188,7 @@
      * @return Registered proxy server
      */
     private String getRegisteredProxyServer() {
-	return mSettings.getString("settings_key_proxy_server", DEFAULT_STRING_VALUE);
+	return mSettings.getString(BeemApplication.PROXY_SERVER_KEY, DEFAULT_STRING_VALUE);
     }
 
     /**
@@ -197,8 +197,8 @@
      */
     private ProxyInfo.ProxyType getRegisteredProxyType() {
 	ProxyInfo.ProxyType result = ProxyInfo.ProxyType.NONE;
-	if (mSettings.getBoolean("settings_key_proxy_use", false)) {
-	    String type = mSettings.getString("settings_key_proxy_type", "none");
+	if (mSettings.getBoolean(BeemApplication.PROXY_USE_KEY, false)) {
+	    String type = mSettings.getString(BeemApplication.PROXY_TYPE_KEY, "none");
 	    if ("HTTP".equals(type))
 		result = ProxyInfo.ProxyType.HTTP;
 	    else if ("SOCKS4".equals(type))
@@ -216,7 +216,7 @@
      * @return Registered proxy use
      */
     private boolean getRegisteredProxyUse() {
-	return mSettings.getBoolean("settings_key_proxy_use", DEFAULT_BOOLEAN_VALUE);
+	return mSettings.getBoolean(BeemApplication.PROXY_USE_KEY, DEFAULT_BOOLEAN_VALUE);
     }
 
     /**
@@ -224,7 +224,7 @@
      * @return Registered proxy username
      */
     private String getRegisteredProxyUsername() {
-	return mSettings.getString("settings_key_proxy_username", DEFAULT_STRING_VALUE);
+	return mSettings.getString(BeemApplication.PROXY_USERNAME_KEY, DEFAULT_STRING_VALUE);
     }
 
     /**
--- a/src/com/beem/project/beem/ui/Settings.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/ui/Settings.java	Mon Jun 14 22:47:22 2010 +0200
@@ -43,11 +43,8 @@
 */
 package com.beem.project.beem.ui;
 
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
 import android.view.Menu;
@@ -55,7 +52,6 @@
 import android.view.MenuItem;
 
 import com.beem.project.beem.R;
-import com.beem.project.beem.utils.BeemBroadcastReceiver;
 
 /**
  * This class represents an activity which allows the user to change his account or proxy parameters.
@@ -63,7 +59,6 @@
 public class Settings extends PreferenceActivity {
 
     private static final Intent SERVICE_INTENT = new Intent();
-    private SettingsBroadcastReceiver mReceiver;
 
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
@@ -75,32 +70,10 @@
     public Settings() {
     }
 
-    /* (non-Javadoc)
-     * @see android.preference.PreferenceActivity#onCreate(android.os.Bundle)
-     */
     @Override
     public void onCreate(Bundle savedInstanceState) {
 	super.onCreate(savedInstanceState);
 	addPreferencesFromResource(R.layout.preferences);
-	mReceiver = new SettingsBroadcastReceiver();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void onPause() {
-	super.onPause();
-	this.unregisterReceiver(mReceiver);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onResume() {
-	super.onResume();
-	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
     }
 
     /**
@@ -132,20 +105,4 @@
 		return false;
 	}
     }
-
-    /**
-     * disconnect Broadcast receiver.
-     */
-    private class SettingsBroadcastReceiver extends BroadcastReceiver {
-	/**
-	 * Constructor.
-	 */
-	public SettingsBroadcastReceiver() {
-	}
-
-	@Override
-	public void onReceive(Context context, Intent intent) {
-	    Settings.this.setResult(RESULT_CANCELED);
-	}
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/utils/SortedList.java	Mon Jun 14 22:47:22 2010 +0200
@@ -0,0 +1,312 @@
+/*
+    BEEM is a videoconference application on the Android Platform.
+
+    Copyright (C) 2009 by Frederic-Charles Barthelery,
+                          Jean-Manuel Da Silva,
+                          Nikita Kozlov,
+                          Philippe Lago,
+                          Jean Baptiste Vergely,
+                          Vincent Veronis.
+
+    This file is part of BEEM.
+
+    BEEM is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    BEEM is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with BEEM.  If not, see <http://www.gnu.org/licenses/>.
+
+    Please send bug reports with examples or suggestions to
+    contact@beem-project.com or http://dev.beem-project.com/
+
+*/
+package com.beem.project.beem.utils;
+
+import java.util.List;
+import java.util.Comparator;
+import java.util.ListIterator;
+import java.util.Iterator;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * This class add a sort by insertion to a List.
+ * All methods which allow you to insert an object at a specific index
+ * will throw an UnsupportedOperationException.
+ *
+ * @author Da Risk <da_risk@beem-project.com>
+ * @param <E> the type of elements maintained by this list
+ */
+public class SortedList<E> implements List<E> {
+
+    private final List<E> mBackend;
+    private final Comparator<? super E> mComparator;
+
+    /**
+     * Create a SortedList. The existing elements will be sorted.
+     *
+     * @param list list to sort
+     * @param mComparator mComparator to use.
+     */
+    public SortedList(final List<E> list, final Comparator<? super E> mComparator) {
+	this.mComparator = mComparator;
+	this.mBackend = list;
+	Collections.sort(mBackend, mComparator);
+    }
+
+    @Override
+    public int size() {
+	return mBackend.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+	return mBackend.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+	return mBackend.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+	return new SortedListIterator<E>(mBackend.listIterator());
+    }
+
+    @Override
+    public Object[] toArray() {
+	return mBackend.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+	return mBackend.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+	for (ListIterator<E> it = mBackend.listIterator(); it.hasNext();) {
+	    if (mComparator.compare(e, it.next()) < 0) {
+		if (it.hasPrevious()) {
+		    it.previous();
+		}
+		it.add(e);
+		return true;
+	    }
+	}
+	mBackend.add(e);
+	return true;
+    }
+
+    @Override
+    public boolean remove(Object o) {
+	return mBackend.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+	return mBackend.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+	boolean result = false;
+	for (E e : c) {
+	    boolean t = add(e);
+	    if (t) {
+		result = t;
+	    }
+	}
+	return result;
+    }
+
+    /**
+     * Add all the elements in the specified collection.
+     * The index param is ignored.
+     *
+     * @param index ignored
+     * @param c collection containing elements to be added to this list
+     * @return true if this list changed as a result of the call
+     */
+    @Override
+    public boolean addAll(int index, Collection<? extends E> c) {
+	return addAll(c);
+    }
+
+    /**
+     * Add all the elements in the specified collection.
+     * The index param is ignored.
+     *
+     * @param l collection containing elements to be added to this list
+     * @return true if this list changed as a result of the call
+     * @see addAll(Collection)
+     */
+    public boolean addAll(SortedList<? extends E> l) {
+	if (!l.isEmpty()) {
+	    if (mBackend.isEmpty()) {
+		return mBackend.addAll(l);
+	    }
+	    boolean result = false;
+	    E myfirst = mBackend.get(0);
+	    E last = l.get(l.size() - 1);
+	    E mylast = mBackend.get(mBackend.size() - 1);
+	    E first = l.get(0);
+	    if (mComparator.compare(last, myfirst) < 0) {
+		result = mBackend.addAll(0, l);
+	    } else if (mComparator.compare(first, mylast) > 0) {
+		result = mBackend.addAll(l);
+	    } else {
+		Collection<? extends E> c = l;
+		result = addAll(c);
+	    }
+	    return result;
+	}
+	return false;
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+	return mBackend.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+	return mBackend.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+	mBackend.clear();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+	return mBackend.equals(o);
+    }
+
+    @Override
+    public int hashCode() {
+	return mBackend.hashCode();
+    }
+
+    @Override
+    public E get(int index) {
+	return mBackend.get(index);
+    }
+
+    @Override
+    public E set(int index, E element) {
+	throw new UnsupportedOperationException("set() is not supported in SortedList");
+    }
+
+    @Override
+    public void add(int index, E element) {
+	throw new UnsupportedOperationException("add at specific index is not supported in SortedList");
+    }
+
+    @Override
+    public E remove(int index) {
+	return mBackend.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+	return mBackend.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+	return mBackend.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<E> listIterator() {
+	return new SortedListIterator<E>(mBackend.listIterator());
+    }
+
+    @Override
+    public ListIterator<E> listIterator(int index) {
+	return new SortedListIterator<E>(mBackend.listIterator(index));
+    }
+
+    @Override
+    public List<E> subList(int fromIndex, int toIndex) {
+	return mBackend.subList(fromIndex, toIndex);
+    }
+
+    @Override
+    public String toString() {
+	return mBackend.toString();
+    }
+
+    /**
+     * A SortedList.iterator don't allow list modification.
+     * It use the mBackend iterator for the other operations.
+     */
+    private class SortedListIterator<E> implements ListIterator<E> {
+
+	private ListIterator<E> mIt;
+
+	/**
+	 * Construct SortedList.Iterator.
+	 *
+	 * @param iterator the iterator of the backend list
+	 */
+	SortedListIterator(final ListIterator<E> iterator) {
+	    mIt = iterator;
+	}
+
+	@Override
+	public void add(E e) {
+	    throw new UnsupportedOperationException("add() not supported in SortedList iterator");
+	}
+
+	@Override
+	public boolean hasNext() {
+	    return mIt.hasNext();
+	}
+
+	@Override
+	public E next() {
+	    return mIt.next();
+	}
+
+	@Override
+	public boolean hasPrevious() {
+	    return mIt.hasPrevious();
+	}
+
+	@Override
+	public E previous() {
+	    return mIt.previous();
+	}
+
+	@Override
+	public int nextIndex() {
+	    return mIt.nextIndex();
+	}
+
+	@Override
+	public int previousIndex() {
+	    return mIt.previousIndex();
+	}
+
+	@Override
+	public void remove() {
+	    mIt.remove();
+	}
+
+	@Override
+	public void set(E e) {
+	    throw new UnsupportedOperationException("set () not supported in SortedList iterator");
+	}
+    }
+}
--- a/src/com/beem/project/beem/utils/Status.java	Mon Jun 14 22:45:56 2010 +0200
+++ b/src/com/beem/project/beem/utils/Status.java	Mon Jun 14 22:47:22 2010 +0200
@@ -147,10 +147,10 @@
     /**
      * Check if contact is online by his status.
      * @param status contact status
-     * @return is obline
+     * @return is online
      */
     public static boolean statusOnline(final int status) {
-	return status != Status.CONTACT_STATUS_DISCONNECT && status != Status.CONTACT_STATUS_UNAVAILABLE;
+	return status != Status.CONTACT_STATUS_DISCONNECT;
     }
 
 }