Merge remote-tracking branch 'origin/master' into dev_codec_downloader

This commit is contained in:
Erwan Croze 2016-07-26 14:02:50 +02:00
commit 24d8accf5b
87 changed files with 2414 additions and 2158 deletions

View file

@ -4,7 +4,6 @@
<classpathentry kind="src" path="submodules/linphone/java/j2se"/> <classpathentry kind="src" path="submodules/linphone/java/j2se"/>
<classpathentry kind="src" path="submodules/linphone/java/common"/> <classpathentry kind="src" path="submodules/linphone/java/common"/>
<classpathentry kind="src" path="submodules/linphone/java/impl"/> <classpathentry kind="src" path="submodules/linphone/java/impl"/>
<classpathentry kind="src" path="submodules/externals/axmlrpc/src/main/java"/>
<classpathentry kind="src" path="submodules/linphone/coreapi/help/java"/> <classpathentry kind="src" path="submodules/linphone/coreapi/help/java"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>

1
.gitignore vendored
View file

@ -46,3 +46,4 @@ liblinphone_tester/tests.output
tests/linphonetester_* tests/linphonetester_*
tests/tests.output tests/tests.output
WORK WORK
.d

3
.gitmodules vendored
View file

@ -55,9 +55,6 @@
[submodule "submodules/externals/libupnp"] [submodule "submodules/externals/libupnp"]
path = submodules/externals/libupnp path = submodules/externals/libupnp
url = git://git.linphone.org/libupnp.git url = git://git.linphone.org/libupnp.git
[submodule "submodules/externals/axmlrpc"]
path = submodules/externals/axmlrpc
url = git://git.linphone.org/axmlrpc.git
[submodule "submodules/externals/opus"] [submodule "submodules/externals/opus"]
path = submodules/externals/opus path = submodules/externals/opus
url = git://git.linphone.org/opus.git url = git://git.linphone.org/opus.git

View file

@ -1,4 +1,4 @@
source.dir=src:submodules/linphone/mediastreamer2/java/src:submodules/linphone/java/j2se:submodules/linphone/java/common:submodules/linphone/java/impl:submodules/linphone/coreapi/help/java:submodules/externals/axmlrpc/src/main/java source.dir=src:submodules/linphone/mediastreamer2/java/src:submodules/linphone/java/j2se:submodules/linphone/java/common:submodules/linphone/java/impl:submodules/linphone/coreapi/help/java
key.store=bc-android.keystore key.store=bc-android.keystore
key.alias=nw8000 key.alias=nw8000
version.name=2.5.0 version.name=2.5.0

View file

@ -93,7 +93,7 @@
<property name="out.library.jar.file" location="${out.absolute.dir}/linphone.jar" /> <property name="out.library.jar.file" location="${out.absolute.dir}/linphone.jar" />
<jar destfile="${out.library.jar.file}"> <jar destfile="${out.library.jar.file}">
<fileset dir="${out.classes.absolute.dir}" <fileset dir="${out.classes.absolute.dir}"
includes="org/linphone/mediastream/**/*.class org/linphone/core/**/*.class org/linphone/**/*.class de/timroes/axmlrpc/**/*.class de/timroes/base64/Base64.class"/> includes="org/linphone/mediastream/**/*.class org/linphone/core/**/*.class org/linphone/**/*.class"/>
<fileset dir="submodules/linphone/java" > <fileset dir="submodules/linphone/java" >
<include name="common/org/linphone/core/*.java"/> <include name="common/org/linphone/core/*.java"/>
<include name="j2se/org/linphone/core/*.java"/> <include name="j2se/org/linphone/core/*.java"/>

View file

@ -86,6 +86,7 @@ class AndroidPreparator(prepare.Preparator):
self.min_supported_ndk = 10 self.min_supported_ndk = 10
self.max_supported_ndk = 12 self.max_supported_ndk = 12
self.unsupported_ndk_version = None self.unsupported_ndk_version = None
self.min_cmake_version = "3.0"
self.release_with_debug_info = True self.release_with_debug_info = True
self.veryclean = True self.veryclean = True
self.show_gpl_disclaimer = True self.show_gpl_disclaimer = True

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -55,7 +55,7 @@
android:id="@+id/username" android:id="@+id/username"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"

View file

@ -49,7 +49,7 @@
android:id="@+id/assistant_username" android:id="@+id/assistant_username"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -110,7 +110,7 @@
android:id="@+id/assistant_display_name" android:id="@+id/assistant_display_name"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textPersonName"
android:contentDescription="@string/content_description_display_field" android:contentDescription="@string/content_description_display_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"

View file

@ -53,7 +53,7 @@
android:id="@+id/assistant_username" android:id="@+id/assistant_username"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -107,7 +107,7 @@
android:id="@+id/assistant_display_name" android:id="@+id/assistant_display_name"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textPersonName"
android:contentDescription="@string/content_description_display_field" android:contentDescription="@string/content_description_display_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -132,7 +132,7 @@
android:id="@+id/assistant_domain" android:id="@+id/assistant_domain"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textUri"
android:contentDescription="@string/content_description_domain_field" android:contentDescription="@string/content_description_domain_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"

View file

@ -77,7 +77,6 @@
<LinearLayout <LinearLayout
android:id="@+id/fragmentContainer2" android:id="@+id/fragmentContainer2"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"

View file

@ -77,7 +77,6 @@
<LinearLayout <LinearLayout
android:id="@+id/fragmentContainer2" android:id="@+id/fragmentContainer2"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"

View file

@ -50,7 +50,7 @@
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
android:singleLine="true"/> android:singleLine="true"/>
@ -153,7 +153,7 @@
android:id="@+id/email" android:id="@+id/email"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="textEmailAddress"
android:contentDescription="@string/content_description_email_field" android:contentDescription="@string/content_description_email_field"
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -45,7 +45,7 @@
android:id="@+id/assistant_username" android:id="@+id/assistant_username"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -87,7 +87,7 @@
android:id="@+id/assistant_display_name" android:id="@+id/assistant_display_name"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textPersonName"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"

View file

@ -45,7 +45,7 @@
android:id="@+id/assistant_username" android:id="@+id/assistant_username"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="text|textEmailAddress" android:inputType="text|textNoSuggestions"
android:contentDescription="@string/content_description_username_field" android:contentDescription="@string/content_description_username_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -80,7 +80,7 @@
android:id="@+id/assistant_domain" android:id="@+id/assistant_domain"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textUri"
android:contentDescription="@string/content_description_domain_field" android:contentDescription="@string/content_description_domain_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
@ -98,7 +98,7 @@
android:id="@+id/assistant_display_name" android:id="@+id/assistant_display_name"
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:inputType="textEmailAddress" android:inputType="textPersonName"
android:contentDescription="@string/content_description_display_field" android:contentDescription="@string/content_description_display_field"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"

View file

@ -42,7 +42,7 @@
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:inputType="textEmailAddress" android:inputType="textNoSuggestions"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
android:paddingLeft="10dp" android:paddingLeft="10dp"
@ -84,7 +84,7 @@
android:background="@drawable/resizable_textfield" android:background="@drawable/resizable_textfield"
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:inputType="textEmailAddress" android:inputType="textUri"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="40dp"
android:paddingLeft="10dp" android:paddingLeft="10dp"

View file

@ -94,9 +94,9 @@
android:textColor="@color/colorB" android:textColor="@color/colorB"
android:imeOptions="flagNoExtractUi" android:imeOptions="flagNoExtractUi"
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:inputType="textMultiLine" android:inputType="textShortMessage|textMultiLine"
android:contentDescription="@string/content_description_message" android:contentDescription="@string/content_description_message"
android:maxLines="3" android:maxLines="2"
android:padding="5dp" android:padding="5dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:layout_weight="1" android:layout_weight="1"

View file

@ -72,8 +72,7 @@
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"/>
android:layout_marginLeft="5dp"/>
<ImageView <ImageView
android:id="@+id/mask" android:id="@+id/mask"
@ -81,8 +80,7 @@
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"/>
android:layout_marginLeft="5dp"/>
</RelativeLayout> </RelativeLayout>
@ -94,12 +92,20 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
<TextView
android:id="@+id/contactOrganization"
style="@style/font9"
android:singleLine="true"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TableLayout <TableLayout
android:id="@+id/controls" android:id="@+id/controls"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:stretchColumns="*" android:stretchColumns="*"
android:paddingTop="20dp"/> android:paddingTop="10dp"/>
</LinearLayout> </LinearLayout>

View file

@ -72,16 +72,31 @@
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:paddingRight="5dp" /> android:paddingRight="5dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/avatar_layout"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/delete"
android:layout_marginLeft="10dp">
<TextView <TextView
android:id="@+id/name" android:id="@+id/name"
android:lines="1" android:lines="1"
style="@style/font6" style="@style/font6"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/avatar_layout" android:layout_alignParentTop="true"/>
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/delete" <TextView
android:layout_marginLeft="10dp" /> android:id="@+id/contactOrganization"
style="@style/font9"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
<ImageView <ImageView
android:id="@+id/friendStatus" android:id="@+id/friendStatus"

View file

@ -41,7 +41,6 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="20dp"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> android:orientation="horizontal">

View file

@ -135,6 +135,26 @@
android:paddingRight="5dp" android:paddingRight="5dp"
android:inputType="textPersonName|textCapWords"/> android:inputType="textPersonName|textCapWords"/>
<TextView
android:text="@string/contact_organization"
style="@style/font13"
android:textAllCaps="true"
android:paddingTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/contactOrganization"
android:textCursorDrawable="@null"
android:background="@drawable/resizable_textfield"
style="@style/font6"
android:contentDescription="@string/content_description_contact_organization"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="left"
android:paddingRight="5dp"
android:inputType="textPersonName|textCapWords"/>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View file

@ -128,6 +128,15 @@
android:fastScrollAlwaysVisible="true" android:fastScrollAlwaysVisible="true"
android:dividerHeight="1dp" /> android:dividerHeight="1dp" />
<ProgressBar
android:id="@+id/contactsFetchInProgress"
style="?android:attr/progressBarStyle"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView <TextView
android:id="@+id/noSipContact" android:id="@+id/noSipContact"
android:text="@string/no_sip_contact" android:text="@string/no_sip_contact"

View file

@ -36,6 +36,17 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:padding="15dp"/> android:padding="15dp"/>
<ImageView
android:id="@+id/goto_contact"
android:visibility="gone"
android:src="@drawable/contact"
android:background="@drawable/toolbar_button"
android:contentDescription="@string/content_description_contacts"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:padding="15dp"/>
</LinearLayout> </LinearLayout>
<ScrollView <ScrollView
@ -46,13 +57,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:padding="10dp" android:padding="20dp"
android:orientation="vertical"> android:orientation="vertical">
<RelativeLayout <RelativeLayout
android:id="@+id/avatar_layout" android:id="@+id/avatar_layout"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center"> android:gravity="center">
@ -88,7 +97,6 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="10dp"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> android:orientation="horizontal">

Binary file not shown.

View file

@ -9,9 +9,15 @@
<string name="notification_registered">%s مُسجَّل‬</string> <string name="notification_registered">%s مُسجَّل‬</string>
<string name="notification_register_failure">‫فشل %s في التسجيل‬</string> <string name="notification_register_failure">‫فشل %s في التسجيل‬</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">لِنْفُونْ أندرويد %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">رخصة جْنُو العمومية الإصدار 2\n © 2010-2016 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string>
<string name="sync_account_name">جهات اتصال Linphone</string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">إسم المستخدم</string> <string name="username">اسم المستخدم</string>
<string name="display_name">الإسم المعروض</string> <string name="display_name">الاسم المعروض</string>
<string name="password">كلمة السر</string> <string name="password">كلمة السر</string>
<string name="confirm_password">تأكيد كلمة السر</string> <string name="confirm_password">تأكيد كلمة السر</string>
<string name="domain">النطاق</string> <string name="domain">النطاق</string>
@ -42,20 +48,20 @@
<string name="assistant_create_account">إنشاء الحساب</string> <string name="assistant_create_account">إنشاء الحساب</string>
<string name="assistant_finish">أنهِ التهئية</string> <string name="assistant_finish">أنهِ التهئية</string>
<string name="assistant_validate_account">لقد أُنشِيء حسابك. يُرجى الاطلاع على رسائل بريدك الإلكتروني لتأكيد حسابك. حالما تنتهي من ذلك، عُد إلى هنا واضغط على الزر.</string> <string name="assistant_validate_account">لقد أُنشِيء حسابك. يُرجى الاطلاع على رسائل بريدك الإلكتروني لتأكيد حسابك. حالما تنتهي من ذلك، عُد إلى هنا واضغط على الزر.</string>
<string name="assistant_welcome_desc">سيمكنك هذا المرشد من إعداد حسابك SIP لإجراء المكالمات.</string> <string name="assistant_welcome_desc">سيمكنك هذا المرشد من إعداد حساب SIP لإجراء المكالمات.</string>
<string name="assistant_linphone_login_desc">أدخِل اسم المستخدم وكلمة السر لحساب لِنْفُونْ</string> <string name="assistant_linphone_login_desc">أدخِل اسم المستخدم وكلمة السر لحساب لِنْفُونْ</string>
<string name="assistant_login_desc">‫أدخِل اسم المستخدم وكلمة السر الحساب مع نطاق SIP</string> <string name="assistant_login_desc">‫أدخِل اسم المستخدم وكلمة السر الحساب مع نطاق SIP</string>
<string name="assistant_remote_provisioning_desc">يٌرجى إدخال عنوان التهئية البعيدة</string> <string name="assistant_remote_provisioning_desc">يٌرجى إدخال عنوان التهئية البعيدة</string>
<string name="transport">النقل</string> <string name="transport">النقل</string>
<string name="assistant_login_linphone">استخدم حساب لِنْفُونْ</string> <string name="assistant_login_linphone">استخدم حساب لِنْفُونْ</string>
<string name="assistant_login_generic">استخدم حساب SIP</string> <string name="assistant_login_generic">استخدم حساب SIP</string>
<string name="assistant_remote_provisioning">اجذب التهئية البعيدة</string> <string name="assistant_remote_provisioning">اجذب التهيئة البعيدة</string>
<string name="assistant_create_account_part_1">1/2</string> <string name="assistant_create_account_part_1">1/2</string>
<string name="assistant_create_account_part_2">2/2</string> <string name="assistant_create_account_part_2">2/2</string>
<string name="assistant_display_name_optional">الاسم المعروض (اختياري)</string> <string name="assistant_display_name_optional">الاسم المعروض (اختياري)</string>
<string name="assistant_linphone_account">هيِّءْ حساب لِنْفُونْ</string> <string name="assistant_linphone_account">هيِّءْ حساب لِنْفُونْ</string>
<string name="assistant_generic_account">هيِّءْ حساب SIP</string> <string name="assistant_generic_account">هيِّءْ حساب SIP</string>
<string name="assistant_remote_provisioning_title">اجذب التهئية البعيدة</string> <string name="assistant_remote_provisioning_title">اجذب التهيئة البعيدة</string>
<string name="assistant_fetch_apply">اجذبْ وطبِّق</string> <string name="assistant_fetch_apply">اجذبْ وطبِّق</string>
<string name="assistant_login">الولوج</string> <string name="assistant_login">الولوج</string>
<string name="assistant_ec_calibration">معايرة مزيل الصدى في طور الإنجاز</string> <string name="assistant_ec_calibration">معايرة مزيل الصدى في طور الإنجاز</string>
@ -71,7 +77,7 @@
<string name="wizard_password_incorrect">كلمة السر غير صحيحة.</string> <string name="wizard_password_incorrect">كلمة السر غير صحيحة.</string>
<string name="wizard_passwords_unmatched">كلمتا السر غير متطابقتين.</string> <string name="wizard_passwords_unmatched">كلمتا السر غير متطابقتين.</string>
<string name="setup_confirm_username">سيكون اسم المستخدم هو %s.\r\n\r\nقد يختلف عما أدخلته ليوافق المعايير.\r\nأتقبل ذلك ؟</string> <string name="setup_confirm_username">سيكون اسم المستخدم هو %s.\r\n\r\nقد يختلف عما أدخلته ليوافق المعايير.\r\nأتقبل ذلك ؟</string>
<string name="first_launch_no_login_password">يُرجى إدخال إسم المستخدم وكلمة السر</string> <string name="first_launch_no_login_password">يُرجى إدخال اسم المستخدم وكلمة السر</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">أدخل رقما أو عنوانا</string> <string name="address_bar_hint">أدخل رقما أو عنوانا</string>
<!--History--> <!--History-->
@ -132,7 +138,7 @@
<string name="call_stats_download">صبيب التنزيل :</string> <string name="call_stats_download">صبيب التنزيل :</string>
<string name="call_stats_ice">توصيل ICE :</string> <string name="call_stats_ice">توصيل ICE :</string>
<string name="call_stats_video_resolution">مقاس الفيديو :</string> <string name="call_stats_video_resolution">مقاس الفيديو :</string>
<string name="call">مكالمة</string> <string name="call">المكالمة</string>
<!--About--> <!--About-->
<string name="menu_send_log">إرسال السجل</string> <string name="menu_send_log">إرسال السجل</string>
<string name="menu_reset_log">إعادة تعيين السجل</string> <string name="menu_reset_log">إعادة تعيين السجل</string>
@ -212,6 +218,7 @@
<string name="pref_echo_cancellation_summary">إزالة الصدى المسموع من الطرف الآخر</string> <string name="pref_echo_cancellation_summary">إزالة الصدى المسموع من الطرف الآخر</string>
<string name="pref_echo_canceller_calibration">معايرة مزيل الصدى</string> <string name="pref_echo_canceller_calibration">معايرة مزيل الصدى</string>
<string name="ec_calibrating">يُعايِر...</string> <string name="ec_calibrating">يُعايِر...</string>
<string name="ec_calibrated">‫جرت المعايرة بـ %s ms</string>
<string name="no_echo">لا وجود لصدى</string> <string name="no_echo">لا وجود لصدى</string>
<string name="failed">فشِل</string> <string name="failed">فشِل</string>
<string name="pref_adaptive_rate_control">التحكم في ملائمة الصبيب</string> <string name="pref_adaptive_rate_control">التحكم في ملائمة الصبيب</string>
@ -224,15 +231,19 @@
<string name="pref_video_initiate_call_with_video">أرسِل دائما طلبات الفيديو</string> <string name="pref_video_initiate_call_with_video">أرسِل دائما طلبات الفيديو</string>
<string name="pref_video_automatically_accept_video_title">قبول طلبات الفيديو الواردة</string> <string name="pref_video_automatically_accept_video_title">قبول طلبات الفيديو الواردة</string>
<string name="pref_video_automatically_accept_video">قبول طلبات الفيديو دائما</string> <string name="pref_video_automatically_accept_video">قبول طلبات الفيديو دائما</string>
<string name="pref_video_preset">إعداد الفيديو المسبق</string>
<string name="pref_preferred_video_size">حجم الفيديو المفضل</string> <string name="pref_preferred_video_size">حجم الفيديو المفضل</string>
<string name="pref_preferred_fps">معدل الإطارات المفضل</string> <string name="pref_preferred_fps">معدل الإطارات المفضل</string>
<string name="pref_bandwidth_limit">حد سعة القناة بـ ك.بِتْ/ثانية</string> <string name="pref_bandwidth_limit">حد سعة القناة بـ ك.بِتْ/ثانية</string>
<string name="pref_video_codecs_title">المراميز</string> <string name="pref_video_codecs_title">المراميز</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">مكالمة</string> <string name="pref_call_title">المكالمة</string>
<string name="pref_rfc2833_dtmf">إرسال RFC2833 DTMFs</string> <string name="pref_rfc2833_dtmf">إرسال RFC2833 DTMFs</string>
<string name="pref_sipinfo_dtmf">إرسال SIP INFO DTMFs</string> <string name="pref_sipinfo_dtmf">إرسال SIP INFO DTMFs</string>
<string name="pref_voice_mail">عنوان العلبة الصوتية</string> <string name="pref_voice_mail">عنوان العلبة الصوتية</string>
<!--Chat settings-->
<string name="pref_chat_title">المحادثة</string>
<string name="pref_image_sharing_server_title">خادم المشاركة</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">الشبكة</string> <string name="pref_network_title">الشبكة</string>
<string name="pref_wifi_only">استخدم WiFi فقط</string> <string name="pref_wifi_only">استخدم WiFi فقط</string>
@ -255,7 +266,6 @@
<string name="pref_animation_enable_title">تشغيل التحريكات</string> <string name="pref_animation_enable_title">تشغيل التحريكات</string>
<string name="pref_autostart">البدء خلال الإقلاع</string> <string name="pref_autostart">البدء خلال الإقلاع</string>
<string name="pref_incoming_call_timeout_title">مهلة الانتظار قبل رفض المكالمة (بالثواني)</string> <string name="pref_incoming_call_timeout_title">مهلة الانتظار قبل رفض المكالمة (بالثواني)</string>
<string name="pref_image_sharing_server_title">خادم المشاركة</string>
<string name="pref_remote_provisioning_title">التهيئة عن بعد</string> <string name="pref_remote_provisioning_title">التهيئة عن بعد</string>
<string name="pref_primary_account_title">الحساب اﻷوَّلي</string> <string name="pref_primary_account_title">الحساب اﻷوَّلي</string>
<string name="pref_display_name_title">الإسم المعروض</string> <string name="pref_display_name_title">الإسم المعروض</string>
@ -269,18 +279,22 @@
<!--Content description--> <!--Content description-->
<string name="content_description_back">الرجوع</string> <string name="content_description_back">الرجوع</string>
<string name="content_description_dialer">لوحة المفاتيح</string> <string name="content_description_dialer">لوحة المفاتيح</string>
<string name="content_description_menu">القائمة</string>
<string name="content_description_toggle_micro">تبديل الميكروفون</string> <string name="content_description_toggle_micro">تبديل الميكروفون</string>
<string name="content_description_toggle_speaker">تبديل مكبر الصوت</string> <string name="content_description_toggle_speaker">تبديل مكبر الصوت</string>
<string name="content_description_decline">رفض</string> <string name="content_description_decline">رفض</string>
<string name="content_description_hang_up">ضع السماعة</string> <string name="content_description_hang_up">ضع السماعة</string>
<string name="content_description_accept">قبول</string> <string name="content_description_accept">قبول</string>
<string name="content_description_edit">تحرير</string> <string name="content_description_edit">تحرير</string>
<string name="content_description_edit_list">حرر القائمة</string>
<string name="content_description_valid">صحيح</string>
<string name="content_description_add_contact">إضافة إلى جهات الاتصال</string> <string name="content_description_add_contact">إضافة إلى جهات الاتصال</string>
<string name="content_description_new_contact">جهة اتصال جديدة</string> <string name="content_description_new_contact">جهة اتصال جديدة</string>
<string name="content_description_call">مكالمة</string> <string name="content_description_call">المكالمة</string>
<string name="content_description_backspace">مسافة</string> <string name="content_description_backspace">مسافة</string>
<string name="content_description_chat">المحادثة</string> <string name="content_description_chat">المحادثة</string>
<string name="content_description_dial_back">إعادة الاتصال</string> <string name="content_description_dial_back">إعادة الاتصال</string>
<string name="content_description_dialer_back">الرجوع إلى لوحة المفاتيح</string>
<string name="content_description_contact_picture">صورة جهة الاتصال</string> <string name="content_description_contact_picture">صورة جهة الاتصال</string>
<string name="content_description_send_message">إرسال رسالة</string> <string name="content_description_send_message">إرسال رسالة</string>
<string name="content_description_detail">التفاصيل</string> <string name="content_description_detail">التفاصيل</string>
@ -288,6 +302,7 @@
<string name="content_description_add">إضافة مكالمة</string> <string name="content_description_add">إضافة مكالمة</string>
<string name="content_description_new_discussion">محادثة جديدة</string> <string name="content_description_new_discussion">محادثة جديدة</string>
<string name="content_description_search">بحث</string> <string name="content_description_search">بحث</string>
<string name="content_description_search_contact">ابحث عن جهة الاتصال</string>
<string name="content_description_all_contacts">كل جهات الاتصال</string> <string name="content_description_all_contacts">كل جهات الاتصال</string>
<string name="content_description_linphone_contacts">جهات اتصال Linphone</string> <string name="content_description_linphone_contacts">جهات اتصال Linphone</string>
<string name="content_description_call_direction">اتجاه الاتصال</string> <string name="content_description_call_direction">اتجاه الاتصال</string>
@ -306,9 +321,26 @@
<string name="content_description_cancel_button">زر الإلغاء</string> <string name="content_description_cancel_button">زر الإلغاء</string>
<string name="content_description_message_status">حالة الرسالة</string> <string name="content_description_message_status">حالة الرسالة</string>
<string name="content_description_conference">اجتماع</string> <string name="content_description_conference">اجتماع</string>
<string name="content_description_username_field">حقل اسم المستخدم</string>
<string name="content_description_display_field">اعرض حقل الاسم</string>
<string name="content_description_domain_field">حقل النطاق</string>
<string name="content_description_url_field">حقل التهيئة البعيدة</string>
<string name="content_description_confirm_password_field">حقل تأكيد كلمة السر</string>
<string name="content_description_email_field">حقل البريد الإلكتروني</string>
<string name="content_description_default_account">الحساب الافتراضي</string> <string name="content_description_default_account">الحساب الافتراضي</string>
<string name="content_description_deselect_all">أزل تحديد الكل</string>
<string name="content_description_select_all">حدد الكل</string>
<string name="content_description_delete_selection">احذف التحديد</string>
<string name="content_description_contact_first_name">اﻹسم</string> <string name="content_description_contact_first_name">اﻹسم</string>
<string name="content_description_contact_last_name">اللقب</string> <string name="content_description_contact_last_name">اللقب</string>
<string name="content_description_back_call">ارجع إلى المكالمة</string>
<string name="content_description_send_file">أرسل ملفا</string>
<string name="content_description_message">رسالة</string>
<string name="content_description_unread_chat_message">الرسائل غير المقروءة</string>
<string name="content_description_transfer">تحويل</string> <string name="content_description_transfer">تحويل</string>
<string name="content_description_earpiece">سماعة الأذن</string>
<string name="content_description_bluetooth">بلوتوث</string> <string name="content_description_bluetooth">بلوتوث</string>
<string name="content_description_call_options">خيارات المكالمة</string>
<string name="content_description_audio_route">توجيه الصوت</string>
<string name="content_description_exit_conference">مغادرة الاجتماع</string>
</resources> </resources>

View file

@ -6,11 +6,28 @@
<string name="addressbook_label">Linphone</string> <string name="addressbook_label">Linphone</string>
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Startvorgang</string> <string name="wait_dialog_text">Startvorgang</string>
<string name="notification_registered">%s registriert</string>
<string name="notification_register_failure">%s konnte nicht registrieren</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone-Kern %s</string>
<string name="about_text">GNU General Public License V2\n © 2010-2016 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string>
<string name="sync_account_name">Linphone-Kontakte</string>
<string name="history_date_format">EEE, t MMM</string>
<string name="history_detail_date_format">jjjj/MM/tt - HH:mm - </string>
<string name="messages_date_format">tt/MM, HH:mm</string>
<string name="messages_list_date_format">tt/MM</string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">Benutzername</string> <string name="username">Benutzername</string>
<string name="display_name">Anzeigename</string> <string name="display_name">Anzeigename</string>
<string name="password">Passwort</string> <string name="password">Passwort</string>
<string name="confirm_password">Passwortbestätigung</string>
<string name="domain">Domain</string>
<string name="remote_provisioning_url">URL</string>
<string name="email">E-Mail</string>
<string name="delete_text">Sind Sie sicher, dass Sie Ihre Auswahl löschen möchten?</string>
<string name="delete">Löschen</string> <string name="delete">Löschen</string>
<string name="retry">Erneut versuchen</string> <string name="retry">Erneut versuchen</string>
<string name="cancel">Abbrechen</string> <string name="cancel">Abbrechen</string>
@ -18,34 +35,75 @@
<string name="continue_text">Fortsetzen</string> <string name="continue_text">Fortsetzen</string>
<string name="about">Über</string> <string name="about">Über</string>
<string name="deny">Verweigern</string> <string name="deny">Verweigern</string>
<string name="no_account">Kein Konto konfiguriert</string>
<string name="search">Suchen</string> <string name="search">Suchen</string>
<string name="outgoing">Ausgehend</string> <string name="outgoing">Ausgehend</string>
<string name="incoming">Eingehend</string> <string name="incoming">Eingehend</string>
<string name="missed">Verpasst</string> <string name="missed">Verpasst</string>
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="connect">Verbindung</string>
<string name="decline">Ablehnen</string> <string name="decline">Ablehnen</string>
<string name="conference">Konferenz</string> <string name="conference">Konferenz</string>
<!--Launch screen--> <!--Launch screen-->
<string name="app_description">der <i>freie</i> SIP-Client</string>
<!--Assistant--> <!--Assistant-->
<string name="welcome">Willkommen</string>
<string name="assistant">Assistent</string>
<string name="assistant_create_account">Konto erstellen</string>
<string name="assistant_finish">Konfiguration fertigstellen</string>
<string name="assistant_validate_account">Ihr Konto ist erstellt. Bitte überprüfen Sie Ihre E-Mails, um Ihr Konto zu bestätigen. Sobald das gemacht ist, kommen Sie hierher zurück und klicken Sie auf die Schaltfläche.</string>
<string name="assistant_welcome_desc">Dieser Assistent wird Ihnen dabei helfen, ein SIP-Konto für Ihre Anrufe zu verwenden.</string> <string name="assistant_welcome_desc">Dieser Assistent wird Ihnen dabei helfen, ein SIP-Konto für Ihre Anrufe zu verwenden.</string>
<string name="assistant_linphone_login_desc">Geben Sie Ihren Benutzernamen und Passwort des Linphone-Kontos ein</string>
<string name="assistant_login_desc">Geben Sie Ihren Benutzernamen und Passwort mit Ihrer SIP-Domäne ein</string>
<string name="assistant_remote_provisioning_desc">Bitte geben Sie eine Bereitstellungs-URL an</string>
<string name="transport">Transport</string> <string name="transport">Transport</string>
<string name="assistant_login_linphone">Linphone-Konto verwenden</string>
<string name="assistant_login_generic">SIP-Konto verwenden</string>
<string name="assistant_remote_provisioning">Fernkonfiguration abrufen</string>
<string name="assistant_create_account_part_1">1/2</string>
<string name="assistant_create_account_part_2">2/2</string>
<string name="assistant_display_name_optional">Anzeigename (optional)</string>
<string name="assistant_linphone_account">Linphone-Konto konfigurieren</string>
<string name="assistant_generic_account">SIP-Konto konfigurieren</string>
<string name="assistant_remote_provisioning_title">Fernkonfiguration abrufen</string>
<string name="assistant_fetch_apply">Abrufen und anwenden</string>
<string name="assistant_login">Anmelden</string>
<string name="assistant_ec_calibration">Echounterdrückungskalibrierung läuft</string>
<string name="assistant_remote_provisioning_login">Geben Sie Ihre Anmeldung ein</string>
<string name="assistant_account_not_validated">Ihr Konto wurde noch nicht überprüft.</string> <string name="assistant_account_not_validated">Ihr Konto wurde noch nicht überprüft.</string>
<string name="assistant_account_validated">Ihr Konto wurde überprüft.</string> <string name="assistant_account_validated">Ihr Konto wurde überprüft.</string>
<string name="assistant_error_bad_credentials">Falscher Benutzername oder Passwort</string>
<string name="wizard_failed">Es ist ein Fehler aufgetreten, versuchen Sie es später nochmal</string> <string name="wizard_failed">Es ist ein Fehler aufgetreten, versuchen Sie es später nochmal</string>
<string name="wizard_server_unavailable">Server nicht erreichbar, überprüfen Sie Ihre Netzwerkverbindung.</string>
<string name="wizard_username_unavailable">Der Benutzername wird bereits verwendet.</string> <string name="wizard_username_unavailable">Der Benutzername wird bereits verwendet.</string>
<string name="wizard_username_incorrect">Ihr Benutzername ist ungültig.</string>
<string name="wizard_email_incorrect">Ihre E-Mail-Adresse ist ungültig.</string>
<string name="wizard_password_incorrect">Ihr Passwort ist ungültig.</string>
<string name="wizard_passwords_unmatched">Passwörter stimmen nicht überein.</string>
<string name="setup_confirm_username">Ihr Benutzername wird %s sein.\r\n\r\nIt kann von Ihrer Eingabe abweichen, um Anforderungen zu entsprechen.\r\nNehmen Sie an?</string>
<string name="first_launch_no_login_password">Bitte geben Sie Ihren Benutzername und Ihr Passwort ein</string> <string name="first_launch_no_login_password">Bitte geben Sie Ihren Benutzername und Ihr Passwort ein</string>
<string name="forgot_password">Passwort vergessen?</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">Geben Sie eine Nummer oder eine Adresse ein</string>
<!--History--> <!--History-->
<string name="no_call_history">Kein Anruf in Ihrer Chronik</string>
<string name="no_missed_call_history">Kein verpasster Anruf in Ihrer Chronik</string>
<string name="delete_history_log">Möchten Sie das ausgewählte Anrufprotokoll löschen?</string>
<string name="today">Heute</string> <string name="today">Heute</string>
<string name="yesterday">Gestern</string> <string name="yesterday">Gestern</string>
<!--Contacts--> <!--Contacts-->
<string name="no_contact">Kein Kontakt in Ihrem Adressbuch.</string> <string name="no_contact">Kein Kontakt in Ihrem Adressbuch.</string>
<string name="no_sip_contact">Kein SIP-Kontakt in Ihrem Adressbuch.</string> <string name="no_sip_contact">Kein SIP-Kontakt in Ihrem Adressbuch.</string>
<string name="delete_contacts">Möchten Sie die ausgewählten Kontakte löschen?</string>
<string name="delete_contact">Möchten Sie den ausgewählten Kontakt löschen?</string>
<string name="sip_address">SIP-Adresse</string> <string name="sip_address">SIP-Adresse</string>
<string name="phone_number">Telefonnummer</string> <string name="phone_number">Telefonnummer</string>
<string name="contact_first_name">Vorname</string> <string name="contact_first_name">Vorname</string>
<string name="contact_last_name">Nachname</string> <string name="contact_last_name">Nachname</string>
<!--Chat--> <!--Chat-->
<string name="no_chat_history">Keine Gespräche</string>
<string name="delete_conversation">Möchten Sie das ausgewählte Gespräch löschen?</string>
<string name="delete_message">Möchten Sie die ausgewählte Nachricht löschen?</string>
<string name="remote_composing">Partner schreibt...</string> <string name="remote_composing">Partner schreibt...</string>
<string name="share_picture_size_small">Klein</string> <string name="share_picture_size_small">Klein</string>
<string name="share_picture_size_medium">Mittel</string> <string name="share_picture_size_medium">Mittel</string>
@ -60,13 +118,23 @@
<string name="processing_image">Bild wird verarbeitet. Je nach Größe der Datei kann dies mehrere Sekunden in Anspruch nehmen</string> <string name="processing_image">Bild wird verarbeitet. Je nach Größe der Datei kann dies mehrere Sekunden in Anspruch nehmen</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Registriert</string> <string name="status_connected">Registriert</string>
<string name="status_not_connected">Nicht registriert</string>
<string name="status_in_progress">Registrierung in Arbeit</string> <string name="status_in_progress">Registrierung in Arbeit</string>
<string name="status_error">Registierung fehlgeschlagen</string> <string name="status_error">Registierung fehlgeschlagen</string>
<string name="voicemail_unread">ungelesene Nachrichten</string> <string name="voicemail_unread">ungelesene Nachrichten</string>
<!--Side Menu--> <!--Side Menu-->
<string name="menu_assistant">Assistent</string>
<string name="menu_settings">Einstellungen</string> <string name="menu_settings">Einstellungen</string>
<string name="menu_about">Über</string> <string name="menu_about">Über</string>
<string name="quit">Schließen</string>
<!--Call--> <!--Call-->
<string name="incoming_call">eingehender Anruf</string>
<string name="outgoing_call">ausgehender Anruf</string>
<string name="add_video_dialog">Ihr Partner möchte Video einschalten</string>
<string name="no_current_call">Kein aktiver Anruf</string>
<string name="call_paused_by_remote">Ihr Partner hat den Anruf pausiert</string>
<string name="couldnt_accept_call">Beim Annehmen des Anrufs ist ein Fehler aufgetreten</string>
<string name="zrtp_dialog">ZRTP-Token ist %s\nSie sollten nur annehmen, wenn Sie den gleichen Token wie Ihr Partner haben</string>
<string name="unknown_incoming_call_name">Unbekannt</string> <string name="unknown_incoming_call_name">Unbekannt</string>
<string name="call_stats_audio">Audio</string> <string name="call_stats_audio">Audio</string>
<string name="call_stats_video">Video</string> <string name="call_stats_video">Video</string>
@ -88,16 +156,20 @@
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">Warnung: Dienst ist nicht bereit</string> <string name="skipable_error_service_not_ready">Warnung: Dienst ist nicht bereit</string>
<string name="error">Fehler</string> <string name="error">Fehler</string>
<string name="warning_wrong_destination_address">Kann Zieladresse aus %s nicht bauen</string>
<string name="error_unknown">Unbekannter Fehler</string> <string name="error_unknown">Unbekannter Fehler</string>
<string name="error_call_declined">Anruf abgelehnt</string> <string name="error_call_declined">Anruf abgelehnt</string>
<string name="error_user_not_found">Benutzer nicht gefunden</string> <string name="error_user_not_found">Benutzer nicht gefunden</string>
<string name="error_incompatible_media">Inkompatible Medienparameter</string> <string name="error_incompatible_media">Inkompatible Medienparameter</string>
<string name="error_low_bandwidth">Ihr Partner hat eine niedrige Bandbreite, Video kann nicht gestartet werden</string>
<string name="error_network_unreachable">Netzwerk ist nicht erreichbar</string> <string name="error_network_unreachable">Netzwerk ist nicht erreichbar</string>
<string name="error_bad_credentials">Falsche Anmeldedaten</string> <string name="error_bad_credentials">Falsche Anmeldedaten</string>
<string name="error_unauthorized">Unzulässig</string> <string name="error_unauthorized">Unzulässig</string>
<string name="error_io_error">Netzwerkfehler</string> <string name="error_io_error">Netzwerkfehler</string>
<string name="download_image_failed">Herunterladen fehlgeschlagen. Bitte überprüfen Sie Ihre Netzwerkverbindung oder versuchen Sie es später erneut.</string>
<string name="remote_provisioning_failure">Fehler beim Herunterladen oder Anwenden des Fernbereitstellungsprofils...</string> <string name="remote_provisioning_failure">Fehler beim Herunterladen oder Anwenden des Fernbereitstellungsprofils...</string>
<string name="remote_provisioning_again_title">Fernbereitstellung</string> <string name="remote_provisioning_again_title">Fernbereitstellung</string>
<string name="remote_provisioning_again_message">Möchten Sie die Bereitstellungs-URI ändern?</string>
<!--Account Settings--> <!--Account Settings-->
<string name="pref_sipaccount">SIP-Konto</string> <string name="pref_sipaccount">SIP-Konto</string>
<string name="pref_manage_title">Verwalten</string> <string name="pref_manage_title">Verwalten</string>
@ -111,13 +183,16 @@
<string name="pref_help_outbound_proxy">Alle Anrufe üder einen SIP Proxy leiten</string> <string name="pref_help_outbound_proxy">Alle Anrufe üder einen SIP Proxy leiten</string>
<string name="pref_help_username">Beispiel: John, wenn ihr Konto john@sip.example.org ist</string> <string name="pref_help_username">Beispiel: John, wenn ihr Konto john@sip.example.org ist</string>
<string name="pref_help_domain">sip.example.org, wenn Ihr Konto john@sip.example.org ist</string> <string name="pref_help_domain">sip.example.org, wenn Ihr Konto john@sip.example.org ist</string>
<string name="pref_help_password">Sie müssen Ihr Passwort erneut eingeben, wenn Sie Ihren Benutzernamen und/oder Domain ändern</string> <string name="pref_help_password">Sie müssen Ihr Passwort erneut eingeben, wenn Sie Ihren Benutzernamen und/oder Domain bearbeiten</string>
<string name="pref_expire_title">Ablaufen</string> <string name="pref_expire_title">Ablaufen</string>
<string name="pref_avpf">AVPF</string> <string name="pref_avpf">AVPF</string>
<string name="pref_avpf_rr_interval"> AVPF Standard RTCP Interval in Sekunden (zwischen 1 und 5)</string> <string name="pref_avpf_rr_interval"> AVPF Standard RTCP Interval in Sekunden (zwischen 1 und 5)</string>
<string name="pref_escape_plus">Ersetzen + durch 00</string> <string name="pref_escape_plus">Ersetzen + durch 00</string>
<string name="pref_friendlist_subscribe">Freundesliste abonnieren</string>
<string name="pref_auth_userid">Authentifizierungs-Benutzerkennung</string> <string name="pref_auth_userid">Authentifizierungs-Benutzerkennung</string>
<string name="pref_help_auth_userid">Authentifizierungs-Benutzerkennung eingeben (optional)</string>
<string name="pref_display_name">Anzeigename</string> <string name="pref_display_name">Anzeigename</string>
<string name="pref_help_display_name">Anzeigename eingeben (optional)</string>
<string name="pref_prefix">Präfix</string> <string name="pref_prefix">Präfix</string>
<string name="pref_transport">Transport</string> <string name="pref_transport">Transport</string>
<string name="pref_transport_udp">UDP</string> <string name="pref_transport_udp">UDP</string>
@ -147,7 +222,9 @@
<string name="pref_audio_title">Audio</string> <string name="pref_audio_title">Audio</string>
<string name="pref_echo_cancellation">Echounterdrückung</string> <string name="pref_echo_cancellation">Echounterdrückung</string>
<string name="pref_echo_cancellation_summary">Entfernt das Echo, das am anderen Ende gehört wird</string> <string name="pref_echo_cancellation_summary">Entfernt das Echo, das am anderen Ende gehört wird</string>
<string name="pref_echo_canceller_calibration">Echounterdrückungskalibrierung</string>
<string name="ec_calibrating">Kalibrierung...</string> <string name="ec_calibrating">Kalibrierung...</string>
<string name="ec_calibrated">Kalibriert in %s ms</string>
<string name="no_echo">Kein Echo</string> <string name="no_echo">Kein Echo</string>
<string name="failed">fehlgeschlagen</string> <string name="failed">fehlgeschlagen</string>
<string name="pref_adaptive_rate_control">Adaptive Ratenregelung</string> <string name="pref_adaptive_rate_control">Adaptive Ratenregelung</string>
@ -155,20 +232,34 @@
<string name="pref_codecs">Codecs</string> <string name="pref_codecs">Codecs</string>
<!--Video settings--> <!--Video settings-->
<string name="pref_video_title">Video</string> <string name="pref_video_title">Video</string>
<string name="pref_overlay">Videoeinblendung</string>
<string name="pref_overlay_summary">Anrufvideo in Einblendung anzeigen, wenn Sie außerhalb der Anwendung sind</string>
<string name="pref_video_use_front_camera_title">Frontkamera benutzen</string> <string name="pref_video_use_front_camera_title">Frontkamera benutzen</string>
<string name="pref_video_initiate_call_with_video_title">Videoanrufe starten</string> <string name="pref_video_initiate_call_with_video_title">Videoanrufe starten</string>
<string name="pref_video_initiate_call_with_video">Immer Videoanfragen senden</string> <string name="pref_video_initiate_call_with_video">Immer Videoanfragen senden</string>
<string name="pref_video_automatically_accept_video_title">Eingehende Videoanfragen annehmen</string> <string name="pref_video_automatically_accept_video_title">Eingehende Videoanfragen annehmen</string>
<string name="pref_video_automatically_accept_video">Videoanfragen immer annehmen</string> <string name="pref_video_automatically_accept_video">Videoanfragen immer annehmen</string>
<string name="pref_video_preset">Videovoreinstellung</string>
<string name="pref_preferred_video_size">Bevorzugte Videogröße</string> <string name="pref_preferred_video_size">Bevorzugte Videogröße</string>
<string name="pref_preferred_fps">Bevorzugte FPS</string>
<string name="pref_bandwidth_limit">Bandbreitenbegrenzung in kbits/s</string> <string name="pref_bandwidth_limit">Bandbreitenbegrenzung in kbits/s</string>
<string name="pref_video_codecs_title">Codecs</string> <string name="pref_video_codecs_title">Codecs</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Anruf</string> <string name="pref_call_title">Anruf</string>
<string name="pref_rfc2833_dtmf">RFC2833 DTMFs senden</string> <string name="pref_rfc2833_dtmf">RFC2833 DTMFs senden</string>
<string name="pref_sipinfo_dtmf">SIP INFO DTMFs senden</string> <string name="pref_sipinfo_dtmf">SIP INFO DTMFs senden</string>
<string name="pref_voice_mail">Sprachnachricht-URI</string>
<!--Chat settings-->
<string name="pref_chat_title">Nachrichten</string>
<string name="pref_image_sharing_server_title">Gemeinsamer Server</string>
<string name="pref_image_sharing_server_desc">Nicht bearbeiten, außer Sie wissen, was Sie tun!</string>
<string name="pref_use_lime_encryption">LIME-Verschlüsselung verwenden</string>
<string name="lime_encryption_entry_disabled">Deaktiviert</string>
<string name="lime_encryption_entry_mandatory">Obligatorisch</string>
<string name="lime_encryption_entry_preferred">Bevorzugt</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Netzwerk</string> <string name="pref_network_title">Netzwerk</string>
<string name="pref_wifi_only">Nur WiFi verwenden</string>
<string name="pref_stun_server">Stun-Server</string> <string name="pref_stun_server">Stun-Server</string>
<string name="pref_ice_enable">ICE aktivieren</string> <string name="pref_ice_enable">ICE aktivieren</string>
<string name="pref_upnp_enable">UPNP aktivieren</string> <string name="pref_upnp_enable">UPNP aktivieren</string>
@ -180,12 +271,15 @@
<string name="pref_audio_port_description">Audioport oder Portbereich (Min.Port-Max.Port)</string> <string name="pref_audio_port_description">Audioport oder Portbereich (Min.Port-Max.Port)</string>
<string name="pref_media_encryption">Medienverschlüsselung</string> <string name="pref_media_encryption">Medienverschlüsselung</string>
<string name="pref_push_notification">Push-Benachrichtigungen aktivieren</string> <string name="pref_push_notification">Push-Benachrichtigungen aktivieren</string>
<string name="pref_ipv6_title">IPv6 erlauben</string>
<!--Advanced settings--> <!--Advanced settings-->
<string name="pref_advanced_title">Erweitert</string> <string name="pref_advanced_title">Erweitert</string>
<string name="pref_debug">Debug</string> <string name="pref_debug">Debug</string>
<string name="pref_background_mode">Hintergrundmodus</string> <string name="pref_background_mode">Hintergrundmodus</string>
<string name="pref_animation_enable_title">Animationen aktivieren</string> <string name="pref_animation_enable_title">Animationen aktivieren</string>
<string name="pref_service_notification">Dienstbenachrichtigung aktivieren</string>
<string name="pref_autostart">Beim Einschalten starten</string> <string name="pref_autostart">Beim Einschalten starten</string>
<string name="pref_incoming_call_timeout_title">Auflegen bei eingehendem Anruf (in Sekunden)</string>
<string name="pref_remote_provisioning_title">Fernbereitstellung</string> <string name="pref_remote_provisioning_title">Fernbereitstellung</string>
<string name="pref_primary_account_title">Primäres Konto</string> <string name="pref_primary_account_title">Primäres Konto</string>
<string name="pref_display_name_title">Anzeigename</string> <string name="pref_display_name_title">Anzeigename</string>
@ -199,24 +293,30 @@
<!--Content description--> <!--Content description-->
<string name="content_description_back">Zurück</string> <string name="content_description_back">Zurück</string>
<string name="content_description_dialer">Wählgerät</string> <string name="content_description_dialer">Wählgerät</string>
<string name="content_description_menu">Menü</string>
<string name="content_description_toggle_micro">Mikrofon umschalten</string> <string name="content_description_toggle_micro">Mikrofon umschalten</string>
<string name="content_description_toggle_speaker">Lautsprecher umschalten</string> <string name="content_description_toggle_speaker">Lautsprecher umschalten</string>
<string name="content_description_decline">Ablehnen</string> <string name="content_description_decline">Ablehnen</string>
<string name="content_description_hang_up">Auflegen</string> <string name="content_description_hang_up">Auflegen</string>
<string name="content_description_accept">Annehmen</string> <string name="content_description_accept">Annehmen</string>
<string name="content_description_edit">Ändern</string> <string name="content_description_edit">Bearbeiten</string>
<string name="content_description_edit_list">Liste bearbeiten</string>
<string name="content_description_valid">Gültig</string>
<string name="content_description_add_contact">Zu Kontakten hinzufügen</string> <string name="content_description_add_contact">Zu Kontakten hinzufügen</string>
<string name="content_description_new_contact">Neuer Kontakt</string> <string name="content_description_new_contact">Neuer Kontakt</string>
<string name="content_description_call">Call</string> <string name="content_description_call">Call</string>
<string name="content_description_backspace">Zurückschalten</string> <string name="content_description_backspace">Zurückschalten</string>
<string name="content_description_chat">Nachrichten</string> <string name="content_description_chat">Nachrichten</string>
<string name="content_description_dial_back">Zurückrufen</string> <string name="content_description_dial_back">Zurückrufen</string>
<string name="content_description_dialer_back">Zurück zum Anrufer</string>
<string name="content_description_contact_picture">Kontaktbild</string> <string name="content_description_contact_picture">Kontaktbild</string>
<string name="content_description_send_message">Nachricht senden</string> <string name="content_description_send_message">Nachricht senden</string>
<string name="content_description_detail">Details</string>
<string name="content_description_delete">Löschen</string> <string name="content_description_delete">Löschen</string>
<string name="content_description_add">Anruf hinzufügen</string> <string name="content_description_add">Anruf hinzufügen</string>
<string name="content_description_new_discussion">Neue Diskussion</string> <string name="content_description_new_discussion">Neue Diskussion</string>
<string name="content_description_search">Suchen</string> <string name="content_description_search">Suchen</string>
<string name="content_description_search_contact">Kontakt suchen</string>
<string name="content_description_all_contacts">Alle Kontakte</string> <string name="content_description_all_contacts">Alle Kontakte</string>
<string name="content_description_linphone_contacts">Linphone-Kontakte</string> <string name="content_description_linphone_contacts">Linphone-Kontakte</string>
<string name="content_description_call_direction">Anrufrichtung</string> <string name="content_description_call_direction">Anrufrichtung</string>
@ -235,9 +335,26 @@
<string name="content_description_cancel_button">Schaltfläche Abbrechen</string> <string name="content_description_cancel_button">Schaltfläche Abbrechen</string>
<string name="content_description_message_status">Nachrichtenstatus</string> <string name="content_description_message_status">Nachrichtenstatus</string>
<string name="content_description_conference">Konferenz</string> <string name="content_description_conference">Konferenz</string>
<string name="content_description_username_field">Benutzernamenfeld</string>
<string name="content_description_display_field">Anzeigenamenfeld</string>
<string name="content_description_domain_field">Domänenfeld</string>
<string name="content_description_url_field">Fernbereitstellungsfeld</string>
<string name="content_description_confirm_password_field">Passwortbestätigungsfeld</string>
<string name="content_description_email_field">E-Mail-Feld</string>
<string name="content_description_default_account">Standardkonto</string> <string name="content_description_default_account">Standardkonto</string>
<string name="content_description_deselect_all">Alle abwählen</string>
<string name="content_description_select_all">Alle auswählen</string>
<string name="content_description_delete_selection">Auswahl löschen</string>
<string name="content_description_contact_first_name">Vorname</string> <string name="content_description_contact_first_name">Vorname</string>
<string name="content_description_contact_last_name">Nachname</string> <string name="content_description_contact_last_name">Nachname</string>
<string name="content_description_back_call">Zurück zum Anruf</string>
<string name="content_description_send_file">Datei senden</string>
<string name="content_description_message">Nachricht</string>
<string name="content_description_unread_chat_message">Ungelesene Chatnachricht</string>
<string name="content_description_transfer">Weiterleiten</string> <string name="content_description_transfer">Weiterleiten</string>
<string name="content_description_earpiece">Ohrhörer</string>
<string name="content_description_bluetooth">Bluetooth</string> <string name="content_description_bluetooth">Bluetooth</string>
<string name="content_description_call_options">Anrufoptionen</string>
<string name="content_description_audio_route">Audioroute</string>
<string name="content_description_exit_conference">Konferenz beenden</string>
</resources> </resources>

View file

@ -7,6 +7,8 @@
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Iniciando</string> <string name="wait_dialog_text">Iniciando</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="sync_account_name">contactos linphone</string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">Nombre de usuario</string> <string name="username">Nombre de usuario</string>
<string name="display_name">Nombre a mostrar</string> <string name="display_name">Nombre a mostrar</string>
@ -144,6 +146,8 @@
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Llamar</string> <string name="pref_call_title">Llamar</string>
<string name="pref_rfc2833_dtmf">Enviar DTMS RFC2833</string> <string name="pref_rfc2833_dtmf">Enviar DTMS RFC2833</string>
<!--Chat settings-->
<string name="pref_chat_title">Chat</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Red</string> <string name="pref_network_title">Red</string>
<string name="pref_stun_server">Servidor STUN</string> <string name="pref_stun_server">Servidor STUN</string>

View file

@ -9,6 +9,12 @@
<string name="notification_registered">Rekisteröity kohteeseen %s</string> <string name="notification_registered">Rekisteröity kohteeseen %s</string>
<string name="notification_register_failure">Epäonnistui rekisteröidä kohteeseen %s</string> <string name="notification_register_failure">Epäonnistui rekisteröidä kohteeseen %s</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="sync_account_name">linphone yhteystiedot</string>
<string name="history_date_format">VVV, p KKK esim. Maanantai, 1 Tam</string>
<string name="history_detail_date_format">vvvv/KK/dd - TT:mm - esim 2012/11/22 - 12:34</string>
<string name="messages_date_format">pp/KK, TT:mm esim 22/11, 12:34</string>
<string name="messages_list_date_format">pp/KK esim 22/11</string>
<string name="today_date_format">TT:mm esim. 11:11</string>
<!--Common--> <!--Common-->
<string name="username">Käyttäjätunnus</string> <string name="username">Käyttäjätunnus</string>
<string name="display_name">Näytä nimi</string> <string name="display_name">Näytä nimi</string>
@ -232,6 +238,9 @@
<string name="pref_rfc2833_dtmf">Lähetä RFC2833 DTMFs</string> <string name="pref_rfc2833_dtmf">Lähetä RFC2833 DTMFs</string>
<string name="pref_sipinfo_dtmf">Lähetä SIP INFO DTMFs</string> <string name="pref_sipinfo_dtmf">Lähetä SIP INFO DTMFs</string>
<string name="pref_voice_mail">Ääni postin URI-osoite</string> <string name="pref_voice_mail">Ääni postin URI-osoite</string>
<!--Chat settings-->
<string name="pref_chat_title">Keskustelu</string>
<string name="pref_image_sharing_server_title">Jaa palvelin</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Verkko</string> <string name="pref_network_title">Verkko</string>
<string name="pref_wifi_only">Käytä vain wifiä</string> <string name="pref_wifi_only">Käytä vain wifiä</string>
@ -254,7 +263,6 @@
<string name="pref_animation_enable_title">Salli animaatiot</string> <string name="pref_animation_enable_title">Salli animaatiot</string>
<string name="pref_autostart">Käynnistä laitteen käynnistyessä</string> <string name="pref_autostart">Käynnistä laitteen käynnistyessä</string>
<string name="pref_incoming_call_timeout_title">Saapuva puhelu aikakatkaisu (sekunneissa)</string> <string name="pref_incoming_call_timeout_title">Saapuva puhelu aikakatkaisu (sekunneissa)</string>
<string name="pref_image_sharing_server_title">Jaa palvelin</string>
<string name="pref_remote_provisioning_title">Vastapuoli hakee asetuksia</string> <string name="pref_remote_provisioning_title">Vastapuoli hakee asetuksia</string>
<string name="pref_primary_account_title">Pääasiallinen tili</string> <string name="pref_primary_account_title">Pääasiallinen tili</string>
<string name="pref_display_name_title">Näytä nimi</string> <string name="pref_display_name_title">Näytä nimi</string>

View file

@ -9,6 +9,16 @@
<string name="notification_registered">%s enregistré</string> <string name="notification_registered">%s enregistré</string>
<string name="notification_register_failure">%s n\'a pas pu s\'enregistrer</string> <string name="notification_register_failure">%s n\'a pas pu s\'enregistrer</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">GNU General Public License V2\n © 2010-2016 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string>
<string name="sync_account_name">contacts linphone</string>
<string name="history_date_format">EEE, d MMM</string>
<string name="history_detail_date_format">dd/MM/yyy - HH:mm -</string>
<string name="messages_date_format">dd/MM, HH:mm</string>
<string name="messages_list_date_format">dd/MM</string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">Nom d\'utilisateur</string> <string name="username">Nom d\'utilisateur</string>
<string name="display_name">Nom d\'affichage</string> <string name="display_name">Nom d\'affichage</string>
@ -35,6 +45,7 @@
<string name="decline">Refuser</string> <string name="decline">Refuser</string>
<string name="conference">Conférence</string> <string name="conference">Conférence</string>
<!--Launch screen--> <!--Launch screen-->
<string name="app_description">le client SIP <i>libre</i></string>
<!--Assistant--> <!--Assistant-->
<string name="welcome">Bienvenue</string> <string name="welcome">Bienvenue</string>
<string name="assistant">Assistant</string> <string name="assistant">Assistant</string>
@ -72,6 +83,7 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="wizard_passwords_unmatched">Les mots de passes ne correspondent pas.</string> <string name="wizard_passwords_unmatched">Les mots de passes ne correspondent pas.</string>
<string name="setup_confirm_username">Votre nom d\'utilisateur sera %s.\r\n\r\nIl peut différer de votre saisie.\r\nContinuer ?</string> <string name="setup_confirm_username">Votre nom d\'utilisateur sera %s.\r\n\r\nIl peut différer de votre saisie.\r\nContinuer ?</string>
<string name="first_launch_no_login_password">Entrez votre nom d\'utilisateur et votre mot de passe</string> <string name="first_launch_no_login_password">Entrez votre nom d\'utilisateur et votre mot de passe</string>
<string name="forgot_password">Mot de passe oublié ?</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">Entrez un numéro ou une adresse</string> <string name="address_bar_hint">Entrez un numéro ou une adresse</string>
<!--History--> <!--History-->
@ -177,6 +189,7 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="pref_avpf">AVPF</string> <string name="pref_avpf">AVPF</string>
<string name="pref_avpf_rr_interval">Intervalle AVPF RTCP régulier en secondes (entre 1 et 5) </string> <string name="pref_avpf_rr_interval">Intervalle AVPF RTCP régulier en secondes (entre 1 et 5) </string>
<string name="pref_escape_plus">Remplacer + par 00</string> <string name="pref_escape_plus">Remplacer + par 00</string>
<string name="pref_friendlist_subscribe">Souscrire à la liste d\'amis</string>
<string name="pref_auth_userid">Identifiant d\'authentification</string> <string name="pref_auth_userid">Identifiant d\'authentification</string>
<string name="pref_help_auth_userid">Entrez l\'userid d\'authentification (optionnel)</string> <string name="pref_help_auth_userid">Entrez l\'userid d\'authentification (optionnel)</string>
<string name="pref_display_name">Nom d\'affichage</string> <string name="pref_display_name">Nom d\'affichage</string>
@ -192,6 +205,7 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="pref_sipaccounts">Comptes SIP</string> <string name="pref_sipaccounts">Comptes SIP</string>
<string name="default_account_flag">Compte par défaut</string> <string name="default_account_flag">Compte par défaut</string>
<string name="pref_add_account">Ajouter un compte</string> <string name="pref_add_account">Ajouter un compte</string>
<string name="pref_in_app_store">Magasin</string>
<string name="pref_tunnel">Tunnel</string> <string name="pref_tunnel">Tunnel</string>
<string name="pref_tunnel_host">Hôte</string> <string name="pref_tunnel_host">Hôte</string>
<string name="pref_tunnel_port">Port</string> <string name="pref_tunnel_port">Port</string>
@ -220,6 +234,8 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="pref_codecs">Codecs</string> <string name="pref_codecs">Codecs</string>
<!--Video settings--> <!--Video settings-->
<string name="pref_video_title">Vidéo</string> <string name="pref_video_title">Vidéo</string>
<string name="pref_overlay">Vidéo détachable</string>
<string name="pref_overlay_summary">Affiche la video d\'un appel en dehors de l\'application</string>
<string name="pref_video_use_front_camera_title">Utiliser la caméra en façade</string> <string name="pref_video_use_front_camera_title">Utiliser la caméra en façade</string>
<string name="pref_video_initiate_call_with_video_title">Initier les appels en vidéo</string> <string name="pref_video_initiate_call_with_video_title">Initier les appels en vidéo</string>
<string name="pref_video_initiate_call_with_video">Toujours envoyer des demandes d\'appels vidéo</string> <string name="pref_video_initiate_call_with_video">Toujours envoyer des demandes d\'appels vidéo</string>
@ -232,9 +248,19 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="pref_video_codecs_title">Codecs</string> <string name="pref_video_codecs_title">Codecs</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Appel</string> <string name="pref_call_title">Appel</string>
<string name="pref_device_ringtone">Utiliser la sonnerie du téléphone</string>
<string name="pref_auto_answer">Décrocher automatiquement appels entrants</string>
<string name="pref_rfc2833_dtmf">Envoyer les DTMFs RFC2833</string> <string name="pref_rfc2833_dtmf">Envoyer les DTMFs RFC2833</string>
<string name="pref_sipinfo_dtmf">Envoyer les DTMFs en SIP INFO</string> <string name="pref_sipinfo_dtmf">Envoyer les DTMFs en SIP INFO</string>
<string name="pref_voice_mail">URI de boîte vocale</string> <string name="pref_voice_mail">URI de boîte vocale</string>
<!--Chat settings-->
<string name="pref_chat_title">Chat</string>
<string name="pref_image_sharing_server_title">Serveur de partage</string>
<string name="pref_image_sharing_server_desc">Ne changez pas cette valeur sans savoir ce que vous faites !</string>
<string name="pref_use_lime_encryption">Encrypter avec LIME</string>
<string name="lime_encryption_entry_disabled">Désactivé</string>
<string name="lime_encryption_entry_mandatory">Obligatoire</string>
<string name="lime_encryption_entry_preferred">Préferré</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Réseau</string> <string name="pref_network_title">Réseau</string>
<string name="pref_wifi_only">Utiliser WiFi uniquement</string> <string name="pref_wifi_only">Utiliser WiFi uniquement</string>
@ -255,9 +281,9 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="pref_debug">Activer les traces de débogage</string> <string name="pref_debug">Activer les traces de débogage</string>
<string name="pref_background_mode">Actif en arrière plan</string> <string name="pref_background_mode">Actif en arrière plan</string>
<string name="pref_animation_enable_title">Activer les animations</string> <string name="pref_animation_enable_title">Activer les animations</string>
<string name="pref_service_notification">Notification de service</string>
<string name="pref_autostart">Démarrer au lancement du téléphone</string> <string name="pref_autostart">Démarrer au lancement du téléphone</string>
<string name="pref_incoming_call_timeout_title">Ignorer les appels entrants après (en secondes)</string> <string name="pref_incoming_call_timeout_title">Ignorer les appels entrants après (en secondes)</string>
<string name="pref_image_sharing_server_title">Serveur de partage</string>
<string name="pref_remote_provisioning_title">Configuration distante</string> <string name="pref_remote_provisioning_title">Configuration distante</string>
<string name="pref_primary_account_title">Compte principal</string> <string name="pref_primary_account_title">Compte principal</string>
<string name="pref_display_name_title">Nom d\'affichage</string> <string name="pref_display_name_title">Nom d\'affichage</string>
@ -271,6 +297,7 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<!--Content description--> <!--Content description-->
<string name="content_description_back">Retour</string> <string name="content_description_back">Retour</string>
<string name="content_description_dialer">Dialer</string> <string name="content_description_dialer">Dialer</string>
<string name="content_description_menu">Menu</string>
<string name="content_description_toggle_micro">Basculer micro</string> <string name="content_description_toggle_micro">Basculer micro</string>
<string name="content_description_toggle_speaker">Basculer haut-parleur</string> <string name="content_description_toggle_speaker">Basculer haut-parleur</string>
<string name="content_description_decline">Refuser</string> <string name="content_description_decline">Refuser</string>
@ -315,11 +342,13 @@ Lorsque cela est fait, cliquez sur le bouton pour continuer.</string>
<string name="content_description_username_field">Champ nom d\'utilisateur</string> <string name="content_description_username_field">Champ nom d\'utilisateur</string>
<string name="content_description_display_field">Champ nom d\'affichage</string> <string name="content_description_display_field">Champ nom d\'affichage</string>
<string name="content_description_domain_field">Champ domaine</string> <string name="content_description_domain_field">Champ domaine</string>
<string name="content_description_url_field">Champ de configuration distante</string>
<string name="content_description_confirm_password_field">Champ confirmation du mot de passe</string> <string name="content_description_confirm_password_field">Champ confirmation du mot de passe</string>
<string name="content_description_email_field">Champ email</string> <string name="content_description_email_field">Champ email</string>
<string name="content_description_default_account">Compte par défaut</string> <string name="content_description_default_account">Compte par défaut</string>
<string name="content_description_deselect_all">Tout déselectionner</string> <string name="content_description_deselect_all">Tout déselectionner</string>
<string name="content_description_select_all">Tout sélectionner</string> <string name="content_description_select_all">Tout sélectionner</string>
<string name="content_description_delete_selection">Supprimer la sélection</string>
<string name="content_description_contact_first_name">Prénom</string> <string name="content_description_contact_first_name">Prénom</string>
<string name="content_description_contact_last_name">Nom</string> <string name="content_description_contact_last_name">Nom</string>
<string name="content_description_back_call">Retour à l\'appel</string> <string name="content_description_back_call">Retour à l\'appel</string>

View file

@ -67,6 +67,8 @@
<string name="pref_video_title">וידאו</string> <string name="pref_video_title">וידאו</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">קריאה</string> <string name="pref_call_title">קריאה</string>
<!--Chat settings-->
<string name="pref_chat_title">שיחה</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">רשת</string> <string name="pref_network_title">רשת</string>
<string name="pref_stun_server">שרת Stun</string> <string name="pref_stun_server">שרת Stun</string>

View file

@ -9,6 +9,16 @@
<string name="notification_registered">%sを登録しました</string> <string name="notification_registered">%sを登録しました</string>
<string name="notification_register_failure">%sの登録に失敗しました</string> <string name="notification_register_failure">%sの登録に失敗しました</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">GNU ライセンス V2\n © 2010-2016 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string>
<string name="sync_account_name">linphoneにたずねる</string>
<string name="history_date_format">EEE, d MMM</string>
<string name="history_detail_date_format">yyyy/MM/dd - HH:mm - </string>
<string name="messages_date_format">dd/MM, HH:mm</string>
<string name="messages_list_date_format">dd/MM</string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">ユーザー名</string> <string name="username">ユーザー名</string>
<string name="display_name">表示する名前</string> <string name="display_name">表示する名前</string>
@ -64,19 +74,33 @@
<string name="assistant_error_bad_credentials">ユーザー名かパスワードが異なります</string> <string name="assistant_error_bad_credentials">ユーザー名かパスワードが異なります</string>
<string name="wizard_failed">エラーが発生しました。のちほど再試行してください。</string> <string name="wizard_failed">エラーが発生しました。のちほど再試行してください。</string>
<string name="wizard_username_unavailable">このユーザー名はすでに使われています。</string> <string name="wizard_username_unavailable">このユーザー名はすでに使われています。</string>
<string name="wizard_username_incorrect">不適切なユーザー名です</string>
<string name="wizard_email_incorrect">不適切なメールアドレスです</string>
<string name="wizard_password_incorrect">不適切なパスワードです</string>
<string name="wizard_passwords_unmatched">パスワードが一致しません</string>
<string name="first_launch_no_login_password">ユーザー名とパスワードを入力してください</string> <string name="first_launch_no_login_password">ユーザー名とパスワードを入力してください</string>
<string name="forgot_password">パスワードを忘れましたか?</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">番号もしくはアドレスを入力してください</string>
<!--History--> <!--History-->
<string name="no_call_history">発信履歴がありません</string>
<string name="no_missed_call_history">発信ミス履歴がありません</string>
<string name="delete_history_log">本当に選択した通話履歴を削除しますか?</string>
<string name="today">今日</string> <string name="today">今日</string>
<string name="yesterday">昨日</string> <string name="yesterday">昨日</string>
<!--Contacts--> <!--Contacts-->
<string name="no_contact">電話帳に連絡先がありません</string> <string name="no_contact">電話帳に連絡先がありません</string>
<string name="no_sip_contact">電話帳にSIPの連絡先がありません</string> <string name="no_sip_contact">電話帳にSIPの連絡先がありません</string>
<string name="delete_contacts">本当に選択した連絡先を削除しますか?</string>
<string name="delete_contact">本当に選択した連絡先を削除しますか?</string>
<string name="sip_address">SIPアドレス</string> <string name="sip_address">SIPアドレス</string>
<string name="phone_number">電話番号</string> <string name="phone_number">電話番号</string>
<string name="contact_first_name">名前</string> <string name="contact_first_name">名前</string>
<string name="contact_last_name">名字</string> <string name="contact_last_name">名字</string>
<!--Chat--> <!--Chat-->
<string name="no_chat_history">新しい会話はありません</string>
<string name="delete_conversation">本当に選択した会話を削除しますか?</string>
<string name="delete_message">本当に選択したメッセージを削除しますか?</string>
<string name="remote_composing">リモート先が入力中...</string> <string name="remote_composing">リモート先が入力中...</string>
<string name="share_picture_size_small">小さい</string> <string name="share_picture_size_small">小さい</string>
<string name="share_picture_size_medium">中くらい</string> <string name="share_picture_size_medium">中くらい</string>
@ -103,6 +127,7 @@
<!--Call--> <!--Call-->
<string name="incoming_call">着信</string> <string name="incoming_call">着信</string>
<string name="outgoing_call">発信</string> <string name="outgoing_call">発信</string>
<string name="no_current_call">有効な発信はありません</string>
<string name="unknown_incoming_call_name">不明</string> <string name="unknown_incoming_call_name">不明</string>
<string name="call_stats_audio">オーディオ</string> <string name="call_stats_audio">オーディオ</string>
<string name="call_stats_video">ビデオ</string> <string name="call_stats_video">ビデオ</string>
@ -132,6 +157,7 @@
<string name="error_bad_credentials">不正な証明書です</string> <string name="error_bad_credentials">不正な証明書です</string>
<string name="error_unauthorized">無断</string> <string name="error_unauthorized">無断</string>
<string name="error_io_error">ネットワークエラー</string> <string name="error_io_error">ネットワークエラー</string>
<string name="download_image_failed">ダウンロードに失敗しました。ネットワークを確認して再度操作してください。</string>
<string name="remote_provisioning_failure">ダウンロードした、リモートプロビジョニング設定を適用できませんでした...</string> <string name="remote_provisioning_failure">ダウンロードした、リモートプロビジョニング設定を適用できませんでした...</string>
<string name="remote_provisioning_again_title">遠隔準備</string> <string name="remote_provisioning_again_title">遠隔準備</string>
<!--Account Settings--> <!--Account Settings-->
@ -154,6 +180,7 @@
<string name="pref_escape_plus">00 で置き換える</string> <string name="pref_escape_plus">00 で置き換える</string>
<string name="pref_auth_userid">ユーザーIDを認証</string> <string name="pref_auth_userid">ユーザーIDを認証</string>
<string name="pref_display_name">表示名</string> <string name="pref_display_name">表示名</string>
<string name="pref_help_display_name">表示する名前(任意)</string>
<string name="pref_prefix">プレフィックス</string> <string name="pref_prefix">プレフィックス</string>
<string name="pref_transport">トランスポート</string> <string name="pref_transport">トランスポート</string>
<string name="pref_transport_udp">UDP</string> <string name="pref_transport_udp">UDP</string>
@ -165,6 +192,7 @@
<string name="pref_sipaccounts">SIPアカウント</string> <string name="pref_sipaccounts">SIPアカウント</string>
<string name="default_account_flag">デフォルトのアカウント</string> <string name="default_account_flag">デフォルトのアカウント</string>
<string name="pref_add_account">アカウントを追加する</string> <string name="pref_add_account">アカウントを追加する</string>
<string name="pref_in_app_store">アプリストアで</string>
<string name="pref_tunnel">トンネル</string> <string name="pref_tunnel">トンネル</string>
<string name="pref_tunnel_host">ホスト名</string> <string name="pref_tunnel_host">ホスト名</string>
<string name="pref_tunnel_port">ポート</string> <string name="pref_tunnel_port">ポート</string>
@ -183,6 +211,7 @@
<string name="pref_audio_title">オーディオ</string> <string name="pref_audio_title">オーディオ</string>
<string name="pref_echo_cancellation">エコーキャンセル</string> <string name="pref_echo_cancellation">エコーキャンセル</string>
<string name="pref_echo_cancellation_summary">相手が聞こえるエコーを削除する</string> <string name="pref_echo_cancellation_summary">相手が聞こえるエコーを削除する</string>
<string name="pref_echo_canceller_calibration">エコーキャンセラーの調整</string>
<string name="ec_calibrating">調整中...</string> <string name="ec_calibrating">調整中...</string>
<string name="ec_calibrated">%s msで調整しました</string> <string name="ec_calibrated">%s msで調整しました</string>
<string name="no_echo">エコーなし</string> <string name="no_echo">エコーなし</string>
@ -207,6 +236,10 @@
<string name="pref_rfc2833_dtmf">DTMFをRFC2833で送信する</string> <string name="pref_rfc2833_dtmf">DTMFをRFC2833で送信する</string>
<string name="pref_sipinfo_dtmf">DTMFをSIP情報で送信する</string> <string name="pref_sipinfo_dtmf">DTMFをSIP情報で送信する</string>
<string name="pref_voice_mail">音声メールのURI</string> <string name="pref_voice_mail">音声メールのURI</string>
<!--Chat settings-->
<string name="pref_chat_title">チャット</string>
<string name="pref_image_sharing_server_title">共有サーバー</string>
<string name="lime_encryption_entry_disabled">無効にする</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">ネットワーク</string> <string name="pref_network_title">ネットワーク</string>
<string name="pref_wifi_only">WiFiのみ</string> <string name="pref_wifi_only">WiFiのみ</string>
@ -227,8 +260,8 @@
<string name="pref_debug">デバッグ</string> <string name="pref_debug">デバッグ</string>
<string name="pref_background_mode">バックグラウンド動作</string> <string name="pref_background_mode">バックグラウンド動作</string>
<string name="pref_animation_enable_title">アニメーションを有効にする</string> <string name="pref_animation_enable_title">アニメーションを有効にする</string>
<string name="pref_service_notification">サービス通知を有効にする</string>
<string name="pref_autostart">起動時に開始する</string> <string name="pref_autostart">起動時に開始する</string>
<string name="pref_image_sharing_server_title">共有サーバー</string>
<string name="pref_remote_provisioning_title">遠隔準備</string> <string name="pref_remote_provisioning_title">遠隔準備</string>
<string name="pref_primary_account_title">優先アカウント</string> <string name="pref_primary_account_title">優先アカウント</string>
<string name="pref_display_name_title">表示名</string> <string name="pref_display_name_title">表示名</string>
@ -242,18 +275,22 @@
<!--Content description--> <!--Content description-->
<string name="content_description_back">戻る</string> <string name="content_description_back">戻る</string>
<string name="content_description_dialer">ダイヤラー</string> <string name="content_description_dialer">ダイヤラー</string>
<string name="content_description_menu">メニュー</string>
<string name="content_description_toggle_micro">マイク切り替えトグル</string> <string name="content_description_toggle_micro">マイク切り替えトグル</string>
<string name="content_description_toggle_speaker">スピーカー切り替えトグル</string> <string name="content_description_toggle_speaker">スピーカー切り替えトグル</string>
<string name="content_description_decline">拒否</string> <string name="content_description_decline">拒否</string>
<string name="content_description_hang_up">ハングアップ</string> <string name="content_description_hang_up">ハングアップ</string>
<string name="content_description_accept">受理する</string> <string name="content_description_accept">受理する</string>
<string name="content_description_edit">編集</string> <string name="content_description_edit">編集</string>
<string name="content_description_edit_list">編集リスト</string>
<string name="content_description_valid">適正</string>
<string name="content_description_add_contact">連絡先に追加</string> <string name="content_description_add_contact">連絡先に追加</string>
<string name="content_description_new_contact">新しい連絡先</string> <string name="content_description_new_contact">新しい連絡先</string>
<string name="content_description_call">発信</string> <string name="content_description_call">発信</string>
<string name="content_description_backspace">バックスペース</string> <string name="content_description_backspace">バックスペース</string>
<string name="content_description_chat">チャット</string> <string name="content_description_chat">チャット</string>
<string name="content_description_dial_back">コールバック</string> <string name="content_description_dial_back">コールバック</string>
<string name="content_description_dialer_back">ダイヤル画面に戻る</string>
<string name="content_description_contact_picture">連絡相手の画像</string> <string name="content_description_contact_picture">連絡相手の画像</string>
<string name="content_description_send_message">送信メッセージ</string> <string name="content_description_send_message">送信メッセージ</string>
<string name="content_description_detail">詳細</string> <string name="content_description_detail">詳細</string>
@ -261,6 +298,7 @@
<string name="content_description_add">追加発信</string> <string name="content_description_add">追加発信</string>
<string name="content_description_new_discussion">新しいやりとりを行う</string> <string name="content_description_new_discussion">新しいやりとりを行う</string>
<string name="content_description_search">検索</string> <string name="content_description_search">検索</string>
<string name="content_description_search_contact">連絡先を検索する</string>
<string name="content_description_all_contacts">すべての連絡先</string> <string name="content_description_all_contacts">すべての連絡先</string>
<string name="content_description_linphone_contacts">Linphoneでの連絡先</string> <string name="content_description_linphone_contacts">Linphoneでの連絡先</string>
<string name="content_description_call_direction">宛先を指定</string> <string name="content_description_call_direction">宛先を指定</string>
@ -279,9 +317,22 @@
<string name="content_description_cancel_button">キャンセルボタン</string> <string name="content_description_cancel_button">キャンセルボタン</string>
<string name="content_description_message_status">メッセージ状態</string> <string name="content_description_message_status">メッセージ状態</string>
<string name="content_description_conference">会談</string> <string name="content_description_conference">会談</string>
<string name="content_description_username_field">ユーザー名</string>
<string name="content_description_display_field">表示名</string>
<string name="content_description_domain_field">ドメイン</string>
<string name="content_description_confirm_password_field">パスワードの再入力</string>
<string name="content_description_email_field">メールアドレス</string>
<string name="content_description_default_account">デフォルトのアカウント</string> <string name="content_description_default_account">デフォルトのアカウント</string>
<string name="content_description_deselect_all">全ての選択を外す</string>
<string name="content_description_select_all">全てを選択する</string>
<string name="content_description_contact_first_name">名前</string> <string name="content_description_contact_first_name">名前</string>
<string name="content_description_contact_last_name">名字</string> <string name="content_description_contact_last_name">名字</string>
<string name="content_description_back_call">発信に戻る</string>
<string name="content_description_send_file">ファイルを送信する</string>
<string name="content_description_message">メッセージ</string>
<string name="content_description_unread_chat_message">未読件数</string>
<string name="content_description_transfer">転送</string> <string name="content_description_transfer">転送</string>
<string name="content_description_bluetooth">Bluetooth</string> <string name="content_description_bluetooth">Bluetooth</string>
<string name="content_description_call_options">発信オプション</string>
<string name="content_description_exit_conference">会議を終了する</string>
</resources> </resources>

View file

@ -7,6 +7,7 @@
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Bezig met opstarten</string> <string name="wait_dialog_text">Bezig met opstarten</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="today_date_format">HH:mm</string>
<!--Common--> <!--Common-->
<string name="username">Gebruikersnaam</string> <string name="username">Gebruikersnaam</string>
<string name="display_name">Weergavenaam</string> <string name="display_name">Weergavenaam</string>
@ -94,6 +95,8 @@
<string name="pref_video_codecs_title">Codecs</string> <string name="pref_video_codecs_title">Codecs</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Oproep</string> <string name="pref_call_title">Oproep</string>
<!--Chat settings-->
<string name="pref_chat_title">Chat</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Netwerk</string> <string name="pref_network_title">Netwerk</string>
<string name="pref_stun_server">Stun-server</string> <string name="pref_stun_server">Stun-server</string>

View file

@ -161,6 +161,9 @@
<string name="pref_call_title">Ligar</string> <string name="pref_call_title">Ligar</string>
<string name="pref_rfc2833_dtmf">Enviar RFC2833 DTMFs</string> <string name="pref_rfc2833_dtmf">Enviar RFC2833 DTMFs</string>
<string name="pref_sipinfo_dtmf">Enviar SIP INFO DTMFs</string> <string name="pref_sipinfo_dtmf">Enviar SIP INFO DTMFs</string>
<!--Chat settings-->
<string name="pref_chat_title">Chat</string>
<string name="pref_image_sharing_server_title">Servidor de compartilhamento</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Network</string> <string name="pref_network_title">Network</string>
<string name="pref_stun_server">Servidor Stun</string> <string name="pref_stun_server">Servidor Stun</string>
@ -180,7 +183,6 @@
<string name="pref_background_mode">Em segundo plano</string> <string name="pref_background_mode">Em segundo plano</string>
<string name="pref_animation_enable_title">Ativar Animações</string> <string name="pref_animation_enable_title">Ativar Animações</string>
<string name="pref_autostart">Iniciar na inicialização</string> <string name="pref_autostart">Iniciar na inicialização</string>
<string name="pref_image_sharing_server_title">Servidor de compartilhamento</string>
<string name="pref_remote_provisioning_title">Provisionamento remoto</string> <string name="pref_remote_provisioning_title">Provisionamento remoto</string>
<string name="pref_primary_account_title">Conta primária</string> <string name="pref_primary_account_title">Conta primária</string>
<string name="pref_display_name_title">Mostrar nome</string> <string name="pref_display_name_title">Mostrar nome</string>

View file

@ -2,49 +2,97 @@
<resources> <resources>
<!--Custom--> <!--Custom-->
<string name="app_name">Linphone</string> <string name="app_name">Linphone</string>
<string name="service_name">Служба Linphone</string>
<string name="addressbook_label">Linphone</string> <string name="addressbook_label">Linphone</string>
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Загружается</string> <string name="wait_dialog_text">Загружается</string>
<string name="notification_registered">%s зарегистрирован</string>
<string name="notification_register_failure">%s зарегистрировать не удалось</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<!--Common--> <!--Common-->
<string name="username">Имя пользователя</string> <string name="username">Имя пользователя</string>
<string name="display_name">Display name</string> <string name="display_name">Отображаемое имя</string>
<string name="password">Пароль</string> <string name="password">Пароль</string>
<string name="confirm_password">Подтверждение пароля</string>
<string name="domain">Домен</string>
<string name="remote_provisioning_url">URL</string>
<string name="email">Электронная почта</string>
<string name="delete_text">Вы уверены, что хотите удалить выбранное?</string>
<string name="delete">Удалить</string> <string name="delete">Удалить</string>
<string name="retry">Retry</string> <string name="retry">Повторить</string>
<string name="cancel">Отменить</string> <string name="cancel">Отменить</string>
<string name="accept">Принять</string> <string name="accept">Принять</string>
<string name="continue_text">Продолжить</string> <string name="continue_text">Продолжить</string>
<string name="about">О программе</string> <string name="about">О программе</string>
<string name="deny">Deny</string> <string name="deny">Отклонить</string>
<string name="no_account">Нет настроенных аккаунтов</string>
<string name="search">Поиск</string>
<string name="outgoing">Исходящий</string> <string name="outgoing">Исходящий</string>
<string name="incoming">Входящий</string> <string name="incoming">Входящий</string>
<string name="missed">Пропущенный</string> <string name="missed">Пропущенный</string>
<string name="settings">Настройки</string> <string name="settings">Настройки</string>
<string name="connect">Подключение</string>
<string name="decline">Отклонить</string> <string name="decline">Отклонить</string>
<string name="conference">Конференция</string> <string name="conference">Конференция</string>
<!--Launch screen--> <!--Launch screen-->
<!--Assistant--> <!--Assistant-->
<string name="assistant_welcome_desc">Этот помощник поможет Вам настроить учётную запись SIP для звонков.</string> <string name="welcome">Добро пожаловать</string>
<string name="assistant">Ассистент</string>
<string name="assistant_create_account">Создать аккаунт</string>
<string name="assistant_finish">Завершить настройку</string>
<string name="assistant_validate_account">Ваш аккаунт создан. Пожалуйста, проверьте электронную почту, чтобы подтвердить свой аккаунт. Как только это будет сделано, вернитесь сюда и нажмите на кнопку.</string>
<string name="assistant_welcome_desc">Этот ассистент поможет настроить SIP-аккаунт для звонков.</string>
<string name="assistant_linphone_login_desc">Введите имя пользователя и пароль от аккаунта Linphone</string>
<string name="assistant_login_desc">Введите имя пользователя и пароль с доменом SIP</string>
<string name="assistant_remote_provisioning_desc">Пожалуйста, введите URL конфигурирования</string>
<string name="transport">Транспорт</string> <string name="transport">Транспорт</string>
<string name="assistant_login_linphone">Исп. аккаунт Linphone</string>
<string name="assistant_login_generic">Исп. SIP-аккаунт</string>
<string name="assistant_remote_provisioning">Удалённое конфигурирование</string>
<string name="assistant_create_account_part_1">1/2</string>
<string name="assistant_create_account_part_2">2/2</string>
<string name="assistant_display_name_optional">Отображаемое имя (необязательно)</string>
<string name="assistant_linphone_account">Настройка аккаунта Linphone</string>
<string name="assistant_generic_account">Настройка SIP-аккаунта</string>
<string name="assistant_remote_provisioning_title">Удалённое конфигурирование</string>
<string name="assistant_fetch_apply">Извлечь и применить</string>
<string name="assistant_login">Логин</string>
<string name="assistant_ec_calibration">Выполняется калибровка эхоподавления</string>
<string name="assistant_remote_provisioning_login">Введите логин</string>
<string name="assistant_account_not_validated">Ваша учётная запись ещё не подтверждена.</string> <string name="assistant_account_not_validated">Ваша учётная запись ещё не подтверждена.</string>
<string name="assistant_account_validated">Ваша учётная запись подтверждена.</string> <string name="assistant_account_validated">Ваша учётная запись подтверждена.</string>
<string name="wizard_failed">Произошла ошибка, попробуйте повторить позже.</string> <string name="assistant_error_bad_credentials">Неверное имя пользователя или пароль</string>
<string name="wizard_username_unavailable">Это имя пользователя уже использовано.</string> <string name="wizard_failed">Произошла ошибка, повторите попытку позже.</string>
<string name="first_launch_no_login_password">Пожалуйста введите имя пользователя и пароль</string> <string name="wizard_server_unavailable">Сервер недоступен, проверьте подключение к сети.</string>
<string name="wizard_username_unavailable">Это имя пользователя уже используется.</string>
<string name="wizard_username_incorrect">Неверное имя пользователя.</string>
<string name="wizard_email_incorrect">Неверный адрес эл. почты.</string>
<string name="wizard_password_incorrect">Неверный пароль</string>
<string name="wizard_passwords_unmatched">Пароли не совпадают.</string>
<string name="setup_confirm_username">Ваше имя пользователя будет %s.\r\n\r\nОно может отличаться от введённого для соответствия требованиям.\r\nВы согласны?</string>
<string name="first_launch_no_login_password">Пожалуйста, введите имя пользователя и пароль</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">Введите номер или адрес</string>
<!--History--> <!--History-->
<string name="no_call_history">В журнале нет вызовов</string>
<string name="no_missed_call_history">В журнале нет пропущенных вызовов</string>
<string name="delete_history_log">Вы действительно хотите удалить выбранный журнал вызовов?</string>
<string name="today">Сегодня</string> <string name="today">Сегодня</string>
<string name="yesterday">Вчера</string> <string name="yesterday">Вчера</string>
<!--Contacts--> <!--Contacts-->
<string name="no_contact">Нет контакта в Вашей адресной книге.</string> <string name="no_contact">В адресной книге нет контактов.</string>
<string name="no_sip_contact">Нет SIP контакта в Вашей адресной книге.</string> <string name="no_sip_contact">В адресной книге нет SIP контактов.</string>
<string name="sip_address">адрес SIP</string> <string name="delete_contacts">Вы действительно хотите удалить выбранные контакты?</string>
<string name="delete_contact">Вы действительно хотите удалить выбранный контакт?</string>
<string name="sip_address">Адрес SIP</string>
<string name="phone_number">Номер телефона</string> <string name="phone_number">Номер телефона</string>
<string name="contact_first_name">Имя</string> <string name="contact_first_name">Имя</string>
<string name="contact_last_name">Фамилия</string> <string name="contact_last_name">Фамилия</string>
<!--Chat--> <!--Chat-->
<string name="remote_composing">Remote is writing...</string> <string name="no_chat_history">Нет разговоров</string>
<string name="delete_conversation">Вы действительно хотите удалить выбранный разговор?</string>
<string name="delete_message">Вы действительно хотите удалить выбранные сообщения?</string>
<string name="remote_composing">Собеседник пишет...</string>
<string name="share_picture_size_small">Маленький</string> <string name="share_picture_size_small">Маленький</string>
<string name="share_picture_size_medium">Средний</string> <string name="share_picture_size_medium">Средний</string>
<string name="share_picture_size_large">Большой</string> <string name="share_picture_size_large">Большой</string>
@ -54,69 +102,95 @@
<string name="image_picker_title">Выбрать источник</string> <string name="image_picker_title">Выбрать источник</string>
<string name="image_saved">Картинка сохранена</string> <string name="image_saved">Картинка сохранена</string>
<string name="image_not_saved">Ошибка, картинка не сохранена</string> <string name="image_not_saved">Ошибка, картинка не сохранена</string>
<string name="wait">Please wait...</string> <string name="wait">Пожалуйста, подождите...</string>
<string name="processing_image">Обработка изображения может занять несколько секунд в зависимости от размера файла</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Зарегистрирован</string> <string name="status_connected">Зарегистрирован</string>
<string name="status_not_connected">Не зарегистрирован</string>
<string name="status_in_progress">В процессе регистрации</string> <string name="status_in_progress">В процессе регистрации</string>
<string name="status_error">Ошибка регистрации</string> <string name="status_error">Ошибка регистрации</string>
<string name="voicemail_unread"> непрочитанных сообщений</string>
<!--Side Menu--> <!--Side Menu-->
<string name="menu_assistant">Ассистент</string>
<string name="menu_settings">Настройки</string> <string name="menu_settings">Настройки</string>
<string name="menu_about">О программе</string> <string name="menu_about">О программе</string>
<string name="quit">Выход</string>
<!--Call--> <!--Call-->
<string name="unknown_incoming_call_name">Неизвестнвй</string> <string name="incoming_call">входящий вызов</string>
<string name="outgoing_call">исходящий вызов</string>
<string name="add_video_dialog">Ваш собеседник хотел бы включить видео</string>
<string name="no_current_call">Нет активного вызова</string>
<string name="call_paused_by_remote">Ваш собеседник поставил звонок на паузу</string>
<string name="couldnt_accept_call">Произошла ошибка во время принятия вызова</string>
<string name="zrtp_dialog">ZRTP токен %s\nВы должны принять только если у вас тот же токен, как у вашего собеседника</string>
<string name="unknown_incoming_call_name">Неизвестный</string>
<string name="call_stats_audio">Аудио</string> <string name="call_stats_audio">Аудио</string>
<string name="call_stats_video">Видео</string> <string name="call_stats_video">Видео</string>
<string name="call_stats_codec">Кодек:</string> <string name="call_stats_codec">Кодек:</string>
<string name="call_stats_upload">Полоса пропускания загрузки:</string> <string name="call_stats_upload">Полоса пропускания загрузки:</string>
<string name="call_stats_download">Полоса пропускания скачивания:</string> <string name="call_stats_download">Полоса пропускания скачивания:</string>
<string name="call_stats_ice">Подключение ICE:</string> <string name="call_stats_ice">Подключение ICE:</string>
<string name="call_stats_video_resolution">Video size:</string> <string name="call_stats_video_resolution">Размер видео:</string>
<string name="call">Звонок</string> <string name="call">Вызов</string>
<!--About--> <!--About-->
<string name="menu_send_log">Отправить журнал</string>
<string name="menu_reset_log">Сброс журнала</string>
<!--Service--> <!--Service-->
<string name="incall_notif_active">Идёт Аудио звонок</string> <string name="incall_notif_active">Идёт аудиозвонок</string>
<string name="incall_notif_paused">Звонок на Паузе</string> <string name="incall_notif_paused">Звонок на паузе</string>
<string name="incall_notif_video">Идёт Видео звонок</string> <string name="incall_notif_video">Идёт видеозвонок</string>
<string name="notification_started">начат</string> <string name="notification_started">начат</string>
<string name="unread_messages">%i unread messages</string> <string name="unread_messages">%i непрочитанных сообщений</string>
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">Внимание : сервис не готов</string> <string name="skipable_error_service_not_ready">Внимание: сервис не готов</string>
<string name="error">Ошибка</string> <string name="error">Ошибка</string>
<string name="error_call_declined">Звонок сброшен</string> <string name="warning_wrong_destination_address">Невозможно установить адрес назначения из %s</string>
<string name="error_unknown">Неизвестная ошибка</string>
<string name="error_call_declined">Вызов сброшен</string>
<string name="error_user_not_found">Пользователь не найден</string> <string name="error_user_not_found">Пользователь не найден</string>
<string name="error_incompatible_media">Несовместимые параметры потока</string> <string name="error_incompatible_media">Несовместимые параметры потока</string>
<string name="error_low_bandwidth">У вашего собеседника низкая пропускная способность, видео не может быть запущено</string>
<string name="error_network_unreachable">Сеть недоступна</string> <string name="error_network_unreachable">Сеть недоступна</string>
<string name="remote_provisioning_failure">Failed to download or apply remote provisioning profile...</string> <string name="error_bad_credentials">Неверные учетные данные</string>
<string name="remote_provisioning_again_title">Remote provisioning</string> <string name="error_unauthorized">Неавторизован</string>
<string name="error_io_error">Ошибка сети</string>
<string name="download_image_failed">Скачать не удалось. Пожалуйста, проверьте сетевое подключение или повторите попытку позже.</string>
<string name="remote_provisioning_failure">Не удалось скачать или применить профиль удалённого конфигурирования...</string>
<string name="remote_provisioning_again_title">Удаленное конфигурирование</string>
<string name="remote_provisioning_again_message">Вы действительно хотите изменить URI конфигурирования?</string>
<!--Account Settings--> <!--Account Settings-->
<string name="pref_sipaccount">Имя SIP</string> <string name="pref_sipaccount">SIP-аккаунт</string>
<string name="pref_manage_title">Manage</string> <string name="pref_manage_title">Управление</string>
<string name="pref_disable_account">Деактивировать</string> <string name="pref_disable_account">Отключить</string>
<string name="pref_proxy">Прокси</string> <string name="pref_proxy">Прокси</string>
<string name="pref_domain">Сервер*</string> <string name="pref_domain">Домен*</string>
<string name="pref_passwd">Пароль*</string> <string name="pref_passwd">Пароль*</string>
<string name="pref_username">Имя пользователя*</string> <string name="pref_username">Имя пользователя*</string>
<string name="pref_enable_outbound_proxy">Исходящий прокси</string> <string name="pref_enable_outbound_proxy">Исходящий прокси</string>
<string name="pref_help_proxy">Имя сервера SIP прокси или адрес ip (необязательно)</string> <string name="pref_help_proxy">Имя сервера SIP прокси или ip адрес (необязательно)</string>
<string name="pref_help_outbound_proxy">Отправить все звонки через SIP прокси</string> <string name="pref_help_outbound_proxy">Отправлять все вызовы через SIP прокси</string>
<string name="pref_help_username">Например: john если Ваш адрес john@sip.example.org</string> <string name="pref_help_username">Например: john если ваш адрес john@sip.example.org</string>
<string name="pref_help_domain">sip.example.org если Ваш адрес john@sip.example.org</string> <string name="pref_help_domain">sip.example.org если ваш адрес john@sip.example.org</string>
<string name="pref_help_password">You have to re-enter your password if you edit the username and/or the domain</string> <string name="pref_help_password">Вы должны повторно ввести ваш пароль, если вы измените имя пользователя и/или домен</string>
<string name="pref_expire_title">Истекает</string> <string name="pref_expire_title">Истекает</string>
<string name="pref_avpf">AVPF</string>
<string name="pref_avpf_rr_interval"> AVPF регулярный интервал RTCP в секундах (от 1 до 5)</string>
<string name="pref_escape_plus">Заменить + на 00</string> <string name="pref_escape_plus">Заменить + на 00</string>
<string name="pref_auth_userid">Auth userid</string> <string name="pref_auth_userid">Имя для аутентификации</string>
<string name="pref_display_name">Display name</string> <string name="pref_help_auth_userid">Введите имя для аутентификации (необязательно)</string>
<string name="pref_display_name">Отображаемое имя</string>
<string name="pref_help_display_name">Введите отображаемое имя (необязательно)</string>
<string name="pref_prefix">Префикс</string> <string name="pref_prefix">Префикс</string>
<string name="pref_transport">Транспорт</string> <string name="pref_transport">Транспорт</string>
<string name="pref_transport_udp">UDP</string> <string name="pref_transport_udp">UDP</string>
<string name="pref_transport_tcp">TCP</string> <string name="pref_transport_tcp">TCP</string>
<string name="pref_transport_tls">TLS</string> <string name="pref_transport_tls">TLS</string>
<string name="pref_delete_account">Удалить учётную запись</string> <string name="pref_delete_account">Удалить аккаунт</string>
<string name="pref_default_account">Использовать как основную</string> <string name="pref_default_account">Использовать по умолчанию</string>
<!--Settings--> <!--Settings-->
<string name="pref_sipaccounts">Учётные записи SIP</string> <string name="pref_sipaccounts">SIP-аккаунты</string>
<string name="default_account_flag">Default account</string> <string name="default_account_flag">Аккаунт по умолчанию</string>
<string name="pref_add_account">Добавить учётную запись</string> <string name="pref_add_account">Добавить аккаунт</string>
<string name="pref_tunnel">Туннель</string> <string name="pref_tunnel">Туннель</string>
<string name="pref_tunnel_host">Сервер</string> <string name="pref_tunnel_host">Сервер</string>
<string name="pref_tunnel_port">Порт</string> <string name="pref_tunnel_port">Порт</string>
@ -128,35 +202,47 @@
<item>всегда</item> <item>всегда</item>
<item>авто</item> <item>авто</item>
</string-array> </string-array>
<string name="pref_none">Отсутствует</string> <string name="pref_none">Нет</string>
<string name="pref_preferences_title">Настройки</string> <string name="pref_preferences_title">Настройки</string>
<string name="pref_video_enable_title">Разрешить видео</string> <string name="pref_video_enable_title">Включить видео</string>
<!--Audio settings--> <!--Audio settings-->
<string name="pref_audio_title">Аудио</string> <string name="pref_audio_title">Аудио</string>
<string name="pref_echo_cancellation">Шумоподавление</string> <string name="pref_echo_cancellation">Эхоподавление</string>
<string name="pref_echo_cancellation_summary">Удаляет эхо, слышимое другой стороной</string> <string name="pref_echo_cancellation_summary">Устраняет эхо, слышимое другой стороной</string>
<string name="ec_calibrating">Настраиваем…</string> <string name="pref_echo_canceller_calibration">Калибровка эхоподавления</string>
<string name="ec_calibrating">Калибровка…</string>
<string name="ec_calibrated">Откалибровано в %s мс</string>
<string name="no_echo">Нет эха</string> <string name="no_echo">Нет эха</string>
<string name="failed">неудавшийся</string> <string name="failed">не удалось</string>
<string name="pref_adaptive_rate_control">Адаптивное управление скорость</string>
<string name="pref_codec_bitrate_limit">Ограничение битрейта кодека</string>
<string name="pref_codecs">Кодеки</string> <string name="pref_codecs">Кодеки</string>
<!--Video settings--> <!--Video settings-->
<string name="pref_video_title">Видео</string> <string name="pref_video_title">Видео</string>
<string name="pref_video_use_front_camera_title">Использовать фронтальную камеру</string> <string name="pref_video_use_front_camera_title">Использовать фронтальную камеру</string>
<string name="pref_video_initiate_call_with_video_title">Начинать видео звонки</string> <string name="pref_video_initiate_call_with_video_title">Начинать видеозвонки</string>
<string name="pref_video_initiate_call_with_video">Всегда посылать видео запросы</string> <string name="pref_video_initiate_call_with_video">Всегда посылать видео запросы</string>
<string name="pref_video_automatically_accept_video_title">Принимать входящие видео звонки</string> <string name="pref_video_automatically_accept_video_title">Принимать входящие видеозвонки</string>
<string name="pref_video_automatically_accept_video">Всегда принимать видео запросы</string> <string name="pref_video_automatically_accept_video">Всегда принимать видео запросы</string>
<string name="pref_preferred_video_size">Preferred video size</string> <string name="pref_video_preset">Предустановка видео</string>
<string name="pref_preferred_video_size">Предпочтительный размер видео</string>
<string name="pref_preferred_fps">Предпочтительный FPS</string>
<string name="pref_bandwidth_limit">Ограничение пропускной способности в Кбит/с</string>
<string name="pref_video_codecs_title">Кодеки</string> <string name="pref_video_codecs_title">Кодеки</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Звонок</string> <string name="pref_call_title">Вызов</string>
<string name="pref_rfc2833_dtmf">Послать RFC2833 DTMFs</string> <string name="pref_rfc2833_dtmf">Отправлять RFC2833 DTMFs</string>
<string name="pref_sipinfo_dtmf">Послать SIP INFO DTMFs</string> <string name="pref_sipinfo_dtmf">Отправлять SIP INFO DTMFs</string>
<string name="pref_voice_mail">URI голосовой почты</string>
<!--Chat settings-->
<string name="pref_chat_title">Чат</string>
<string name="pref_image_sharing_server_title">Сервер обмена</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Сеть</string> <string name="pref_network_title">Сеть</string>
<string name="pref_wifi_only">Использовать только WiFi</string>
<string name="pref_stun_server">Сервер Stun</string> <string name="pref_stun_server">Сервер Stun</string>
<string name="pref_ice_enable">Разрешить ICE</string> <string name="pref_ice_enable">Включить ICE</string>
<string name="pref_upnp_enable">Enable UPNP</string> <string name="pref_upnp_enable">Включить UPNP</string>
<string name="pref_transport_use_random_ports">Использовать случайный порт</string> <string name="pref_transport_use_random_ports">Использовать случайный порт</string>
<string name="pref_sip_port_title">SIP порт занят</string> <string name="pref_sip_port_title">SIP порт занят</string>
<string name="pref_video_port_title">Видео порт или диапазон портов</string> <string name="pref_video_port_title">Видео порт или диапазон портов</string>
@ -164,16 +250,17 @@
<string name="pref_video_port_description">Видео порт или диапазон портов (минимум-максимум)</string> <string name="pref_video_port_description">Видео порт или диапазон портов (минимум-максимум)</string>
<string name="pref_audio_port_description">Аудио порт или диапазон портов (минимум-максимум)</string> <string name="pref_audio_port_description">Аудио порт или диапазон портов (минимум-максимум)</string>
<string name="pref_media_encryption">Шифрование потока</string> <string name="pref_media_encryption">Шифрование потока</string>
<string name="pref_push_notification">Разрешить серверные уведомления</string> <string name="pref_push_notification">Включить push-уведомления</string>
<string name="pref_ipv6_title">Разрешить IPv6</string>
<!--Advanced settings--> <!--Advanced settings-->
<string name="pref_advanced_title">Продвинутые</string> <string name="pref_advanced_title">Дополнительно</string>
<string name="pref_debug">Отладка</string> <string name="pref_debug">Отладка</string>
<string name="pref_background_mode">Фоновый режим</string> <string name="pref_background_mode">Фоновый режим</string>
<string name="pref_animation_enable_title">Разрешить анимацию</string> <string name="pref_animation_enable_title">Включить анимацию</string>
<string name="pref_autostart">Запускаться с системой</string> <string name="pref_autostart">Запуск при загрузке</string>
<string name="pref_image_sharing_server_title">Общий сервер</string> <string name="pref_incoming_call_timeout_title">Отклонение входящего вызова (в секундах)</string>
<string name="pref_remote_provisioning_title">Удалённое резервирование</string> <string name="pref_remote_provisioning_title">Удалённое конфигурирование</string>
<string name="pref_primary_account_title">Основная учётная запись</string> <string name="pref_primary_account_title">Основной аккаунт</string>
<string name="pref_display_name_title">Отображаемое имя</string> <string name="pref_display_name_title">Отображаемое имя</string>
<string name="pref_user_name_title">Имя пользователя</string> <string name="pref_user_name_title">Имя пользователя</string>
<!--Audio hack settings--> <!--Audio hack settings-->
@ -184,22 +271,65 @@
<string name="pref_audio_hacks_use_galaxys_hack_title">Использовать аудио хак Galaxy S</string> <string name="pref_audio_hacks_use_galaxys_hack_title">Использовать аудио хак Galaxy S</string>
<!--Content description--> <!--Content description-->
<string name="content_description_back">Назад</string> <string name="content_description_back">Назад</string>
<string name="content_description_dialer">Клавиатура</string> <string name="content_description_dialer">Номеронабиратель</string>
<string name="content_description_menu">Меню</string>
<string name="content_description_toggle_micro">Переключить микрофон</string>
<string name="content_description_toggle_speaker">Переключить динамик</string>
<string name="content_description_decline">Отклонить</string> <string name="content_description_decline">Отклонить</string>
<string name="content_description_hang_up">Положить трубку</string> <string name="content_description_hang_up">Положить трубку</string>
<string name="content_description_accept">Accept</string> <string name="content_description_accept">Принять</string>
<string name="content_description_edit">Редактировать</string> <string name="content_description_edit">Редактировать</string>
<string name="content_description_add_contact">Кнопка добавить к контактам</string> <string name="content_description_edit_list">Редактировать список</string>
<string name="content_description_add_contact">Добавить в контакты</string>
<string name="content_description_new_contact">Новый контакт</string> <string name="content_description_new_contact">Новый контакт</string>
<string name="content_description_call">Звонок</string> <string name="content_description_call">Вызов</string>
<string name="content_description_chat">Чат</string> <string name="content_description_chat">Чат</string>
<string name="content_description_dialer_back">Вернуться к номеронабирателю</string>
<string name="content_description_contact_picture">Изображение контакта</string>
<string name="content_description_send_message">Отправить сообщение</string>
<string name="content_description_detail">Подробнее</string>
<string name="content_description_delete">Удалить</string> <string name="content_description_delete">Удалить</string>
<string name="content_description_add">Добавить звонок</string> <string name="content_description_add">Добавить вызов</string>
<string name="content_description_add_call">Добавить звонок</string> <string name="content_description_new_discussion">Новая дискуссия</string>
<string name="content_description_search">Поиск</string>
<string name="content_description_search_contact">Поиск контакта</string>
<string name="content_description_all_contacts">Все контакты</string>
<string name="content_description_linphone_contacts">Контакты Linphone</string>
<string name="content_description_call_direction">Направление вызова</string>
<string name="content_description_all_calls">Все вызовы</string>
<string name="content_description_missed_calls">Пропущенные вызовы</string>
<string name="content_description_switch_video">Переключить видео</string>
<string name="content_description_add_call">Добавить вызов</string>
<string name="content_description_pause">Пауза</string>
<string name="content_description_numpad">Цифровая клавиатура</string>
<string name="content_description_history">Кнопка истории</string>
<string name="content_description_chat_button">Кнопка чата</string>
<string name="content_description_contacts">Кнопка контактов</string>
<string name="content_description_call_quality">Качество вызова</string>
<string name="content_description_encryption">Шифрование</string>
<string name="content_description_switch_camera">Переключить камеру</string>
<string name="content_description_cancel_button">Кнопка отмены</string>
<string name="content_description_message_status">Статус сообщения</string>
<string name="content_description_conference">Конференция</string> <string name="content_description_conference">Конференция</string>
<string name="content_description_default_account">Default account</string> <string name="content_description_username_field">Поле имени пользователя</string>
<string name="content_description_display_field">Поле отображаемого имени</string>
<string name="content_description_domain_field">Поле домена</string>
<string name="content_description_url_field">Поле удалённого конфигурирования</string>
<string name="content_description_confirm_password_field">Поле подтверждения пароля</string>
<string name="content_description_email_field">Поле электронной почты</string>
<string name="content_description_default_account">Аккаунт по умолчанию</string>
<string name="content_description_deselect_all">Отменить выбор</string>
<string name="content_description_select_all">Выбрать всё</string>
<string name="content_description_delete_selection">Удалить выбранное</string>
<string name="content_description_contact_first_name">Имя</string> <string name="content_description_contact_first_name">Имя</string>
<string name="content_description_contact_last_name">Фамилия</string> <string name="content_description_contact_last_name">Фамилия</string>
<string name="content_description_back_call">Вернуться к вызову</string>
<string name="content_description_send_file">Отправить файл</string>
<string name="content_description_message">Сообщение</string>
<string name="content_description_unread_chat_message">Непрочитанное сообщение чата</string>
<string name="content_description_transfer">Перевести</string> <string name="content_description_transfer">Перевести</string>
<string name="content_description_earpiece">Наушник</string>
<string name="content_description_bluetooth">Bluetooth</string> <string name="content_description_bluetooth">Bluetooth</string>
<string name="content_description_call_options">Параметры вызова</string>
<string name="content_description_exit_conference">Выйти из конференции</string>
</resources> </resources>

View file

@ -7,6 +7,8 @@
<string name="notification_title">Линфон</string> <string name="notification_title">Линфон</string>
<string name="wait_dialog_text">Покрећем се</string> <string name="wait_dialog_text">Покрећем се</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="sync_account_name">контакти линфона</string>
<string name="today_date_format">ЧЧ:мм</string>
<!--Common--> <!--Common-->
<string name="username">Корисничко име</string> <string name="username">Корисничко име</string>
<string name="display_name">Приказано име</string> <string name="display_name">Приказано име</string>
@ -167,6 +169,9 @@
<string name="pref_call_title">Позови</string> <string name="pref_call_title">Позови</string>
<string name="pref_rfc2833_dtmf">Пошаљи РФЦ2833 ДТМФ-е</string> <string name="pref_rfc2833_dtmf">Пошаљи РФЦ2833 ДТМФ-е</string>
<string name="pref_sipinfo_dtmf">Пошаљи СИП ИНФО ДТФ-е</string> <string name="pref_sipinfo_dtmf">Пошаљи СИП ИНФО ДТФ-е</string>
<!--Chat settings-->
<string name="pref_chat_title">Ћаскање</string>
<string name="pref_image_sharing_server_title">Сервер дељења</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Мрежа</string> <string name="pref_network_title">Мрежа</string>
<string name="pref_stun_server">Стун сервер</string> <string name="pref_stun_server">Стун сервер</string>
@ -186,7 +191,6 @@
<string name="pref_background_mode">Режим позадине</string> <string name="pref_background_mode">Режим позадине</string>
<string name="pref_animation_enable_title">Укључи анимације</string> <string name="pref_animation_enable_title">Укључи анимације</string>
<string name="pref_autostart">Покрени се приликом подизања система</string> <string name="pref_autostart">Покрени се приликом подизања система</string>
<string name="pref_image_sharing_server_title">Сервер дељења</string>
<string name="pref_remote_provisioning_title">Прибављање удаљеног</string> <string name="pref_remote_provisioning_title">Прибављање удаљеног</string>
<string name="pref_primary_account_title">Главни налог</string> <string name="pref_primary_account_title">Главни налог</string>
<string name="pref_display_name_title">Приказано име</string> <string name="pref_display_name_title">Приказано име</string>

View file

@ -7,6 +7,7 @@
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Startar upp</string> <string name="wait_dialog_text">Startar upp</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="sync_account_name">linphone-kontakter</string>
<!--Common--> <!--Common-->
<string name="username">Användarnamn</string> <string name="username">Användarnamn</string>
<string name="display_name">Visningsnamn</string> <string name="display_name">Visningsnamn</string>
@ -132,6 +133,9 @@
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Ring</string> <string name="pref_call_title">Ring</string>
<string name="pref_rfc2833_dtmf">Skicka RFC2833 DTMF</string> <string name="pref_rfc2833_dtmf">Skicka RFC2833 DTMF</string>
<!--Chat settings-->
<string name="pref_chat_title">Chatt</string>
<string name="pref_image_sharing_server_title">Delar server</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">Nätverk</string> <string name="pref_network_title">Nätverk</string>
<string name="pref_stun_server">Stun-server</string> <string name="pref_stun_server">Stun-server</string>
@ -145,7 +149,6 @@
<string name="pref_background_mode">Bakgrundsläge</string> <string name="pref_background_mode">Bakgrundsläge</string>
<string name="pref_animation_enable_title">Aktivera animeringar</string> <string name="pref_animation_enable_title">Aktivera animeringar</string>
<string name="pref_autostart">Starta vid uppstart</string> <string name="pref_autostart">Starta vid uppstart</string>
<string name="pref_image_sharing_server_title">Delar server</string>
<string name="pref_primary_account_title">Primärt konto</string> <string name="pref_primary_account_title">Primärt konto</string>
<string name="pref_display_name_title">Visningsnamn</string> <string name="pref_display_name_title">Visningsnamn</string>
<string name="pref_user_name_title">Användarnamn</string> <string name="pref_user_name_title">Användarnamn</string>

View file

@ -6,46 +6,95 @@
<string name="addressbook_label">Linphone</string> <string name="addressbook_label">Linphone</string>
<string name="notification_title">Linphone</string> <string name="notification_title">Linphone</string>
<string name="wait_dialog_text">Başlatılıyor</string> <string name="wait_dialog_text">Başlatılıyor</string>
<string name="notification_registered">%s kayıtlı</string>
<string name="notification_register_failure">%s kaydedilemedi</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="sync_account_name">Linphone bağlantıları</string>
<string name="today_date_format">SS:dd</string>
<!--Common--> <!--Common-->
<string name="username">Kullanıcı adı</string> <string name="username">Kullanıcı adı</string>
<string name="display_name">Görünen ad</string> <string name="display_name">Görünen ad</string>
<string name="password">Parola</string> <string name="password">Parola</string>
<string name="confirm_password">Parola doğrulama</string>
<string name="domain">Alan adı</string>
<string name="remote_provisioning_url">URL</string>
<string name="email">Eposta</string>
<string name="delete_text">Seçimlerinizi silmek istediğinizden emin misiniz?</string>
<string name="delete">Sil</string> <string name="delete">Sil</string>
<string name="retry">Yeniden dene</string> <string name="retry">Yeniden dene</string>
<string name="cancel">İptal</string> <string name="cancel">İptal</string>
<string name="accept">Kabul et</string> <string name="accept">Kabul et</string>
<string name="continue_text">Sürdürmek</string> <string name="continue_text">Sürdür</string>
<string name="about">Hakkında</string> <string name="about">Hakkında</string>
<string name="deny">Yoksay</string> <string name="deny">Yoksay</string>
<string name="no_account">Yapılandırılmış hesap yok</string>
<string name="search">Arama</string> <string name="search">Arama</string>
<string name="outgoing">Giden</string> <string name="outgoing">Giden</string>
<string name="incoming">Gelen</string> <string name="incoming">Gelen</string>
<string name="missed">Yanıtsız</string> <string name="missed">Yanıtsız</string>
<string name="settings">Ayarlar</string> <string name="settings">Ayarlar</string>
<string name="connect">Bağlantı</string>
<string name="decline">Reddet</string> <string name="decline">Reddet</string>
<string name="conference">Çoklu görüşme</string> <string name="conference">Çoklu görüşme</string>
<!--Launch screen--> <!--Launch screen-->
<string name="app_description"><i>özgür</i> SIP istemcisi</string>
<!--Assistant--> <!--Assistant-->
<string name="welcome">Hoş geldiniz</string>
<string name="assistant">Yardımcı</string>
<string name="assistant_create_account">Hesap Oluştur</string>
<string name="assistant_finish">Yapılandırmayı bitir</string>
<string name="assistant_validate_account">Hesabınız oluşturuldu.Hesabınız için geçerli posta adresinize bakın lütfen.Onu yapınca geri dön ve düğmeyi tıkla.</string>
<string name="assistant_welcome_desc">Bu yardımcı, aramalarınız için bir SİP hesabı kullanmanıza yardım edecek.</string> <string name="assistant_welcome_desc">Bu yardımcı, aramalarınız için bir SİP hesabı kullanmanıza yardım edecek.</string>
<string name="assistant_linphone_login_desc">Linphone hesabınızın kullanıcı adı ve parolasını girin</string>
<string name="assistant_login_desc">SIP alan adı ile kullanıcı adınız ve parolanızı girin</string>
<string name="assistant_remote_provisioning_desc">Lütfen yetkilendirme adresinizi girin</string>
<string name="transport">Taşıma</string> <string name="transport">Taşıma</string>
<string name="assistant_login_linphone">Linphone hesabı kullan</string>
<string name="assistant_login_generic">SIP hesabı kullan</string>
<string name="assistant_remote_provisioning">Uzaktan yapılandırma al</string>
<string name="assistant_create_account_part_1">1/2</string>
<string name="assistant_create_account_part_2">2/2</string>
<string name="assistant_display_name_optional">Görünen ad (isteğe bağlı)</string>
<string name="assistant_linphone_account">Linphone hesabı yapılandır</string>
<string name="assistant_generic_account">SIP hesabı yapılandır</string>
<string name="assistant_remote_provisioning_title">Uzaktan yapılandırma al</string>
<string name="assistant_fetch_apply">Al ve uygula</string>
<string name="assistant_login">Giriş</string>
<string name="assistant_ec_calibration">Yankı giderme ayarlaması sürüyor</string>
<string name="assistant_remote_provisioning_login">Giriş bilgilerinizi girin</string>
<string name="assistant_account_not_validated">Hesabınız henüz onaylanmadı.</string> <string name="assistant_account_not_validated">Hesabınız henüz onaylanmadı.</string>
<string name="assistant_account_validated">Hesabınız onaylandı.</string> <string name="assistant_account_validated">Hesabınız onaylandı.</string>
<string name="assistant_error_bad_credentials">Geçersiz kullanıcı adı ve parola</string>
<string name="wizard_failed">Bir hata oluştu,daha sonra tekrar deneyin.</string> <string name="wizard_failed">Bir hata oluştu,daha sonra tekrar deneyin.</string>
<string name="wizard_server_unavailable">Sunucuya ulaşılamıyor,ağ bağlantınızı kontrol edin.</string>
<string name="wizard_username_unavailable">Bu kullanıcı adı zaten kullanılıyor.</string> <string name="wizard_username_unavailable">Bu kullanıcı adı zaten kullanılıyor.</string>
<string name="wizard_username_incorrect">Kullanıcı adınız geçersiz.</string>
<string name="wizard_email_incorrect">Epostanız geçersiz.</string>
<string name="wizard_password_incorrect">Parolanız geçersiz.</string>
<string name="wizard_passwords_unmatched">Parolalar eşleşmiyor.</string>
<string name="setup_confirm_username">Kullanıcı adınız %s olacak.\r\n\r\nGereklilikleri sağlaması için sizin girdiğinizden farklı olabilir.\r\nKabul ediyor musunuz?</string>
<string name="first_launch_no_login_password">Lütfen giriş adınızı ve parolanızı girin</string> <string name="first_launch_no_login_password">Lütfen giriş adınızı ve parolanızı girin</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">Numara veya adres girin</string>
<!--History--> <!--History-->
<string name="no_call_history">Çağrı geçmişiniz boş</string>
<string name="no_missed_call_history">Geçmişinizde yanıtsız çağrı yok</string>
<string name="delete_history_log">Seçilmiş çağrı kayıtlarını silmek ister misin?</string>
<string name="today">Bugün</string> <string name="today">Bugün</string>
<string name="yesterday">Dün</string> <string name="yesterday">Dün</string>
<!--Contacts--> <!--Contacts-->
<string name="no_contact">Adres defterinizde kimse yok</string> <string name="no_contact">Adres defterinizde kimse yok</string>
<string name="no_sip_contact">Adres defterinizde SİP bağlantısı yok</string> <string name="no_sip_contact">Adres defterinizde SİP bağlantısı yok</string>
<string name="delete_contacts">Seçilen bağlantıları silmek ister misiniz?</string>
<string name="delete_contact">Seçilen bağlantıyı silmek ister misiniz?</string>
<string name="sip_address">SİP adresi</string> <string name="sip_address">SİP adresi</string>
<string name="phone_number">Telefon numarası</string> <string name="phone_number">Telefon numarası</string>
<string name="contact_first_name">Ad</string> <string name="contact_first_name">Ad</string>
<string name="contact_last_name">Soyadı</string> <string name="contact_last_name">Soyadı</string>
<!--Chat--> <!--Chat-->
<string name="no_chat_history">görüşme yok</string>
<string name="delete_conversation">Seçilen görüşmeyi silmek ister misiniz?</string>
<string name="delete_message">Seçilen iletiyi silmek ister misiniz?</string>
<string name="remote_composing">Karşıdan yazılıyor...</string> <string name="remote_composing">Karşıdan yazılıyor...</string>
<string name="share_picture_size_small">Küçük</string> <string name="share_picture_size_small">Küçük</string>
<string name="share_picture_size_medium">Orta</string> <string name="share_picture_size_medium">Orta</string>
@ -57,15 +106,26 @@
<string name="image_saved">Resim kaydedildi</string> <string name="image_saved">Resim kaydedildi</string>
<string name="image_not_saved">Hata,resim kaydedilmedi</string> <string name="image_not_saved">Hata,resim kaydedilmedi</string>
<string name="wait">Lütfen bekleyin...</string> <string name="wait">Lütfen bekleyin...</string>
<string name="processing_image">Görüntü işleniyor, dosyanın boyutuna bağlı olarak bir kaç saniye sürebilir</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Kayıtlı</string> <string name="status_connected">Kayıtlı</string>
<string name="status_not_connected">Kayıtsız</string>
<string name="status_in_progress">Kayıt sürüyor</string> <string name="status_in_progress">Kayıt sürüyor</string>
<string name="status_error">Kayıt başarısız</string> <string name="status_error">Kayıt başarısız</string>
<string name="voicemail_unread">okunmamış iletiler</string> <string name="voicemail_unread">okunmamış iletiler</string>
<!--Side Menu--> <!--Side Menu-->
<string name="menu_assistant">Yardımcı</string>
<string name="menu_settings">Ayarlar</string> <string name="menu_settings">Ayarlar</string>
<string name="menu_about">Hakkında</string> <string name="menu_about">Hakkında</string>
<string name="quit">Çık</string>
<!--Call--> <!--Call-->
<string name="incoming_call">Gelen çağrı</string>
<string name="outgoing_call">Giden çağrı</string>
<string name="add_video_dialog">Görüştüğünüz kişi görüntüyü açmak istiyor</string>
<string name="no_current_call">Etkin arama yok</string>
<string name="call_paused_by_remote">Görüştüğünüz kişi aramayı duraklattı</string>
<string name="couldnt_accept_call">Gelen aramanın kabulünde bir hata oluştu</string>
<string name="zrtp_dialog">ZRTP fişiniz %s\nBunu sadece görüştüğünüz kişinin fişiyle aynıysa kabul etmelisiniz</string>
<string name="unknown_incoming_call_name">Bilinmeyen</string> <string name="unknown_incoming_call_name">Bilinmeyen</string>
<string name="call_stats_audio">Ses</string> <string name="call_stats_audio">Ses</string>
<string name="call_stats_video">Görüntü</string> <string name="call_stats_video">Görüntü</string>
@ -87,15 +147,20 @@
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</string> <string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</string>
<string name="error">Hata</string> <string name="error">Hata</string>
<string name="warning_wrong_destination_address">%s dan gidilecek adres inşa edilemiyor</string>
<string name="error_unknown">Tanımlanmayan hata</string> <string name="error_unknown">Tanımlanmayan hata</string>
<string name="error_call_declined">Reddedilen çağrı</string> <string name="error_call_declined">Reddedilen çağrı</string>
<string name="error_user_not_found">Kullanıcı bulunamadı</string> <string name="error_user_not_found">Kullanıcı bulunamadı</string>
<string name="error_incompatible_media">Uyumsuz ortam değişkenleri</string> <string name="error_incompatible_media">Uyumsuz ortam değişkenleri</string>
<string name="error_low_bandwidth">Görüştüğünüz kişinin bant genişliği düşük, görüntü başlatılamaz.</string>
<string name="error_network_unreachable">Ağa erişim yok</string> <string name="error_network_unreachable">Ağa erişim yok</string>
<string name="error_bad_credentials">Referansı kötü</string> <string name="error_bad_credentials">Referansı kötü</string>
<string name="error_unauthorized">Kimlik doğrulanmadı</string> <string name="error_unauthorized">Kimlik doğrulanmadı</string>
<string name="error_io_error">Ağ hatası</string> <string name="error_io_error">Ağ hatası</string>
<string name="download_image_failed">İndirme başarısız. Lütfen ağ bağlantınızı gözden geçirin ya da daha sonra tekrar deneyin.</string>
<string name="remote_provisioning_failure">Uzaktan yetkilendirme profili indirilirmesi ya da uygulanması başarısız...</string>
<string name="remote_provisioning_again_title">Uzaktan yetkilendirme</string> <string name="remote_provisioning_again_title">Uzaktan yetkilendirme</string>
<string name="remote_provisioning_again_message">Uzaktan yetkilendirme adresinizi değiştirmek istiyor musunuz?</string>
<!--Account Settings--> <!--Account Settings-->
<string name="pref_sipaccount">SİP Hesabı</string> <string name="pref_sipaccount">SİP Hesabı</string>
<string name="pref_manage_title">Yönetme</string> <string name="pref_manage_title">Yönetme</string>
@ -108,11 +173,16 @@
<string name="pref_help_proxy">SİP vekil sunucu makine adı veya ip adresi (isteğe bağlı)</string> <string name="pref_help_proxy">SİP vekil sunucu makine adı veya ip adresi (isteğe bağlı)</string>
<string name="pref_help_outbound_proxy">Bütün çağrıları SİP vekil sunucuya yönlendir</string> <string name="pref_help_outbound_proxy">Bütün çağrıları SİP vekil sunucuya yönlendir</string>
<string name="pref_help_username">Örneğin: John eğer sizin hesabınız john@sip.example.org ise</string> <string name="pref_help_username">Örneğin: John eğer sizin hesabınız john@sip.example.org ise</string>
<string name="pref_help_domain">eğer hesabınız john@sip.example.org ise sip.example.org</string>
<string name="pref_help_password">Kullanıcı adı veya alan adı oluşturduysanız parolanızı tekrar girmeniz gerekir</string> <string name="pref_help_password">Kullanıcı adı veya alan adı oluşturduysanız parolanızı tekrar girmeniz gerekir</string>
<string name="pref_expire_title">Süresi dolmak</string> <string name="pref_expire_title">Süresi dolmak</string>
<string name="pref_avpf">AVPF</string> <string name="pref_avpf">AVPF</string>
<string name="pref_avpf_rr_interval">AVPF düzenli RTCP aralığında ( 1 ile 5 saniye arasında)</string>
<string name="pref_escape_plus">+\'yı 00 ile değiştir</string>
<string name="pref_auth_userid">Kullanıcı kimliği yetkisi</string> <string name="pref_auth_userid">Kullanıcı kimliği yetkisi</string>
<string name="pref_help_auth_userid">Kullanıcı kimliği doğrulumayı girin (isteğe bağlı)</string>
<string name="pref_display_name">Görünen ad</string> <string name="pref_display_name">Görünen ad</string>
<string name="pref_help_display_name">Görünen adı girin (isteğe bağlı)</string>
<string name="pref_prefix">Önek</string> <string name="pref_prefix">Önek</string>
<string name="pref_transport">Taşıma</string> <string name="pref_transport">Taşıma</string>
<string name="pref_transport_udp">UDP</string> <string name="pref_transport_udp">UDP</string>
@ -142,8 +212,10 @@
<string name="pref_audio_title">Ses</string> <string name="pref_audio_title">Ses</string>
<string name="pref_echo_cancellation">Yankı giderme</string> <string name="pref_echo_cancellation">Yankı giderme</string>
<string name="pref_echo_cancellation_summary">Karşıdan gelen yankılı sesi kaldır</string> <string name="pref_echo_cancellation_summary">Karşıdan gelen yankılı sesi kaldır</string>
<string name="pref_echo_canceller_calibration">Yankı giderme ayarı</string>
<string name="ec_calibrating">Ayarlama...</string> <string name="ec_calibrating">Ayarlama...</string>
<string name="no_echo">Eko yok</string> <string name="ec_calibrated">%s ms\'de ayarlandı</string>
<string name="no_echo">Yankı yok</string>
<string name="failed">başarısız</string> <string name="failed">başarısız</string>
<string name="pref_adaptive_rate_control">Uyarlanabilir oran denetimi</string> <string name="pref_adaptive_rate_control">Uyarlanabilir oran denetimi</string>
<string name="pref_codec_bitrate_limit">Çözücü bitrate sınırı</string> <string name="pref_codec_bitrate_limit">Çözücü bitrate sınırı</string>
@ -155,15 +227,22 @@
<string name="pref_video_initiate_call_with_video">Görüntü isteğini her zaman gönder</string> <string name="pref_video_initiate_call_with_video">Görüntü isteğini her zaman gönder</string>
<string name="pref_video_automatically_accept_video_title">Gelen görüntü isteklerini kabul et</string> <string name="pref_video_automatically_accept_video_title">Gelen görüntü isteklerini kabul et</string>
<string name="pref_video_automatically_accept_video">Görüntü isteklerini her zaman kabul et</string> <string name="pref_video_automatically_accept_video">Görüntü isteklerini her zaman kabul et</string>
<string name="pref_video_preset">Görüntü ön ayarı</string>
<string name="pref_preferred_video_size">Yeğlenen görüntü boyutu</string> <string name="pref_preferred_video_size">Yeğlenen görüntü boyutu</string>
<string name="pref_preferred_fps">Yeğlenen FPS</string>
<string name="pref_bandwidth_limit">kbits/s olarak bant genişliği</string> <string name="pref_bandwidth_limit">kbits/s olarak bant genişliği</string>
<string name="pref_video_codecs_title">Çözücüler</string> <string name="pref_video_codecs_title">Çözücüler</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">Çağrı</string> <string name="pref_call_title">Çağrı</string>
<string name="pref_rfc2833_dtmf">RFC2833 DTMF\'yi gönder</string> <string name="pref_rfc2833_dtmf">RFC2833 DTMF\'yi gönder</string>
<string name="pref_sipinfo_dtmf">SIP INFO DTMF\'yi gönder</string> <string name="pref_sipinfo_dtmf">SIP INFO DTMF\'yi gönder</string>
<string name="pref_voice_mail">Sesli posta adresi</string>
<!--Chat settings-->
<string name="pref_chat_title">Sohbet</string>
<string name="pref_image_sharing_server_title">Sunucu paylaşımı</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title"></string> <string name="pref_network_title"></string>
<string name="pref_wifi_only">Sadece WİFİ kullan</string>
<string name="pref_stun_server">Stun sunucusu</string> <string name="pref_stun_server">Stun sunucusu</string>
<string name="pref_ice_enable">İCE Etkin</string> <string name="pref_ice_enable">İCE Etkin</string>
<string name="pref_upnp_enable">UPNP Etkin</string> <string name="pref_upnp_enable">UPNP Etkin</string>
@ -175,13 +254,14 @@
<string name="pref_audio_port_description">Ses bağlantı noktası veya bağlantı noktası aralığı (minport-maxport)</string> <string name="pref_audio_port_description">Ses bağlantı noktası veya bağlantı noktası aralığı (minport-maxport)</string>
<string name="pref_media_encryption">Ortam şifreleme</string> <string name="pref_media_encryption">Ortam şifreleme</string>
<string name="pref_push_notification">Anlık bildirim etkin</string> <string name="pref_push_notification">Anlık bildirim etkin</string>
<string name="pref_ipv6_title">IPv6 ya izin ver</string>
<!--Advanced settings--> <!--Advanced settings-->
<string name="pref_advanced_title">Gelişmiş</string> <string name="pref_advanced_title">Gelişmiş</string>
<string name="pref_debug">Hata ayıklama</string> <string name="pref_debug">Hata ayıklama</string>
<string name="pref_background_mode">Artalan kipi</string> <string name="pref_background_mode">Artalan kipi</string>
<string name="pref_animation_enable_title">Animasyonlar etkin</string> <string name="pref_animation_enable_title">Animasyonlar etkin</string>
<string name="pref_autostart">Başlangıçta çalıştır</string> <string name="pref_autostart">Başlangıçta çalıştır</string>
<string name="pref_image_sharing_server_title">Sunucu paylaşımı</string> <string name="pref_incoming_call_timeout_title">Gelen çağrı kapandı (anında)</string>
<string name="pref_remote_provisioning_title">Uzaktan yetkilendirme</string> <string name="pref_remote_provisioning_title">Uzaktan yetkilendirme</string>
<string name="pref_primary_account_title">Ana hesap</string> <string name="pref_primary_account_title">Ana hesap</string>
<string name="pref_display_name_title">Görünen ad</string> <string name="pref_display_name_title">Görünen ad</string>
@ -189,28 +269,36 @@
<!--Audio hack settings--> <!--Audio hack settings-->
<string name="pref_audio_hacks_title">Ses kesme</string> <string name="pref_audio_hacks_title">Ses kesme</string>
<string name="pref_audio_use_specific_mode_title">Özgün kesme kipi kullan</string> <string name="pref_audio_use_specific_mode_title">Özgün kesme kipi kullan</string>
<string name="pref_audio_use_specific_mode_summary">0=NORMAL_KİP (öntanımlı), 2=GELEN_ÇAĞRI_KİPİ</string>
<string name="pref_audio_hacks_use_routing_api_title">API hack yönlendirmesini kullanın</string>
<string name="pref_audio_hacks_use_galaxys_hack_title">Galaxy S ses kesmeyi kullan</string> <string name="pref_audio_hacks_use_galaxys_hack_title">Galaxy S ses kesmeyi kullan</string>
<!--Content description--> <!--Content description-->
<string name="content_description_back">Geri</string> <string name="content_description_back">Geri</string>
<string name="content_description_dialer">Telefon numarası çevirici</string> <string name="content_description_dialer">Telefon numarası çevirici</string>
<string name="content_description_menu">Menü</string>
<string name="content_description_toggle_micro">Mikrofon düğmesi</string> <string name="content_description_toggle_micro">Mikrofon düğmesi</string>
<string name="content_description_toggle_speaker">Hoparlör düğmesi</string> <string name="content_description_toggle_speaker">Hoparlör düğmesi</string>
<string name="content_description_decline">Reddet</string> <string name="content_description_decline">Reddet</string>
<string name="content_description_hang_up">Telefonu kapat</string> <string name="content_description_hang_up">Telefonu kapat</string>
<string name="content_description_accept">Kabul et</string> <string name="content_description_accept">Kabul et</string>
<string name="content_description_edit">Düzenle</string> <string name="content_description_edit">Düzenle</string>
<string name="content_description_edit_list">Liste Düzenle</string>
<string name="content_description_valid">Geçerli</string>
<string name="content_description_add_contact">Bağlantılara ekle</string> <string name="content_description_add_contact">Bağlantılara ekle</string>
<string name="content_description_new_contact">Yeni bağlantı</string> <string name="content_description_new_contact">Yeni bağlantı</string>
<string name="content_description_call">Çağrı</string> <string name="content_description_call">Çağrı</string>
<string name="content_description_backspace">Geri alma</string> <string name="content_description_backspace">Geri alma</string>
<string name="content_description_chat">Sohbet</string> <string name="content_description_chat">Sohbet</string>
<string name="content_description_dial_back">Geri aramalı</string> <string name="content_description_dial_back">Geri aramalı</string>
<string name="content_description_dialer_back">Çeviriciye dön</string>
<string name="content_description_contact_picture">Kayıtlı kişinin resmi</string> <string name="content_description_contact_picture">Kayıtlı kişinin resmi</string>
<string name="content_description_send_message">İleti gönder</string> <string name="content_description_send_message">İleti gönder</string>
<string name="content_description_detail">Ayrıntılar</string>
<string name="content_description_delete">Sil</string> <string name="content_description_delete">Sil</string>
<string name="content_description_add">Arama ekle</string> <string name="content_description_add">Arama ekle</string>
<string name="content_description_new_discussion">Yeni tartışma</string> <string name="content_description_new_discussion">Yeni tartışma</string>
<string name="content_description_search">Arama</string> <string name="content_description_search">Arama</string>
<string name="content_description_search_contact">Bağlantı ara</string>
<string name="content_description_all_contacts">Tüm bağlantılar</string> <string name="content_description_all_contacts">Tüm bağlantılar</string>
<string name="content_description_linphone_contacts">Linphone bağlantıları</string> <string name="content_description_linphone_contacts">Linphone bağlantıları</string>
<string name="content_description_call_direction">Çağrı yönlendirme</string> <string name="content_description_call_direction">Çağrı yönlendirme</string>
@ -229,9 +317,26 @@
<string name="content_description_cancel_button">İptal düğmesi</string> <string name="content_description_cancel_button">İptal düğmesi</string>
<string name="content_description_message_status">İleti durumu</string> <string name="content_description_message_status">İleti durumu</string>
<string name="content_description_conference">Çoklu görüşme</string> <string name="content_description_conference">Çoklu görüşme</string>
<string name="content_description_username_field">Kullanıcı adı alanı</string>
<string name="content_description_display_field">Görünen ad alanı</string>
<string name="content_description_domain_field">Alan adı alanı</string>
<string name="content_description_url_field">Uzaktan yetkilendirme alanı</string>
<string name="content_description_confirm_password_field">Parola onaylama alanı</string>
<string name="content_description_email_field">Eposta alanı</string>
<string name="content_description_default_account">Öntanımlı hesap</string> <string name="content_description_default_account">Öntanımlı hesap</string>
<string name="content_description_deselect_all">Tüm seçilenleri iptal et</string>
<string name="content_description_select_all">Tümünü seç</string>
<string name="content_description_delete_selection">Şeçimi Sil</string>
<string name="content_description_contact_first_name">Ad</string> <string name="content_description_contact_first_name">Ad</string>
<string name="content_description_contact_last_name">Soyadı</string> <string name="content_description_contact_last_name">Soyadı</string>
<string name="content_description_back_call">Aramaya dön</string>
<string name="content_description_send_file">Bir dosya gönder</string>
<string name="content_description_message">İleti</string>
<string name="content_description_unread_chat_message">Okunmamış sohbet iletisi</string>
<string name="content_description_transfer">Aktarma</string> <string name="content_description_transfer">Aktarma</string>
<string name="content_description_earpiece">Kulaklık</string>
<string name="content_description_bluetooth">Bluetooth</string> <string name="content_description_bluetooth">Bluetooth</string>
<string name="content_description_call_options">Çağrı seçenekleri</string>
<string name="content_description_audio_route">Ses yolu</string>
<string name="content_description_exit_conference">Görüşmeden çık</string>
</resources> </resources>

View file

@ -1,11 +1,23 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<resources> <resources>
<!--Custom--> <!--Custom-->
<string name="app_name">Linphone</string>
<string name="service_name">Linphone 服務</string>
<string name="addressbook_label">Linphone</string>
<string name="notification_title">Linphone</string>
<string name="wait_dialog_text">啟動中</string>
<string name="notification_registered">%s 已註冊</string>
<string name="notification_register_failure">%s 無法註冊</string>
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<!--Common--> <!--Common-->
<string name="username">使用者名稱</string> <string name="username">使用者名稱</string>
<string name="display_name">顯示名稱</string> <string name="display_name">顯示名稱</string>
<string name="password">密碼</string> <string name="password">密碼</string>
<string name="confirm_password">密碼確認</string>
<string name="domain">網域</string>
<string name="remote_provisioning_url">網址</string>
<string name="email">電子郵件</string>
<string name="delete_text">你確定要刪除選取的項目嗎?</string>
<string name="delete">刪除</string> <string name="delete">刪除</string>
<string name="retry">重試</string> <string name="retry">重試</string>
<string name="cancel">取消</string> <string name="cancel">取消</string>
@ -14,28 +26,65 @@
<string name="about">關於</string> <string name="about">關於</string>
<string name="deny">拒絕</string> <string name="deny">拒絕</string>
<string name="search">搜尋</string> <string name="search">搜尋</string>
<string name="outgoing">撥出</string>
<string name="incoming">來電</string>
<string name="missed">未接來電</string> <string name="missed">未接來電</string>
<string name="settings">設定</string> <string name="settings">設定</string>
<string name="connect">連接</string>
<string name="decline">拒絕</string> <string name="decline">拒絕</string>
<string name="conference">會議</string> <string name="conference">會議</string>
<!--Launch screen--> <!--Launch screen-->
<string name="app_description"><i>自由的</i> SIP 客戶端</string>
<!--Assistant--> <!--Assistant-->
<string name="welcome">歡迎</string>
<string name="assistant">助理</string>
<string name="assistant_create_account">建立帳號</string>
<string name="assistant_finish">完成設定</string>
<string name="assistant_validate_account">你的帳號已經建立。請檢查你的郵件來驗證你的帳號。完成時,回到這裡並點擊按鈕。</string>
<string name="assistant_welcome_desc">這個助理將幫助你使用一個 SIP 帳號來通話。</string>
<string name="assistant_linphone_login_desc">輸入你 Linphone 帳號的使用者名稱和密碼</string>
<string name="transport">傳輸</string> <string name="transport">傳輸</string>
<string name="assistant_login_linphone">使用 Linphone 帳號</string>
<string name="assistant_login_generic">使用 SIP 帳號</string>
<string name="assistant_create_account_part_1">1/2</string>
<string name="assistant_create_account_part_2">2/2</string>
<string name="assistant_display_name_optional">顯示名稱(選擇性)</string>
<string name="assistant_linphone_account">設定 Linphone 帳號</string>
<string name="assistant_generic_account">設定 SIP 帳號</string>
<string name="assistant_login">登入</string>
<string name="assistant_ec_calibration">正在進行回音消除器校正</string>
<string name="assistant_account_not_validated">你的帳號還沒被驗證。</string> <string name="assistant_account_not_validated">你的帳號還沒被驗證。</string>
<string name="assistant_account_validated">你的帳號已經被驗證。</string> <string name="assistant_account_validated">你的帳號已經被驗證。</string>
<string name="assistant_error_bad_credentials">不正確的使用者名稱或密碼</string>
<string name="wizard_failed">發生錯誤,請稍候再試。</string> <string name="wizard_failed">發生錯誤,請稍候再試。</string>
<string name="wizard_server_unavailable">無法連接到伺服器,請確認你的網路連接。</string>
<string name="wizard_username_unavailable">這個使用者名稱已經被使用。</string> <string name="wizard_username_unavailable">這個使用者名稱已經被使用。</string>
<string name="wizard_username_incorrect">你的使用者名稱無效。</string>
<string name="wizard_email_incorrect">你的電子郵件無效。</string>
<string name="wizard_password_incorrect">你的密碼無效。</string>
<string name="wizard_passwords_unmatched">密碼不相符</string>
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">輸入號碼或位址</string>
<!--History--> <!--History-->
<string name="no_call_history">歷史中沒有通話</string>
<string name="no_missed_call_history">歷史中沒有未接來電</string>
<string name="delete_history_log">你想要刪除選取的通話紀錄嗎?</string>
<string name="today">今天</string> <string name="today">今天</string>
<string name="yesterday">昨天</string> <string name="yesterday">昨天</string>
<!--Contacts--> <!--Contacts-->
<string name="no_contact">通訊錄中沒有連絡人。</string> <string name="no_contact">通訊錄中沒有連絡人。</string>
<string name="no_sip_contact">通訊錄中沒有 SIP 連絡人。</string> <string name="no_sip_contact">通訊錄中沒有 SIP 連絡人。</string>
<string name="delete_contacts">你想要刪除選取的聯絡人嗎?</string>
<string name="delete_contact">你想要刪除選取的聯絡人嗎?</string>
<string name="sip_address">SIP 位址</string>
<string name="phone_number">電話號碼</string> <string name="phone_number">電話號碼</string>
<string name="contact_first_name">名字</string> <string name="contact_first_name">名字</string>
<string name="contact_last_name">姓氏</string> <string name="contact_last_name">姓氏</string>
<!--Chat--> <!--Chat-->
<string name="no_chat_history">沒有對話</string>
<string name="delete_conversation">你想要刪除選取的對話嗎?</string>
<string name="delete_message">你想要刪除選取的訊息嗎?</string>
<string name="remote_composing">對方正在輸入...</string>
<string name="share_picture_size_small"></string> <string name="share_picture_size_small"></string>
<string name="share_picture_size_medium"></string> <string name="share_picture_size_medium"></string>
<string name="share_picture_size_large"></string> <string name="share_picture_size_large"></string>
@ -48,13 +97,21 @@
<string name="wait">請稍候...</string> <string name="wait">請稍候...</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">已註冊</string> <string name="status_connected">已註冊</string>
<string name="status_not_connected">未註冊</string>
<string name="status_in_progress">正在註冊</string> <string name="status_in_progress">正在註冊</string>
<string name="status_error">註冊失敗</string> <string name="status_error">註冊失敗</string>
<string name="voicemail_unread">未讀訊息</string> <string name="voicemail_unread">未讀訊息</string>
<!--Side Menu--> <!--Side Menu-->
<string name="menu_assistant">助理</string>
<string name="menu_settings">設定</string> <string name="menu_settings">設定</string>
<string name="menu_about">關於</string> <string name="menu_about">關於</string>
<string name="quit">退出</string>
<!--Call--> <!--Call-->
<string name="incoming_call">來電</string>
<string name="outgoing_call">撥出電話</string>
<string name="add_video_dialog">對方想要啟用視訊</string>
<string name="call_paused_by_remote">對方暫停了通話</string>
<string name="couldnt_accept_call">接電話時發生錯誤</string>
<string name="unknown_incoming_call_name">未知</string> <string name="unknown_incoming_call_name">未知</string>
<string name="call_stats_audio">音訊</string> <string name="call_stats_audio">音訊</string>
<string name="call_stats_video">視訊</string> <string name="call_stats_video">視訊</string>
@ -64,15 +121,20 @@
<string name="call_stats_video_resolution">視訊大小:</string> <string name="call_stats_video_resolution">視訊大小:</string>
<string name="call">通話</string> <string name="call">通話</string>
<!--About--> <!--About-->
<string name="menu_send_log">傳送記錄</string>
<string name="menu_reset_log">重設記錄</string>
<!--Service--> <!--Service-->
<string name="notification_started">已啟動</string>
<string name="unread_messages">%i 未讀訊息</string> <string name="unread_messages">%i 未讀訊息</string>
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">關閉</string> <string name="skipable_error_service_not_ready">關閉</string>
<string name="error">錯誤</string> <string name="error">錯誤</string>
<string name="error_unknown">未知錯誤</string> <string name="error_unknown">未知錯誤</string>
<string name="error_user_not_found">找不到使用者</string> <string name="error_user_not_found">找不到使用者</string>
<string name="error_low_bandwidth">對方的頻寬過低,視訊無法啟動</string>
<string name="error_network_unreachable">無法連接網路</string> <string name="error_network_unreachable">無法連接網路</string>
<string name="error_io_error">網路錯誤</string> <string name="error_io_error">網路錯誤</string>
<string name="download_image_failed">下載失敗。請檢查你的網路連接或稍候再試。</string>
<!--Account Settings--> <!--Account Settings-->
<string name="pref_sipaccount">SIP 帳號</string> <string name="pref_sipaccount">SIP 帳號</string>
<string name="pref_manage_title">管理</string> <string name="pref_manage_title">管理</string>
@ -82,11 +144,14 @@
<string name="pref_username">使用者名稱*</string> <string name="pref_username">使用者名稱*</string>
<string name="pref_escape_plus">以 00 取代 +</string> <string name="pref_escape_plus">以 00 取代 +</string>
<string name="pref_display_name">顯示名稱</string> <string name="pref_display_name">顯示名稱</string>
<string name="pref_help_display_name">輸入顯示名稱(選擇性)</string>
<string name="pref_prefix">前綴</string>
<string name="pref_transport">傳輸</string> <string name="pref_transport">傳輸</string>
<string name="pref_transport_udp">UDP</string> <string name="pref_transport_udp">UDP</string>
<string name="pref_transport_tcp">TCP</string> <string name="pref_transport_tcp">TCP</string>
<string name="pref_transport_tls">TLS</string> <string name="pref_transport_tls">TLS</string>
<string name="pref_delete_account">刪除這個帳號</string> <string name="pref_delete_account">刪除這個帳號</string>
<string name="pref_default_account">設為預設值</string>
<!--Settings--> <!--Settings-->
<string name="pref_sipaccounts">SIP 帳號</string> <string name="pref_sipaccounts">SIP 帳號</string>
<string name="default_account_flag">預設帳號</string> <string name="default_account_flag">預設帳號</string>
@ -109,22 +174,30 @@
<string name="pref_audio_title">音訊</string> <string name="pref_audio_title">音訊</string>
<string name="pref_echo_cancellation">回音消除</string> <string name="pref_echo_cancellation">回音消除</string>
<string name="pref_echo_cancellation_summary">移除另一端聽到的回音</string> <string name="pref_echo_cancellation_summary">移除另一端聽到的回音</string>
<string name="pref_echo_canceller_calibration">回音消除器校正</string>
<string name="ec_calibrating">校正中...</string> <string name="ec_calibrating">校正中...</string>
<string name="no_echo">沒有回音</string>
<string name="failed">失敗</string> <string name="failed">失敗</string>
<string name="pref_codec_bitrate_limit">編碼位元率限制</string> <string name="pref_codec_bitrate_limit">編碼位元率限制</string>
<string name="pref_codecs">編碼</string> <string name="pref_codecs">編碼</string>
<!--Video settings--> <!--Video settings-->
<string name="pref_video_title">視訊</string> <string name="pref_video_title">視訊</string>
<string name="pref_video_use_front_camera_title">使用前攝影機</string> <string name="pref_video_use_front_camera_title">使用前攝影機</string>
<string name="pref_video_initiate_call_with_video_title">開始視訊通話</string> <string name="pref_video_initiate_call_with_video_title">發起視訊通話</string>
<string name="pref_video_initiate_call_with_video">總是傳送視訊要求</string> <string name="pref_video_initiate_call_with_video">總是傳送視訊要求</string>
<string name="pref_video_automatically_accept_video_title">接受來電視訊要求</string>
<string name="pref_video_automatically_accept_video">總是接受視訊要求</string> <string name="pref_video_automatically_accept_video">總是接受視訊要求</string>
<string name="pref_video_preset">視訊預設</string>
<string name="pref_preferred_video_size">偏好的視訊大小</string> <string name="pref_preferred_video_size">偏好的視訊大小</string>
<string name="pref_preferred_fps">偏好的 FPS</string>
<string name="pref_video_codecs_title">編碼</string> <string name="pref_video_codecs_title">編碼</string>
<!--Call settings--> <!--Call settings-->
<string name="pref_call_title">通話</string> <string name="pref_call_title">通話</string>
<!--Chat settings-->
<string name="pref_chat_title">聊天</string>
<!--Network settings--> <!--Network settings-->
<string name="pref_network_title">網路</string> <string name="pref_network_title">網路</string>
<string name="pref_wifi_only">只使用 WiFi</string>
<string name="pref_stun_server"> Stun 伺服器</string> <string name="pref_stun_server"> Stun 伺服器</string>
<string name="pref_ice_enable">啟用 ICE</string> <string name="pref_ice_enable">啟用 ICE</string>
<string name="pref_upnp_enable">啟用 UPNP</string> <string name="pref_upnp_enable">啟用 UPNP</string>
@ -135,6 +208,8 @@
<string name="pref_video_port_description">視訊連接埠或連接埠範圍(最小連接埠-最大連接埠)</string> <string name="pref_video_port_description">視訊連接埠或連接埠範圍(最小連接埠-最大連接埠)</string>
<string name="pref_audio_port_description">音訊連接埠或連接埠範圍(最小連接埠-最大連接埠)</string> <string name="pref_audio_port_description">音訊連接埠或連接埠範圍(最小連接埠-最大連接埠)</string>
<string name="pref_media_encryption">媒體加密</string> <string name="pref_media_encryption">媒體加密</string>
<string name="pref_push_notification">啟用推播通知</string>
<string name="pref_ipv6_title">允許 IPv6</string>
<!--Advanced settings--> <!--Advanced settings-->
<string name="pref_advanced_title">進階</string> <string name="pref_advanced_title">進階</string>
<string name="pref_debug">除錯</string> <string name="pref_debug">除錯</string>
@ -148,20 +223,26 @@
<!--Content description--> <!--Content description-->
<string name="content_description_back">返回</string> <string name="content_description_back">返回</string>
<string name="content_description_dialer">撥號器</string> <string name="content_description_dialer">撥號器</string>
<string name="content_description_menu">功能表</string>
<string name="content_description_decline">拒絕</string> <string name="content_description_decline">拒絕</string>
<string name="content_description_hang_up">掛斷</string> <string name="content_description_hang_up">掛斷</string>
<string name="content_description_accept">接受</string> <string name="content_description_accept">接受</string>
<string name="content_description_edit">編輯</string> <string name="content_description_edit">編輯</string>
<string name="content_description_edit_list">編輯清單</string>
<string name="content_description_valid">有效</string>
<string name="content_description_add_contact">加入到連絡人</string> <string name="content_description_add_contact">加入到連絡人</string>
<string name="content_description_new_contact">新增聯絡人</string> <string name="content_description_new_contact">新增聯絡人</string>
<string name="content_description_call">通話</string> <string name="content_description_call">通話</string>
<string name="content_description_backspace">Backspace</string> <string name="content_description_backspace">Backspace</string>
<string name="content_description_chat">聊天</string> <string name="content_description_chat">聊天</string>
<string name="content_description_dial_back">回播</string> <string name="content_description_dial_back">回播</string>
<string name="content_description_dialer_back">回到撥號器</string>
<string name="content_description_contact_picture">連絡人圖片</string> <string name="content_description_contact_picture">連絡人圖片</string>
<string name="content_description_send_message">傳送訊息</string> <string name="content_description_send_message">傳送訊息</string>
<string name="content_description_detail">詳細資料</string>
<string name="content_description_delete">刪除</string> <string name="content_description_delete">刪除</string>
<string name="content_description_search">搜尋</string> <string name="content_description_search">搜尋</string>
<string name="content_description_search_contact">搜尋聯絡人</string>
<string name="content_description_all_contacts">所有聯絡人</string> <string name="content_description_all_contacts">所有聯絡人</string>
<string name="content_description_linphone_contacts">Linphone 聯絡人</string> <string name="content_description_linphone_contacts">Linphone 聯絡人</string>
<string name="content_description_call_direction">通話方向</string> <string name="content_description_call_direction">通話方向</string>
@ -169,6 +250,7 @@
<string name="content_description_missed_calls">未接來電</string> <string name="content_description_missed_calls">未接來電</string>
<string name="content_description_switch_video">切換視訊</string> <string name="content_description_switch_video">切換視訊</string>
<string name="content_description_pause">暫停</string> <string name="content_description_pause">暫停</string>
<string name="content_description_numpad">數字鍵盤</string>
<string name="content_description_history">歷史按鈕</string> <string name="content_description_history">歷史按鈕</string>
<string name="content_description_chat_button">聊天按鈕</string> <string name="content_description_chat_button">聊天按鈕</string>
<string name="content_description_contacts">聯絡人按鈕</string> <string name="content_description_contacts">聯絡人按鈕</string>
@ -178,9 +260,22 @@
<string name="content_description_cancel_button">取消按鈕</string> <string name="content_description_cancel_button">取消按鈕</string>
<string name="content_description_message_status">訊息狀態</string> <string name="content_description_message_status">訊息狀態</string>
<string name="content_description_conference">會議</string> <string name="content_description_conference">會議</string>
<string name="content_description_username_field">使用者名稱欄位</string>
<string name="content_description_display_field">顯示名稱欄位</string>
<string name="content_description_domain_field">網域欄位</string>
<string name="content_description_confirm_password_field">確認密碼欄位</string>
<string name="content_description_email_field">電子郵件欄位</string>
<string name="content_description_default_account">預設帳號</string> <string name="content_description_default_account">預設帳號</string>
<string name="content_description_deselect_all">取消全選</string>
<string name="content_description_select_all">全選</string>
<string name="content_description_delete_selection">刪除選取項目</string>
<string name="content_description_contact_first_name">名字</string> <string name="content_description_contact_first_name">名字</string>
<string name="content_description_contact_last_name">姓氏</string> <string name="content_description_contact_last_name">姓氏</string>
<string name="content_description_back_call">回到通話</string>
<string name="content_description_send_file">傳送檔案</string>
<string name="content_description_message">訊息</string>
<string name="content_description_unread_chat_message">未讀聊天訊息</string>
<string name="content_description_transfer">轉接</string> <string name="content_description_transfer">轉接</string>
<string name="content_description_bluetooth">藍牙</string> <string name="content_description_bluetooth">藍牙</string>
<string name="content_description_call_options">通話選項</string>
</resources> </resources>

View file

@ -24,6 +24,10 @@
<bool name="hide_camera_settings">false</bool> <bool name="hide_camera_settings">false</bool>
<bool name="hide_wizard">false</bool> <bool name="hide_wizard">false</bool>
<bool name="disable_chat">false</bool>
<bool name="disable_chat_message_notification">false</bool>
<bool name="disable_chat_send_file">false</bool>
<bool name="setup_account_validation_mandatory">false</bool> <bool name="setup_account_validation_mandatory">false</bool>
<bool name="hide_linphone_accounts_wizard">false</bool> <bool name="hide_linphone_accounts_wizard">false</bool>
<bool name="hide_generic_accounts_wizard">false</bool> <bool name="hide_generic_accounts_wizard">false</bool>
@ -31,42 +35,26 @@
<bool name="allow_cancel_remote_provisioning_login_activity">true</bool> <bool name="allow_cancel_remote_provisioning_login_activity">true</bool>
<bool name="hide_accounts">false</bool> <bool name="hide_accounts">false</bool>
<bool name="display_account_wizard_at_first_start">true</bool> <bool name="display_account_wizard_at_first_start">true</bool>
<bool name="use_linphone_server_ports">false</bool>
<bool name="allow_only_phone_numbers_in_wizard">false</bool> <bool name="allow_only_phone_numbers_in_wizard">false</bool>
<bool name="enable_linphone_friends">false</bool>
<bool name="use_linphone_tag">true</bool> <bool name="use_linphone_tag">true</bool>
<bool name="disable_options_in_call">false</bool>
<bool name="pre_fill_email_in_wizard">true</bool> <!-- Set the email field of the wizard with one of the gmail account registered on the device --> <bool name="pre_fill_email_in_wizard">true</bool> <!-- Set the email field of the wizard with one of the gmail account registered on the device -->
<bool name="call_last_log_if_adress_is_empty">true</bool>
<bool name="allow_ringing_while_early_media">true</bool>
<bool name="disable_chat">false</bool>
<bool name="disable_chat_message_notification">false</bool>
<bool name="disable_chat_send_file">false</bool>
<bool name="auto_answer_calls">false</bool>
<bool name="allow_transfers">true</bool>
<bool name="forbid_self_call">false</bool> <bool name="forbid_self_call">false</bool>
<bool name="allow_ringing_while_early_media">true</bool>
<bool name="disable_animations">false</bool> <bool name="allow_transfers">true</bool>
<bool name="disable_options_in_call">false</bool>
<bool name="automatically_start_intercepted_outgoing_gsm_call">true</bool> <bool name="automatically_start_intercepted_outgoing_gsm_call">true</bool>
<!-- This settings handle the behavior of the view waiting for the remote provisioning configuration to be done --> <!-- This settings handle the behavior of the view waiting for the remote provisioning configuration to be done -->
<bool name="display_sms_remote_provisioning_activity">false</bool> <bool name="display_sms_remote_provisioning_activity">false</bool>
<bool name="forbid_app_usage_until_remote_provisioning_completed">false</bool> <bool name="forbid_app_usage_until_remote_provisioning_completed">false</bool>
<bool name="display_confirmation_popup_after_first_configuration">false</bool> <bool name="display_confirmation_popup_after_first_configuration">false</bool>
<bool name="enable_log_collect">false</bool>
<bool name="disable_every_log">false</bool> <bool name="disable_every_log">false</bool>
<bool name="disable_all_security_features_for_markets">false</bool> <!-- Disable TLS/SRTP/ZRTP --> <bool name="disable_all_security_features_for_markets">false</bool> <!-- Disable TLS/SRTP/ZRTP -->
<bool name="disable_all_patented_codecs_for_markets">false</bool> <!-- Disable MPEG4/H264 --> <bool name="disable_all_patented_codecs_for_markets">false</bool> <!-- Disable MPEG4/H264 -->
<string name="about_bugreport_email">linphone-android@belledonne-communications.com</string> <string name="about_bugreport_email">linphone-android@belledonne-communications.com</string>
<bool name="use_linphonecore_ringing">false</bool>
<string name="temp_photo_name">linphone-android-photo-temp</string> <string name="temp_photo_name">linphone-android-photo-temp</string>
<string name="temp_photo_name_with_date">linphone-android-photo-%s</string> <string name="temp_photo_name_with_date">linphone-android-photo-%s</string>
@ -82,12 +70,9 @@
<bool name="setup_cancel_move_to_back">false</bool> <bool name="setup_cancel_move_to_back">false</bool>
<bool name="enable_call_notification">true</bool> <bool name="enable_call_notification">true</bool>
<bool name="kill_service_with_task_manager">true</bool> <bool name="kill_service_with_task_manager">true</bool>
<bool name="hash_images_as_name_before_upload">true</bool>
<!-- Tutorial settings --> <!-- Tutorial settings -->
<bool name="show_tutorials_instead_of_app">false</bool> <!-- Be careful ! Setting this to true prevent the app from working ! It will only display tutorial activities --> <bool name="show_tutorials_instead_of_app">false</bool> <!-- Be careful ! Setting this to true prevent the app from working ! It will only display tutorial activities -->

View file

@ -97,6 +97,7 @@
<string name="pref_codecs_key">pref_codecs_key</string> <string name="pref_codecs_key">pref_codecs_key</string>
<string name="pref_stun_server_key">pref_stun_server_key</string> <string name="pref_stun_server_key">pref_stun_server_key</string>
<string name="pref_ice_enable_key">pref_ice_enable_key</string> <string name="pref_ice_enable_key">pref_ice_enable_key</string>
<string name="pref_turn_enable_key">pref_turn_enable_key</string>
<string name="pref_video_codec_vp8_key">pref_video_codec_vp8_key</string> <string name="pref_video_codec_vp8_key">pref_video_codec_vp8_key</string>
<string name="pref_media_encryption_key">pref_media_encryption_key</string> <string name="pref_media_encryption_key">pref_media_encryption_key</string>
<string name="pref_media_encryption_key_none">none</string> <string name="pref_media_encryption_key_none">none</string>
@ -201,4 +202,6 @@
</string-array> </string-array>
<string name="pref_use_lime_encryption_key">pref_use_lime_encryption_key</string> <string name="pref_use_lime_encryption_key">pref_use_lime_encryption_key</string>
<string name="pref_device_ringtone_key">pref_device_ringtone_key</string>
<string name="pref_auto_answer_key">pref_auto_answer_key</string>
</resources> </resources>

View file

@ -110,6 +110,7 @@
<string name="phone_number">Phone number</string> <string name="phone_number">Phone number</string>
<string name="contact_first_name">First name</string> <string name="contact_first_name">First name</string>
<string name="contact_last_name">Last name</string> <string name="contact_last_name">Last name</string>
<string name="contact_organization">Organization</string>
<!-- Chat --> <!-- Chat -->
<string name="no_chat_history">No conversations</string> <string name="no_chat_history">No conversations</string>
@ -270,6 +271,8 @@
<!-- Call settings --> <!-- Call settings -->
<string name="pref_call_title">Call</string> <string name="pref_call_title">Call</string>
<string name="pref_device_ringtone">Use device ringtone</string>
<string name="pref_auto_answer">Auto answer incoming calls</string>
<string name="pref_rfc2833_dtmf">Send RFC2833 DTMFs</string> <string name="pref_rfc2833_dtmf">Send RFC2833 DTMFs</string>
<string name="pref_sipinfo_dtmf">Send SIP INFO DTMFs</string> <string name="pref_sipinfo_dtmf">Send SIP INFO DTMFs</string>
<string name="pref_voice_mail">Voice mail URI</string> <string name="pref_voice_mail">Voice mail URI</string>
@ -288,6 +291,7 @@
<string name="pref_wifi_only">Use WiFi only</string> <string name="pref_wifi_only">Use WiFi only</string>
<string name="pref_stun_server">Stun server</string> <string name="pref_stun_server">Stun server</string>
<string name="pref_ice_enable">Enable ICE</string> <string name="pref_ice_enable">Enable ICE</string>
<string name="pref_turn_enable">Enable TURN</string>
<string name="pref_upnp_enable">Enable UPNP</string> <string name="pref_upnp_enable">Enable UPNP</string>
<string name="pref_transport_use_random_ports">Use random ports</string> <string name="pref_transport_use_random_ports">Use random ports</string>
<string name="pref_sip_port_title">SIP port to use</string> <string name="pref_sip_port_title">SIP port to use</string>
@ -376,6 +380,7 @@
<string name="content_description_delete_selection">Delete selection</string> <string name="content_description_delete_selection">Delete selection</string>
<string name="content_description_contact_first_name">First name</string> <string name="content_description_contact_first_name">First name</string>
<string name="content_description_contact_last_name">Last name</string> <string name="content_description_contact_last_name">Last name</string>
<string name="content_description_contact_organization">Organization</string>
<string name="content_description_back_call">Back to call</string> <string name="content_description_back_call">Back to call</string>
<string name="content_description_send_file">Send a file</string> <string name="content_description_send_file">Send a file</string>
<string name="content_description_message">Message</string> <string name="content_description_message">Message</string>

View file

@ -3,97 +3,113 @@
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_sipaccount" android:title="@string/pref_sipaccount"
android:key="@string/pref_sipaccount_key"> android:key="@string/pref_sipaccount_key"
android:persistent="false">
<EditTextPreference <EditTextPreference
android:title="@string/pref_username" android:title="@string/pref_username"
android:inputType="text|textNoSuggestions"
android:dialogMessage="@string/pref_help_username" android:dialogMessage="@string/pref_help_username"
android:persistent="true"/> android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_auth_userid" android:title="@string/pref_auth_userid"
android:inputType="text|textNoSuggestions"
android:dialogMessage="@string/pref_help_auth_userid" android:dialogMessage="@string/pref_help_auth_userid"
android:persistent="true"/> android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_passwd" android:title="@string/pref_passwd"
android:dialogMessage="@string/pref_help_password" android:dialogMessage="@string/pref_help_password"
android:persistent="true"/> android:inputType="textPassword"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_domain" android:title="@string/pref_domain"
android:dialogMessage="@string/pref_help_domain" android:dialogMessage="@string/pref_help_domain"
android:persistent="true"/> android:inputType="textUri"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_display_name" android:title="@string/pref_display_name"
android:inputType="textPersonName"
android:dialogMessage="@string/pref_help_display_name" android:dialogMessage="@string/pref_help_display_name"
android:persistent="true"/> android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_advanced_title" android:title="@string/pref_advanced_title"
android:key="@string/pref_advanced_key"> android:key="@string/pref_advanced_key"
android:persistent="false">
<ListPreference <ListPreference
android:title="@string/pref_transport" android:title="@string/pref_transport"
android:key="@string/pref_transport_key"/> android:key="@string/pref_transport_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_proxy" android:title="@string/pref_proxy"
android:inputType="textUri"
android:summary="@string/pref_help_proxy" android:summary="@string/pref_help_proxy"
android:persistent="true"/> android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_enable_outbound_proxy" android:title="@string/pref_enable_outbound_proxy"
android:dialogMessage="@string/pref_help_outbound_proxy" android:dialogMessage="@string/pref_help_outbound_proxy"
android:summary="@string/pref_help_outbound_proxy" android:summary="@string/pref_help_outbound_proxy"
android:persistent="true"/> android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_expire_title" android:title="@string/pref_expire_title"
android:key="@string/pref_expire_key" android:key="@string/pref_expire_key"
android:numeric="integer" /> android:numeric="integer"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_prefix" android:title="@string/pref_prefix"
android:key="@string/pref_prefix_key"/> android:key="@string/pref_prefix_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_avpf" android:title="@string/pref_avpf"
android:key="@string/pref_avpf_key"/> android:key="@string/pref_avpf_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_avpf_rr_interval" android:title="@string/pref_avpf_rr_interval"
android:key="@string/pref_avpf_rr_interval_key" android:key="@string/pref_avpf_rr_interval_key"
android:numeric="integer"/> android:numeric="integer"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_escape_plus" android:title="@string/pref_escape_plus"
android:key="@string/pref_escape_plus_key"/> android:key="@string/pref_escape_plus_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_friendlist_subscribe" android:title="@string/pref_friendlist_subscribe"
android:key="@string/pref_friendlist_subscribe_key"/> android:key="@string/pref_friendlist_subscribe_key"
android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_manage_title" android:title="@string/pref_manage_title"
android:key="@string/pref_manage_key"> android:key="@string/pref_manage_key"
android:persistent="false">
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_disable_account" android:title="@string/pref_disable_account"
android:persistent="true"/> android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_default_account" android:title="@string/pref_default_account"
android:persistent="true"/> android:persistent="false"/>
<Preference <Preference
android:title="@string/pref_delete_account" android:title="@string/pref_delete_account"
android:persistent="true"/> android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>

View file

@ -1,257 +1,366 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- DO NOT PUT A PreferenceCategory INSIDE ANOTHER ONE EVER ! -->
<!-- It will trigger [PreferencesListFragment] addPreferencesFromResource TargetInvocationException error -->
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_sipaccounts" android:title="@string/pref_sipaccounts"
android:key="@string/pref_sipaccounts_key"/> android:key="@string/pref_sipaccounts_key"
android:persistent="false"/>
<Preference <Preference
android:title="@string/pref_add_account" android:title="@string/pref_add_account"
android:key="@string/pref_add_account_key"/> android:key="@string/pref_add_account_key"
android:persistent="false"/>
<Preference <Preference
android:title="@string/pref_in_app_store" android:title="@string/pref_in_app_store"
android:key="@string/pref_in_app_store_key"/> android:key="@string/pref_in_app_store_key"
android:persistent="false"/>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_preferences_title">
<PreferenceScreen
android:title="@string/pref_tunnel" android:title="@string/pref_tunnel"
android:key="@string/pref_tunnel_key"> android:key="@string/pref_tunnel_key"
android:persistent="false">
<PreferenceCategory
android:title="@string/pref_tunnel">
<EditTextPreference <EditTextPreference
android:title="@string/pref_tunnel_host" android:title="@string/pref_tunnel_host"
android:key="@string/pref_tunnel_host_key"/> android:key="@string/pref_tunnel_host_key"
android:inputType="textUri"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_tunnel_port" android:title="@string/pref_tunnel_port"
android:key="@string/pref_tunnel_port_key" android:key="@string/pref_tunnel_port_key"
android:numeric="integer"/> android:numeric="integer"
android:persistent="false"/>
<ListPreference <ListPreference
android:title="@string/pref_tunnel_mode" android:title="@string/pref_tunnel_mode"
android:key="@string/pref_tunnel_mode_key" android:key="@string/pref_tunnel_mode_key"
android:entries="@array/tunnel_mode_entries" android:entries="@array/tunnel_mode_entries"
android:entryValues="@array/tunnel_mode_entry_values"/> android:entryValues="@array/tunnel_mode_entry_values"
android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory </PreferenceScreen>
android:title="@string/pref_preferences_title">
<CheckBoxPreference
android:title="@string/pref_video_enable_title"
android:key="@string/pref_video_enable_key"/>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_audio_title"> android:title="@string/pref_audio_title">
<PreferenceCategory
android:title="@string/pref_audio_title">
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_echo_cancellation" android:title="@string/pref_echo_cancellation"
android:key="@string/pref_echo_cancellation_key" android:key="@string/pref_echo_cancellation_key"
android:summary="@string/pref_echo_cancellation_summary"/> android:summary="@string/pref_echo_cancellation_summary"
android:persistent="false"/>
<Preference <Preference
android:title="@string/pref_echo_canceller_calibration" android:title="@string/pref_echo_canceller_calibration"
android:key="@string/pref_echo_canceller_calibration_key"/> android:key="@string/pref_echo_canceller_calibration_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_adaptive_rate_control" android:title="@string/pref_adaptive_rate_control"
android:key="@string/pref_adaptive_rate_control_key" /> android:key="@string/pref_adaptive_rate_control_key"
android:persistent="false"/>
<ListPreference <ListPreference
android:title="@string/pref_codec_bitrate_limit" android:title="@string/pref_codec_bitrate_limit"
android:key="@string/pref_codec_bitrate_limit_key" android:key="@string/pref_codec_bitrate_limit_key"
android:entries="@array/limit_bitrate_entries" android:entries="@array/limit_bitrate_entries"
android:entryValues="@array/limit_bitrate_entry_values" /> android:entryValues="@array/limit_bitrate_entry_values"
android:persistent="false"/>
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_codecs" android:title="@string/pref_codecs"
android:key="@string/pref_codecs_key"/> android:key="@string/pref_codecs_key"
android:persistent="false"/>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_video_title" android:title="@string/pref_video_title"
android:key="@string/pref_video_key" android:key="@string/pref_video_key"
android:dependency="@string/pref_video_enable_key" android:persistent="false">
android:shouldDisableView="true">
<PreferenceCategory
android:title="@string/pref_video_title">
<CheckBoxPreference
android:title="@string/pref_video_enable_title"
android:key="@string/pref_video_enable_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_video_use_front_camera_title" android:title="@string/pref_video_use_front_camera_title"
android:key="@string/pref_video_use_front_camera_key" android:key="@string/pref_video_use_front_camera_key"
android:dependency="@string/pref_video_enable_key" android:dependency="@string/pref_video_enable_key"
android:layout="@layout/hidden"/> android:layout="@layout/hidden"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_video_initiate_call_with_video_title" android:title="@string/pref_video_initiate_call_with_video_title"
android:key="@string/pref_video_initiate_call_with_video_key" android:key="@string/pref_video_initiate_call_with_video_key"
android:summary="@string/pref_video_initiate_call_with_video" android:summary="@string/pref_video_initiate_call_with_video"
android:dependency="@string/pref_video_enable_key"/> android:dependency="@string/pref_video_enable_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_video_automatically_accept_video_title" android:title="@string/pref_video_automatically_accept_video_title"
android:key="@string/pref_video_automatically_accept_video_key" android:key="@string/pref_video_automatically_accept_video_key"
android:summary="@string/pref_video_automatically_accept_video" android:summary="@string/pref_video_automatically_accept_video"
android:dependency="@string/pref_video_enable_key"/> android:dependency="@string/pref_video_enable_key"
android:persistent="false"/>
<ListPreference <ListPreference
android:title="@string/pref_video_preset" android:title="@string/pref_video_preset"
android:key="@string/pref_video_preset_key" android:key="@string/pref_video_preset_key"
android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"
android:entries="@array/video_preset_entries" android:entries="@array/video_preset_entries"
android:entryValues="@array/video_preset_entries" /> android:entryValues="@array/video_preset_entries"
android:persistent="false"/>
<ListPreference <ListPreference
android:title="@string/pref_preferred_video_size" android:title="@string/pref_preferred_video_size"
android:key="@string/pref_preferred_video_size_key"/> android:key="@string/pref_preferred_video_size_key"
android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"
android:persistent="false"/>
<ListPreference <ListPreference
android:title="@string/pref_preferred_fps" android:title="@string/pref_preferred_fps"
android:key="@string/pref_preferred_video_fps_key"/> android:key="@string/pref_preferred_video_fps_key"
android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_bandwidth_limit" android:title="@string/pref_bandwidth_limit"
android:key="@string/pref_bandwidth_limit_key" android:key="@string/pref_bandwidth_limit_key"
android:numeric="integer" /> android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"
android:numeric="integer"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_overlay" android:title="@string/pref_overlay"
android:key="@string/pref_overlay_key" android:key="@string/pref_overlay_key"
android:summary="@string/pref_overlay_summary"/> android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"
android:summary="@string/pref_overlay_summary"
android:persistent="false"/>
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_video_codecs_title" android:title="@string/pref_video_codecs_title"
android:key="@string/pref_video_codecs_key" android:key="@string/pref_video_codecs_key"
android:dependency="@string/pref_video_enable_key" android:dependency="@string/pref_video_enable_key"
android:shouldDisableView="true"/> android:shouldDisableView="true"
android:persistent="false"/>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_call_title"> android:title="@string/pref_call_title">
<PreferenceCategory
android:title="@string/pref_call_title">
<CheckBoxPreference
android:title="@string/pref_device_ringtone"
android:key="@string/pref_device_ringtone_key"
android:persistent="false"/>
<ListPreference
android:title="@string/pref_media_encryption"
android:key="@string/pref_media_encryption_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_sipinfo_dtmf" android:title="@string/pref_sipinfo_dtmf"
android:key="@string/pref_sipinfo_dtmf_key"/> android:key="@string/pref_sipinfo_dtmf_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_rfc2833_dtmf" android:title="@string/pref_rfc2833_dtmf"
android:key="@string/pref_rfc2833_dtmf_key"/> android:key="@string/pref_rfc2833_dtmf_key"
android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_auto_answer"
android:key="@string/pref_auto_answer_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_voice_mail" android:title="@string/pref_voice_mail"
android:key="@string/pref_voice_mail_key"/> android:key="@string/pref_voice_mail_key"
android:persistent="false"/>
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_chat_title"> android:title="@string/pref_chat_title">
<EditTextPreference <PreferenceCategory
android:title="@string/pref_image_sharing_server_title" android:title="@string/pref_chat_title">
android:key="@string/pref_image_sharing_server_key"
android:summary="@string/pref_image_sharing_server_desc"/>
<ListPreference <ListPreference
android:title="@string/pref_use_lime_encryption" android:title="@string/pref_use_lime_encryption"
android:key="@string/pref_use_lime_encryption_key"/> android:key="@string/pref_use_lime_encryption_key"
android:persistent="false"/>
<EditTextPreference
android:title="@string/pref_image_sharing_server_title"
android:key="@string/pref_image_sharing_server_key"
android:summary="@string/pref_image_sharing_server_desc"
android:inputType="textUri"
android:persistent="false"/>
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_network_title"> android:title="@string/pref_network_title">
<PreferenceCategory
android:title="@string/pref_network_title">
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_wifi_only" android:title="@string/pref_wifi_only"
android:key="@string/pref_wifi_only_key"/> android:key="@string/pref_wifi_only_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_stun_server" android:title="@string/pref_stun_server"
android:key="@string/pref_stun_server_key"/> android:key="@string/pref_stun_server_key"
android:inputType="textUri"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_ice_enable" android:title="@string/pref_ice_enable"
android:key="@string/pref_ice_enable_key"/> android:key="@string/pref_ice_enable_key"
android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_turn_enable"
android:key="@string/pref_turn_enable_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_upnp_enable" android:title="@string/pref_upnp_enable"
android:key="@string/pref_upnp_enable_key"/> android:key="@string/pref_upnp_enable_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_transport_use_random_ports" android:title="@string/pref_transport_use_random_ports"
android:key="@string/pref_transport_use_random_ports_key"/> android:key="@string/pref_transport_use_random_ports_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_sip_port_title" android:title="@string/pref_sip_port_title"
android:key="@string/pref_sip_port_key" android:key="@string/pref_sip_port_key"
android:numeric="integer"/> android:numeric="integer"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_audio_port_title" android:title="@string/pref_audio_port_title"
android:key="@string/pref_audio_port_key" android:key="@string/pref_audio_port_key"
android:summary="@string/pref_audio_port_description" android:summary="@string/pref_audio_port_description"
android:layout="@layout/hidden"/> android:layout="@layout/hidden"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_video_port_title" android:title="@string/pref_video_port_title"
android:key="@string/pref_video_port_key" android:key="@string/pref_video_port_key"
android:summary="@string/pref_video_port_description" android:summary="@string/pref_video_port_description"
android:layout="@layout/hidden"/> android:layout="@layout/hidden"
android:persistent="false"/>
<ListPreference
android:title="@string/pref_media_encryption"
android:key="@string/pref_media_encryption_key"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_push_notification" android:title="@string/pref_push_notification"
android:key="@string/pref_push_notification_key"/> android:key="@string/pref_push_notification_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_ipv6_title" android:title="@string/pref_ipv6_title"
android:key="@string/pref_ipv6_key"/> android:key="@string/pref_ipv6_key"
android:persistent="false"/>
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen <PreferenceScreen
android:title="@string/pref_advanced_title"> android:title="@string/pref_advanced_title">
<PreferenceCategory
android:title="@string/pref_advanced_title">
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_debug" android:title="@string/pref_debug"
android:key="@string/pref_debug_key"/> android:key="@string/pref_debug_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_background_mode" android:title="@string/pref_background_mode"
android:key="@string/pref_background_mode_key"/> android:key="@string/pref_background_mode_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_service_notification" android:title="@string/pref_service_notification"
android:key="@string/pref_service_notification_key"/> android:key="@string/pref_service_notification_key"
android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_animation_enable_title"
android:key="@string/pref_animation_enable_key"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_autostart" android:title="@string/pref_autostart"
android:key="@string/pref_autostart_key"/> android:key="@string/pref_autostart_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_incoming_call_timeout_title" android:title="@string/pref_incoming_call_timeout_title"
android:key="@string/pref_incoming_call_timeout_key" android:key="@string/pref_incoming_call_timeout_key"
android:layout="@layout/hidden"/> android:layout="@layout/hidden"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_remote_provisioning_title" android:title="@string/pref_remote_provisioning_title"
android:key="@string/pref_remote_provisioning_key"/> android:key="@string/pref_remote_provisioning_key"
android:inputType="textUri"
android:persistent="false"/>
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_primary_account_title"> android:title="@string/pref_primary_account_title">
<EditTextPreference <EditTextPreference
android:title="@string/pref_display_name_title" android:title="@string/pref_display_name_title"
android:key="@string/pref_display_name_key"/> android:key="@string/pref_display_name_key"
android:inputType="textPersonName"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_user_name_title" android:title="@string/pref_user_name_title"
android:key="@string/pref_user_name_key"/> android:key="@string/pref_user_name_key"
android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
@ -261,17 +370,20 @@
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_audio_hacks_use_routing_api_title" android:title="@string/pref_audio_hacks_use_routing_api_title"
android:key="@string/pref_audio_hacks_use_routing_api_key"/> android:key="@string/pref_audio_hacks_use_routing_api_key"
android:persistent="false"/>
<CheckBoxPreference <CheckBoxPreference
android:title="@string/pref_audio_hacks_use_galaxys_hack_title" android:title="@string/pref_audio_hacks_use_galaxys_hack_title"
android:key="@string/pref_audio_hacks_use_galaxys_hack_key"/> android:key="@string/pref_audio_hacks_use_galaxys_hack_key"
android:persistent="false"/>
<EditTextPreference <EditTextPreference
android:title="@string/pref_audio_use_specific_mode_title" android:title="@string/pref_audio_use_specific_mode_title"
android:key="@string/pref_audio_use_specific_mode_key" android:key="@string/pref_audio_use_specific_mode_key"
android:summary="@string/pref_audio_use_specific_mode_summary" android:summary="@string/pref_audio_use_specific_mode_summary"
android:numeric="integer" /> android:numeric="integer"
android:persistent="false"/>
</PreferenceScreen> </PreferenceScreen>

View file

@ -23,7 +23,6 @@ import org.linphone.core.LinphoneCore.LogCollectionUploadState;
import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import android.app.Dialog;
import android.app.Fragment; import android.app.Fragment;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
@ -32,11 +31,12 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -104,7 +104,7 @@ public class AboutFragment extends Fragment implements OnClickListener {
uploadInProgress = true; uploadInProgress = true;
progress = ProgressDialog.show(LinphoneActivity.instance(), null, null); progress = ProgressDialog.show(LinphoneActivity.instance(), null, null);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorE)); Drawable d = new ColorDrawable(ContextCompat.getColor(getActivity(), R.color.colorE));
d.setAlpha(200); d.setAlpha(200);
progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
progress.getWindow().setBackgroundDrawable(d); progress.getWindow().setBackgroundDrawable(d);

View file

@ -35,7 +35,6 @@ import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory; import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.text.InputType;
import android.view.WindowManager; import android.view.WindowManager;
/** /**
@ -280,7 +279,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
PreferenceCategory account = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_sipaccount_key)); PreferenceCategory account = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_sipaccount_key));
EditTextPreference username = (EditTextPreference) account.getPreference(0); EditTextPreference username = (EditTextPreference) account.getPreference(0);
username.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
username.setOnPreferenceChangeListener(usernameChangedListener); username.setOnPreferenceChangeListener(usernameChangedListener);
if (!isNewAccount){ if (!isNewAccount){
username.setText(mPrefs.getAccountUsername(n)); username.setText(mPrefs.getAccountUsername(n));
@ -288,7 +286,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
} }
EditTextPreference userid = (EditTextPreference) account.getPreference(1); EditTextPreference userid = (EditTextPreference) account.getPreference(1);
userid.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
userid.setOnPreferenceChangeListener(useridChangedListener); userid.setOnPreferenceChangeListener(useridChangedListener);
if (!isNewAccount){ if (!isNewAccount){
userid.setText(mPrefs.getAccountUserId(n)); userid.setText(mPrefs.getAccountUserId(n));
@ -296,14 +293,12 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
} }
EditTextPreference password = (EditTextPreference) account.getPreference(2); EditTextPreference password = (EditTextPreference) account.getPreference(2);
password.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setOnPreferenceChangeListener(passwordChangedListener); password.setOnPreferenceChangeListener(passwordChangedListener);
if(!isNewAccount){ if(!isNewAccount){
password.setText(mPrefs.getAccountPassword(n)); password.setText(mPrefs.getAccountPassword(n));
} }
EditTextPreference domain = (EditTextPreference) account.getPreference(3); EditTextPreference domain = (EditTextPreference) account.getPreference(3);
domain.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
domain.setOnPreferenceChangeListener(domainChangedListener); domain.setOnPreferenceChangeListener(domainChangedListener);
if (!isNewAccount){ if (!isNewAccount){
domain.setText(mPrefs.getAccountDomain(n)); domain.setText(mPrefs.getAccountDomain(n));
@ -311,7 +306,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
} }
EditTextPreference displayName = (EditTextPreference) account.getPreference(4); EditTextPreference displayName = (EditTextPreference) account.getPreference(4);
displayName.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
displayName.setOnPreferenceChangeListener(displayNameChangedListener); displayName.setOnPreferenceChangeListener(displayNameChangedListener);
if (!isNewAccount){ if (!isNewAccount){
displayName.setText(mPrefs.getAccountDisplayName(n)); displayName.setText(mPrefs.getAccountDisplayName(n));
@ -327,7 +321,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
} }
mProxyPreference = (EditTextPreference) advanced.getPreference(1); mProxyPreference = (EditTextPreference) advanced.getPreference(1);
mProxyPreference.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
mProxyPreference.setOnPreferenceChangeListener(proxyChangedListener); mProxyPreference.setOnPreferenceChangeListener(proxyChangedListener);
if (!isNewAccount){ if (!isNewAccount){
mProxyPreference.setText(mPrefs.getAccountProxy(n)); mProxyPreference.setText(mPrefs.getAccountProxy(n));

View file

@ -43,7 +43,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -57,6 +56,7 @@ import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -66,9 +66,6 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.Button; import android.widget.Button;
import android.widget.Chronometer; import android.widget.Chronometer;
@ -103,11 +100,10 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
private StatusFragment status; private StatusFragment status;
private CallAudioFragment audioCallFragment; private CallAudioFragment audioCallFragment;
private CallVideoFragment videoCallFragment; private CallVideoFragment videoCallFragment;
private boolean isSpeakerEnabled = false, isMicMuted = false, isTransferAllowed, isAnimationDisabled; private boolean isSpeakerEnabled = false, isMicMuted = false, isTransferAllowed;
private LinearLayout mControlsLayout; private LinearLayout mControlsLayout;
private Numpad numpad; private Numpad numpad;
private int cameraNumber; private int cameraNumber;
private Animation slideOutLeftToRight, slideInRightToLeft, slideInBottomToTop, slideInTopToBottom, slideOutBottomToTop, slideOutTopToBottom;
private CountDownTimer timer; private CountDownTimer timer;
private boolean isVideoCallPaused = false; private boolean isVideoCallPaused = false;
@ -150,7 +146,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
BluetoothManager.getInstance().initBluetooth(); BluetoothManager.getInstance().initBluetooth();
} }
isAnimationDisabled = getApplicationContext().getResources().getBoolean(R.bool.disable_animations) || !LinphonePreferences.instance().areAnimationsEnabled();
cameraNumber = AndroidCameraConfiguration.retrieveCameras().length; cameraNumber = AndroidCameraConfiguration.retrieveCameras().length;
try { try {
@ -291,6 +286,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
callFragment = new CallVideoFragment(); callFragment = new CallVideoFragment();
videoCallFragment = (CallVideoFragment) callFragment; videoCallFragment = (CallVideoFragment) callFragment;
displayVideoCall(false); displayVideoCall(false);
LinphoneManager.getInstance().routeAudioToSpeaker();
isSpeakerEnabled = true; isSpeakerEnabled = true;
} else { } else {
callFragment = new CallAudioFragment(); callFragment = new CallAudioFragment();
@ -421,15 +417,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
addCall.setBackgroundResource(R.drawable.options_add_call); addCall.setBackgroundResource(R.drawable.options_add_call);
} }
if (!isAnimationDisabled) {
slideInRightToLeft = AnimationUtils.loadAnimation(this, R.anim.slide_in_right_to_left);
slideOutLeftToRight = AnimationUtils.loadAnimation(this, R.anim.slide_out_left_to_right);
slideInBottomToTop = AnimationUtils.loadAnimation(this, R.anim.slide_in_bottom_to_top);
slideInTopToBottom = AnimationUtils.loadAnimation(this, R.anim.slide_in_top_to_bottom);
slideOutBottomToTop = AnimationUtils.loadAnimation(this, R.anim.slide_out_bottom_to_top);
slideOutTopToBottom = AnimationUtils.loadAnimation(this, R.anim.slide_out_top_to_bottom);
}
if (BluetoothManager.getInstance().isBluetoothHeadsetAvailable()) { if (BluetoothManager.getInstance().isBluetoothHeadsetAvailable()) {
try { try {
audioRoute.setVisibility(View.VISIBLE); audioRoute.setVisibility(View.VISIBLE);
@ -962,31 +949,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
public void displayVideoCallControlsIfHidden() { public void displayVideoCallControlsIfHidden() {
if (mControlsLayout != null) { if (mControlsLayout != null) {
if (mControlsLayout.getVisibility() != View.VISIBLE) { if (mControlsLayout.getVisibility() != View.VISIBLE) {
if (isAnimationDisabled) {
displayVideoCall(true); displayVideoCall(true);
} else {
Animation animation = slideInBottomToTop;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
displayVideoCall(true);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
animation.setAnimationListener(null);
}
});
mControlsLayout.startAnimation(animation);
if (cameraNumber > 1) {
switchCamera.startAnimation(slideInTopToBottom);
}
pause.startAnimation(slideInTopToBottom);
}
} }
resetControlsHidingCallBack(); resetControlsHidingCallBack();
} }
@ -1002,8 +965,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
mControlsHandler.postDelayed(mControls = new Runnable() { mControlsHandler.postDelayed(mControls = new Runnable() {
public void run() { public void run() {
hideNumpad(); hideNumpad();
if (isAnimationDisabled) {
video.setEnabled(true); video.setEnabled(true);
transfer.setVisibility(View.INVISIBLE); transfer.setVisibility(View.INVISIBLE);
addCall.setVisibility(View.INVISIBLE); addCall.setVisibility(View.INVISIBLE);
@ -1011,36 +972,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
displayVideoCall(false); displayVideoCall(false);
numpad.setVisibility(View.GONE); numpad.setVisibility(View.GONE);
options.setImageResource(R.drawable.options_default); options.setImageResource(R.drawable.options_default);
} else {
Animation animation = slideOutTopToBottom;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
video.setEnabled(false); // HACK: Used to avoid controls from being hided if video is switched while controls are hiding
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
video.setEnabled(true); // HACK: Used to avoid controls from being hided if video is switched while controls are hiding
transfer.setVisibility(View.INVISIBLE);
addCall.setVisibility(View.INVISIBLE);
conference.setVisibility(View.INVISIBLE);
displayVideoCall(false);
numpad.setVisibility(View.GONE);
options.setImageResource(R.drawable.options_default);
animation.setAnimationListener(null);
}
});
mControlsLayout.startAnimation(animation);
if (cameraNumber > 1) {
switchCamera.startAnimation(slideOutBottomToTop);
}
pause.startAnimation(slideOutBottomToTop);
}
} }
}, SECONDS_BEFORE_HIDING_CONTROLS); }, SECONDS_BEFORE_HIDING_CONTROLS);
} }
@ -1059,29 +990,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
} }
dialer.setImageResource(R.drawable.footer_dialer); dialer.setImageResource(R.drawable.footer_dialer);
if (isAnimationDisabled) {
numpad.setVisibility(View.GONE); numpad.setVisibility(View.GONE);
} else {
Animation animation = slideOutTopToBottom;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
numpad.setVisibility(View.GONE);
animation.setAnimationListener(null);
}
});
numpad.startAnimation(animation);
}
} }
private void hideOrDisplayNumpad() { private void hideOrDisplayNumpad() {
@ -1093,185 +1002,8 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
hideNumpad(); hideNumpad();
} else { } else {
dialer.setImageResource(R.drawable.dialer_alt_back); dialer.setImageResource(R.drawable.dialer_alt_back);
if (isAnimationDisabled) {
numpad.setVisibility(View.VISIBLE); numpad.setVisibility(View.VISIBLE);
} else {
Animation animation = slideInBottomToTop;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
} }
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
numpad.setVisibility(View.VISIBLE);
animation.setAnimationListener(null);
}
});
numpad.startAnimation(animation);
}
}
}
private void hideAnimatedPortraitCallOptions() {
Animation animation = slideOutLeftToRight;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (isTransferAllowed) {
transfer.setVisibility(View.INVISIBLE);
}
addCall.setVisibility(View.INVISIBLE);
conference.setVisibility(View.INVISIBLE);
animation.setAnimationListener(null);
}
});
if (isTransferAllowed) {
transfer.startAnimation(animation);
}
addCall.startAnimation(animation);
conference.startAnimation(animation);
}
private void hideAnimatedLandscapeCallOptions() {
Animation animation = slideOutTopToBottom;
if (isTransferAllowed) {
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
transfer.setAnimation(null);
transfer.setVisibility(View.INVISIBLE);
animation = AnimationUtils.loadAnimation(CallActivity.this, R.anim.slide_out_top_to_bottom); // Reload animation to prevent transfer button to blink
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
addCall.setVisibility(View.INVISIBLE);
}
});
addCall.startAnimation(animation);
}
});
transfer.startAnimation(animation);
conference.startAnimation(animation);
} else {
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
addCall.setVisibility(View.INVISIBLE);
conference.setVisibility(View.INVISIBLE);
}
});
addCall.startAnimation(animation);
conference.startAnimation(animation);
}
}
private void showAnimatedPortraitCallOptions() {
Animation animation = slideInRightToLeft;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
options.setImageResource(R.drawable.options_default);
if (isTransferAllowed) {
transfer.setVisibility(View.VISIBLE);
}
addCall.setVisibility(View.VISIBLE);
conference.setVisibility(View.VISIBLE);
animation.setAnimationListener(null);
}
});
if (isTransferAllowed) {
transfer.startAnimation(animation);
}
conference.startAnimation(animation);
addCall.startAnimation(animation);
}
private void showAnimatedLandscapeCallOptions() {
Animation animation = slideInBottomToTop;
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
addCall.setAnimation(null);
options.setImageResource(R.drawable.options_default);
addCall.setVisibility(View.VISIBLE);
conference.setVisibility(View.VISIBLE);
if (isTransferAllowed) {
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
transfer.setVisibility(View.VISIBLE);
}
});
transfer.startAnimation(animation);
}
conference.startAnimation(animation);
}
});
addCall.startAnimation(animation);
} }
private void hideOrDisplayAudioRoutes() private void hideOrDisplayAudioRoutes()
@ -1288,40 +1020,21 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
} }
private void hideOrDisplayCallOptions() { private void hideOrDisplayCallOptions() {
boolean isOrientationLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
//Hide options //Hide options
if (addCall.getVisibility() == View.VISIBLE) { if (addCall.getVisibility() == View.VISIBLE) {
options.setImageResource(R.drawable.options_default); options.setImageResource(R.drawable.options_default);
if (isAnimationDisabled) {
if (isTransferAllowed) { if (isTransferAllowed) {
transfer.setVisibility(View.INVISIBLE); transfer.setVisibility(View.INVISIBLE);
} }
addCall.setVisibility(View.INVISIBLE); addCall.setVisibility(View.INVISIBLE);
conference.setVisibility(View.INVISIBLE); conference.setVisibility(View.INVISIBLE);
} else { } else { //Display options
if (isOrientationLandscape) {
hideAnimatedLandscapeCallOptions();
} else {
hideAnimatedPortraitCallOptions();
}
}
//Display options
} else {
if (isAnimationDisabled) {
if (isTransferAllowed) { if (isTransferAllowed) {
transfer.setVisibility(View.VISIBLE); transfer.setVisibility(View.VISIBLE);
} }
addCall.setVisibility(View.VISIBLE); addCall.setVisibility(View.VISIBLE);
conference.setVisibility(View.VISIBLE); conference.setVisibility(View.VISIBLE);
options.setImageResource(R.drawable.options_selected); options.setImageResource(R.drawable.options_selected);
} else {
if (isOrientationLandscape) {
showAnimatedLandscapeCallOptions();
} else {
showAnimatedPortraitCallOptions();
}
}
transfer.setEnabled(LinphoneManager.getLc().getCurrentCall() != null); transfer.setEnabled(LinphoneManager.getLc().getCurrentCall() != null);
} }
} }
@ -1401,7 +1114,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
private void showAcceptCallUpdateDialog() { private void showAcceptCallUpdateDialog() {
final Dialog dialog = new Dialog(this); final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
dialog.setContentView(R.layout.dialog); dialog.setContentView(R.layout.dialog);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT); dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT);
@ -1862,12 +1575,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
if (count > 0) { if (count > 0) {
missedChats.setText(count + ""); missedChats.setText(count + "");
missedChats.setVisibility(View.VISIBLE); missedChats.setVisibility(View.VISIBLE);
if (!isAnimationDisabled) {
missedChats.startAnimation(AnimationUtils.loadAnimation(this, R.anim.bounce));
}
if(count > 99){
//TODO
}
} else { } else {
missedChats.clearAnimation(); missedChats.clearAnimation();
missedChats.setVisibility(View.GONE); missedChats.setVisibility(View.GONE);

View file

@ -17,9 +17,8 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
import android.app.Activity;
import android.os.Bundle;
import android.app.Fragment; import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@ -40,18 +39,13 @@ public class CallAudioFragment extends Fragment {
} }
@Override @Override
public void onAttach(Activity activity) { public void onStart() {
super.onAttach(activity); super.onStart();
incallActvityInstance = (CallActivity) activity; incallActvityInstance = (CallActivity) getActivity();
if (incallActvityInstance != null) { if (incallActvityInstance != null) {
incallActvityInstance.bindAudioFragment(this); incallActvityInstance.bindAudioFragment(this);
} }
}
@Override
public void onStart() {
super.onStart();
// Just to be sure we have incall controls // Just to be sure we have incall controls
if (incallActvityInstance != null) { if (incallActvityInstance != null) {

View file

@ -21,6 +21,7 @@ package org.linphone;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCall.State;
@ -35,7 +36,6 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.PowerManager; import android.os.PowerManager;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
@ -89,11 +89,7 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
getWindow().addFlags(flags); getWindow().addFlags(flags);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { isScreenActive = Compatibility.isScreenOn(pm);
isScreenActive = pm.isInteractive();
} else {
isScreenActive = pm.isScreenOn();
}
final int screenWidth = getResources().getDisplayMetrics().widthPixels; final int screenWidth = getResources().getDisplayMetrics().widthPixels;

View file

@ -25,7 +25,6 @@ import org.linphone.mediastream.Log;
import org.linphone.mediastream.video.AndroidVideoWindowImpl; import org.linphone.mediastream.video.AndroidVideoWindowImpl;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.os.Bundle; import android.os.Bundle;
import android.view.GestureDetector; import android.view.GestureDetector;
@ -132,6 +131,15 @@ public class CallVideoFragment extends Fragment implements OnGestureListener, On
return view; return view;
} }
@Override
public void onStart() {
super.onStart();
inCallActivity = (CallActivity) getActivity();
if (inCallActivity != null) {
inCallActivity.bindVideoFragment(this);
}
}
private void fixZOrder(SurfaceView video, SurfaceView preview) { private void fixZOrder(SurfaceView video, SurfaceView preview) {
video.setZOrderOnTop(false); video.setZOrderOnTop(false);
preview.setZOrderOnTop(true); preview.setZOrderOnTop(true);
@ -293,15 +301,6 @@ public class CallVideoFragment extends Fragment implements OnGestureListener, On
super.onDestroy(); super.onDestroy();
} }
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
inCallActivity = (CallActivity) activity;
if (inCallActivity != null) {
inCallActivity.bindVideoFragment(this);
}
}
@Override @Override
public boolean onDown(MotionEvent e) { public boolean onDown(MotionEvent e) {
return true; // Needed to make the GestureDetector working return true; // Needed to make the GestureDetector working

View file

@ -183,7 +183,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
initNewChatConversation(); initNewChatConversation();
} }
//Manage multiline
message = (EditText) view.findViewById(R.id.message); message = (EditText) view.findViewById(R.id.message);
sendImage = (ImageView) view.findViewById(R.id.send_picture); sendImage = (ImageView) view.findViewById(R.id.send_picture);
@ -1027,7 +1026,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
if(search != null) { if(search != null) {
for (ContactAddress c : searchAdapter.contacts) { for (ContactAddress c : searchAdapter.contacts) {
String address = c.address; String address = c.address;
if(address.startsWith("sip:")) address = address.substring(4); if (address.startsWith("sip:")) address = address.substring(4);
if (c.contact.getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault())) if (c.contact.getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))
|| address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) { || address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) {
result.add(c); result.add(c);
@ -1045,7 +1044,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
SearchContactsListAdapter(List<ContactAddress> contactsList) { SearchContactsListAdapter(List<ContactAddress> contactsList) {
mInflater = inflater; mInflater = inflater;
if(contactsList == null){ if (contactsList == null) {
contacts = getContactsList(); contacts = getContactsList();
} else { } else {
contacts = contactsList; contacts = contactsList;
@ -1057,7 +1056,13 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
if(ContactsManager.getInstance().hasContacts()) { if(ContactsManager.getInstance().hasContacts()) {
for (LinphoneContact con : ContactsManager.getInstance().getContacts()) { for (LinphoneContact con : ContactsManager.getInstance().getContacts()) {
for (LinphoneNumberOrAddress noa : con.getNumbersOrAddresses()) { for (LinphoneNumberOrAddress noa : con.getNumbersOrAddresses()) {
list.add(new ContactAddress(con, noa.getValue())); String value = noa.getValue();
// Fix for sip:username compatibility issue
if (value.startsWith("sip:") && !value.contains("@")) {
value = value.substring(4);
value = LinphoneUtils.getFullAddressFromUsername(value);
}
list.add(new ContactAddress(con, value));
} }
} }
} }
@ -1095,7 +1100,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
} }
final String a = contact.address; final String a = contact.address;
final LinphoneContact c = contact.contact; LinphoneContact c = contact.contact;
TextView name = (TextView) view.findViewById(R.id.contact_name); TextView name = (TextView) view.findViewById(R.id.contact_name);
name.setText(c.getFullName()); name.setText(c.getFullName());

View file

@ -55,7 +55,7 @@ import android.widget.TextView;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
public class ChatListFragment extends Fragment implements OnClickListener, OnItemClickListener { public class ChatListFragment extends Fragment implements OnClickListener, OnItemClickListener, ContactsUpdatedListener {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private List<String> mConversations; private List<String> mConversations;
private ListView chatList; private ListView chatList;
@ -193,6 +193,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
ContactsManager.addContactsListener(this);
if (LinphoneManager.getLc().getCallsNb() > 0) { if (LinphoneManager.getLc().getCallsNb() > 0) {
backInCall.setVisibility(View.VISIBLE); backInCall.setVisibility(View.VISIBLE);
@ -219,9 +220,15 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
if (lc != null) { if (lc != null) {
lc.removeListener(mListener); lc.removeListener(mListener);
} }
ContactsManager.removeContactsListener(this);
super.onPause(); super.onPause();
} }
@Override
public void onContactsUpdated() {
hideAndDisplayMessageIfNoChat();
}
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); super.onCreateContextMenu(menu, v, menuInfo);

View file

@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
* @deprecated
*/ */
public class ChatMessage { public class ChatMessage {
private String message; private String message;

View file

@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.LinphoneProxyConfig;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
@ -39,6 +38,7 @@ import android.widget.TextView;
public class ContactDetailsFragment extends Fragment implements OnClickListener { public class ContactDetailsFragment extends Fragment implements OnClickListener {
private LinphoneContact contact; private LinphoneContact contact;
private ImageView editContact, deleteContact, back; private ImageView editContact, deleteContact, back;
private TextView organization;
private LayoutInflater inflater; private LayoutInflater inflater;
private View view; private View view;
private boolean displayChatAddressOnly = false; private boolean displayChatAddressOnly = false;
@ -47,22 +47,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated()) {
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); LinphoneActivity.instance().setAddresGoToDialerAndCall(v.getTag().toString(), contact.getFullName(), contact.getPhotoUri());
if (lc != null) {
LinphoneProxyConfig lpc = lc.getDefaultProxyConfig();
String to;
if (lpc != null) {
String address = v.getTag().toString();
if (!address.contains("@")) {
to = lpc.normalizePhoneNumber(address);
} else {
to = v.getTag().toString();
}
} else {
to = v.getTag().toString();
}
LinphoneActivity.instance().setAddresGoToDialerAndCall(to, contact.getFullName(), contact.getPhotoUri());
}
} }
} }
}; };
@ -92,6 +77,14 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
deleteContact = (ImageView) view.findViewById(R.id.deleteContact); deleteContact = (ImageView) view.findViewById(R.id.deleteContact);
deleteContact.setOnClickListener(this); deleteContact.setOnClickListener(this);
organization = (TextView) view.findViewById(R.id.contactOrganization);
String org = contact.getOrganization();
if (org != null && !org.isEmpty()) {
organization.setText(org);
} else {
organization.setVisibility(View.GONE);
}
back = (ImageView) view.findViewById(R.id.back); back = (ImageView) view.findViewById(R.id.back);
if(getResources().getBoolean(R.bool.isTablet)){ if(getResources().getBoolean(R.bool.isTablet)){
back.setVisibility(View.INVISIBLE); back.setVisibility(View.INVISIBLE);
@ -125,13 +118,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
boolean skip = false; boolean skip = false;
View v = inflater.inflate(R.layout.contact_control_row, null); View v = inflater.inflate(R.layout.contact_control_row, null);
String displayednumberOrAddress = noa.getValue(); String displayednumberOrAddress = LinphoneUtils.getDisplayableUsernameFromAddress(noa.getValue());
if (displayednumberOrAddress.startsWith("sip:")) {
displayednumberOrAddress = displayednumberOrAddress.replace("sip:", "");
}
if (displayednumberOrAddress.contains("@")) {
displayednumberOrAddress = displayednumberOrAddress.split("@")[0];
}
TextView label = (TextView) v.findViewById(R.id.address_label); TextView label = (TextView) v.findViewById(R.id.address_label);
if (noa.isSIPAddress()) { if (noa.isSIPAddress()) {
@ -156,48 +143,13 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
v.findViewById(R.id.contact_chat).setOnClickListener(chatListener); v.findViewById(R.id.contact_chat).setOnClickListener(chatListener);
LinphoneProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig(); LinphoneProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig();
if (lpc != null) { if (lpc != null) {
displayednumberOrAddress = lpc.normalizePhoneNumber(displayednumberOrAddress); String username = lpc.normalizePhoneNumber(LinphoneUtils.getUsernameFromAddress(noa.getValue()));
String tag = noa.getValue(); String tag = LinphoneUtils.getFullAddressFromUsername(username);
if (!tag.startsWith("sip:")) {
tag = "sip:" + tag;
}
if (!tag.contains("@")) {
tag = tag + "@" + lpc.getDomain();
}
v.findViewById(R.id.contact_chat).setTag(tag); v.findViewById(R.id.contact_chat).setTag(tag);
} else { } else {
v.findViewById(R.id.contact_chat).setTag(noa.getValue()); v.findViewById(R.id.contact_chat).setTag(noa.getValue());
} }
/*ImageView friend = (ImageView) v.findViewById(R.id.addFriend);
if (getResources().getBoolean(R.bool.enable_linphone_friends) && !displayChatAddressOnly) {
friend.setVisibility(View.VISIBLE);
boolean isAlreadyAFriend = LinphoneManager.getLc().findFriendByAddress(finalNumberOrAddress) != null;
if (!isAlreadyAFriend) {
friend.setImageResource(R.drawable.contact_add);
friend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (ContactsManager.getInstance().createNewFriend(contact, finalNumberOrAddress)) {
displayContact(ContactFragment.this.inflater, ContactFragment.this.view);
}
}
});
} else {
friend.setImageResource(R.drawable.delete);
friend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (ContactsManager.getInstance().removeFriend(finalNumberOrAddress)) {
displayContact(ContactFragment.this.inflater, ContactFragment.this.view);
}
}
});
}
}*/
if (getResources().getBoolean(R.bool.disable_chat)) { if (getResources().getBoolean(R.bool.disable_chat)) {
v.findViewById(R.id.contact_chat).setVisibility(View.GONE); v.findViewById(R.id.contact_chat).setVisibility(View.GONE);
} }

View file

@ -25,8 +25,6 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.mediastream.Version; import org.linphone.mediastream.Version;
@ -64,7 +62,7 @@ public class ContactEditorFragment extends Fragment {
private ImageView cancel, deleteContact, ok; private ImageView cancel, deleteContact, ok;
private ImageView addNumber, addSipAddress, contactPicture; private ImageView addNumber, addSipAddress, contactPicture;
private LinearLayout phoneNumbersSection, sipAddressesSection; private LinearLayout phoneNumbersSection, sipAddressesSection;
private EditText firstName, lastName; private EditText firstName, lastName, organization;
private LayoutInflater inflater; private LayoutInflater inflater;
private static final int ADD_PHOTO = 1337; private static final int ADD_PHOTO = 1337;
@ -126,10 +124,6 @@ public class ContactEditorFragment extends Fragment {
ok.setOnClickListener(new OnClickListener() { ok.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
LinphoneProxyConfig lpc = lc != null ? lc.getDefaultProxyConfig() : null;
String defaultDomain = lpc != null ? lpc.getDomain() : null;
if (isNewContact) { if (isNewContact) {
boolean areAllFielsEmpty = true; boolean areAllFielsEmpty = true;
for (LinphoneNumberOrAddress nounoa : numbersAndAddresses) { for (LinphoneNumberOrAddress nounoa : numbersAndAddresses) {
@ -150,15 +144,11 @@ public class ContactEditorFragment extends Fragment {
} }
for (LinphoneNumberOrAddress noa : numbersAndAddresses) { for (LinphoneNumberOrAddress noa : numbersAndAddresses) {
if (noa.isSIPAddress() && noa.getValue() != null) { if (noa.isSIPAddress() && noa.getValue() != null) {
if (!noa.getValue().contains("@") && defaultDomain != null) { noa.setValue(LinphoneUtils.getFullAddressFromUsername(noa.getValue()));
noa.setValue(noa.getValue() + "@" + defaultDomain);
}
if (!noa.getValue().startsWith("sip:")) {
noa.setValue("sip:" + noa.getValue());
}
} }
contact.addOrUpdateNumberOrAddress(noa); contact.addOrUpdateNumberOrAddress(noa);
} }
contact.setOrganization(organization.getText().toString());
contact.save(); contact.save();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
} }
@ -214,6 +204,11 @@ public class ContactEditorFragment extends Fragment {
} }
}); });
organization = (EditText) view.findViewById(R.id.contactOrganization);
if (!isNewContact) {
organization.setText(contact.getOrganization());
}
if (!isNewContact) { if (!isNewContact) {
String fn = contact.getFirstName(); String fn = contact.getFirstName();
String ln = contact.getLastName(); String ln = contact.getLastName();
@ -331,7 +326,6 @@ public class ContactEditorFragment extends Fragment {
final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name)); File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
pickedPhotoForContactUri = Uri.fromFile(file); pickedPhotoForContactUri = Uri.fromFile(file);
captureIntent.putExtra("crop", "true");
captureIntent.putExtra("outputX", PHOTO_SIZE); captureIntent.putExtra("outputX", PHOTO_SIZE);
captureIntent.putExtra("outputY", PHOTO_SIZE); captureIntent.putExtra("outputY", PHOTO_SIZE);
captureIntent.putExtra("aspectX", 0); captureIntent.putExtra("aspectX", 0);
@ -485,10 +479,7 @@ public class ContactEditorFragment extends Fragment {
if (firstSipAddressIndex == -1) { if (firstSipAddressIndex == -1) {
firstSipAddressIndex = controls.getChildCount(); firstSipAddressIndex = controls.getChildCount();
} }
numberOrAddress = numberOrAddress.replace("sip:", ""); numberOrAddress = LinphoneUtils.getDisplayableUsernameFromAddress(numberOrAddress);
if (numberOrAddress.contains("@")) {
numberOrAddress = numberOrAddress.split("@")[0];
}
} }
if ((getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) && !isSIP) || (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor) && isSIP)) { if ((getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) && !isSIP) || (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor) && isSIP)) {
if (forceAddNumber) if (forceAddNumber)
@ -513,7 +504,9 @@ public class ContactEditorFragment extends Fragment {
final View view = inflater.inflate(R.layout.contact_edit_row, null); final View view = inflater.inflate(R.layout.contact_edit_row, null);
final EditText noa = (EditText) view.findViewById(R.id.numoraddr); final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
noa.setInputType(isSIP ? InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS : InputType.TYPE_CLASS_PHONE); if (!isSIP) {
noa.setInputType(InputType.TYPE_CLASS_PHONE);
}
noa.setText(numberOrAddress); noa.setText(numberOrAddress);
noa.addTextChangedListener(new TextWatcher() { noa.addTextChangedListener(new TextWatcher() {
@Override @Override
@ -559,7 +552,9 @@ public class ContactEditorFragment extends Fragment {
final EditText noa = (EditText) view.findViewById(R.id.numoraddr); final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
numbersAndAddresses.add(nounoa); numbersAndAddresses.add(nounoa);
noa.setHint(isSip ? getString(R.string.sip_address) : getString(R.string.phone_number)); noa.setHint(isSip ? getString(R.string.sip_address) : getString(R.string.phone_number));
noa.setInputType(isSip ? InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS : InputType.TYPE_CLASS_PHONE); if (!isSip) {
noa.setInputType(InputType.TYPE_CLASS_PHONE);
}
noa.requestFocus(); noa.requestFocus();
noa.addTextChangedListener(new TextWatcher() { noa.addTextChangedListener(new TextWatcher() {
@Override @Override

View file

@ -48,6 +48,7 @@ import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SectionIndexer; import android.widget.SectionIndexer;
import android.widget.TextView; import android.widget.TextView;
@ -67,6 +68,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
private String sipAddressToAdd; private String sipAddressToAdd;
private ImageView clearSearchField; private ImageView clearSearchField;
private EditText searchField; private EditText searchField;
private ProgressBar contactsFetchInProgress;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -142,6 +144,8 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
} }
}); });
contactsFetchInProgress = (ProgressBar) view.findViewById(R.id.contactsFetchInProgress);
return view; return view;
} }
@ -339,6 +343,11 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
edit.setEnabled(true); edit.setEnabled(true);
} }
ContactsManager.getInstance().setLinphoneContactsPrefered(onlyDisplayLinphoneContacts); ContactsManager.getInstance().setLinphoneContactsPrefered(onlyDisplayLinphoneContacts);
if (contactsList.getCount() == 0) {
contactsFetchInProgress.setVisibility(View.VISIBLE);
} else {
contactsFetchInProgress.setVisibility(View.GONE);
}
} }
private void changeContactsToggle() { private void changeContactsToggle() {
@ -476,7 +485,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
} }
} }
if(contact.isInLinphoneFriendList()){ if (contact.isInLinphoneFriendList()) {
linphoneFriend.setVisibility(View.VISIBLE); linphoneFriend.setVisibility(View.VISIBLE);
} else { } else {
linphoneFriend.setVisibility(View.GONE); linphoneFriend.setVisibility(View.GONE);
@ -491,6 +500,15 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
icon.setImageResource(R.drawable.avatar); icon.setImageResource(R.drawable.avatar);
} }
TextView organization = (TextView) view.findViewById(R.id.contactOrganization);
String org = contact.getOrganization();
if (org != null && !org.isEmpty()) {
organization.setText(org);
organization.setVisibility(View.VISIBLE);
} else {
organization.setVisibility(View.GONE);
}
if (isEditMode) { if (isEditMode) {
delete.setVisibility(View.VISIBLE); delete.setVisibility(View.VISIBLE);
delete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { delete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

View file

@ -39,6 +39,7 @@ import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.provider.ContactsContract; import android.provider.ContactsContract;
@ -49,14 +50,12 @@ interface ContactsUpdatedListener {
} }
public class ContactsManager extends ContentObserver { public class ContactsManager extends ContentObserver {
private static final int CONTACTS_UPDATED = 543;
private static ContactsManager instance; private static ContactsManager instance;
private List<LinphoneContact> contacts, sipContacts; private List<LinphoneContact> contacts, sipContacts;
private Account mAccount;
private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false; private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false;
private ContentResolver contentResolver; private ContentResolver contentResolver;
private Context context; private Context context;
private ContactsFetchTask contactsFetchTask;
private static ArrayList<ContactsUpdatedListener> contactsUpdatedListeners; private static ArrayList<ContactsUpdatedListener> contactsUpdatedListeners;
public static void addContactsListener(ContactsUpdatedListener listener) { public static void addContactsListener(ContactsUpdatedListener listener) {
@ -67,16 +66,9 @@ public class ContactsManager extends ContentObserver {
} }
private static Handler handler = new Handler() { private static Handler handler = new Handler() {
@SuppressWarnings("unchecked")
@Override @Override
public void handleMessage (Message msg) { public void handleMessage (Message msg) {
if (msg.what == CONTACTS_UPDATED && msg.obj instanceof List<?>) {
List<LinphoneContact> c = (List<LinphoneContact>) msg.obj;
ContactsManager.getInstance().setContacts(c);
for (ContactsUpdatedListener listener : contactsUpdatedListeners) {
listener.onContactsUpdated();
}
}
} }
}; };
@ -87,6 +79,13 @@ public class ContactsManager extends ContentObserver {
sipContacts = new ArrayList<LinphoneContact>(); sipContacts = new ArrayList<LinphoneContact>();
} }
public void destroy() {
if (contactsFetchTask != null && !contactsFetchTask.isCancelled()) {
contactsFetchTask.cancel(true);
}
instance = null;
}
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
onChange(selfChange, null); onChange(selfChange, null);
@ -94,11 +93,7 @@ public class ContactsManager extends ContentObserver {
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public void onChange(boolean selfChange, Uri uri) {
List<LinphoneContact> contacts = fetchContactsAsync(); fetchContactsAsync();
Message msg = handler.obtainMessage();
msg.what = CONTACTS_UPDATED;
msg.obj = contacts;
handler.sendMessage(msg);
} }
public ContentResolver getContentResolver() { public ContentResolver getContentResolver() {
@ -179,17 +174,13 @@ public class ContactsManager extends ContentObserver {
Account[] accounts = accountManager.getAccountsByType(context.getPackageName()); Account[] accounts = accountManager.getAccountsByType(context.getPackageName());
if(accounts != null && accounts.length == 0) { if (accounts != null && accounts.length == 0) {
Account newAccount = new Account(context.getString(R.string.sync_account_name), context.getPackageName()); Account newAccount = new Account(context.getString(R.string.sync_account_name), context.getPackageName());
try { try {
accountManager.addAccountExplicitly(newAccount, null, null); accountManager.addAccountExplicitly(newAccount, null, null);
mAccount = newAccount;
} catch (Exception e) { } catch (Exception e) {
Log.e(e); Log.e(e);
mAccount = null;
} }
} else {
mAccount = accounts[0];
} }
initializeContactManager(context, contentResolver); initializeContactManager(context, contentResolver);
} }
@ -229,11 +220,18 @@ public class ContactsManager extends ContentObserver {
} }
} }
public synchronized void fetchContacts() { public synchronized void fetchContactsAsync() {
setContacts(fetchContactsAsync()); if (contactsFetchTask != null && !contactsFetchTask.isCancelled()) {
contactsFetchTask.cancel(true);
}
contactsFetchTask = new ContactsFetchTask();
contactsFetchTask.execute();
} }
public List<LinphoneContact> fetchContactsAsync() {
private class ContactsFetchTask extends AsyncTask<Void, List<LinphoneContact>, List<LinphoneContact>> {
@SuppressWarnings("unchecked")
protected List<LinphoneContact> doInBackground(Void... params) {
List<LinphoneContact> contacts = new ArrayList<LinphoneContact>(); List<LinphoneContact> contacts = new ArrayList<LinphoneContact>();
if (hasContactsAccess()) { if (hasContactsAccess()) {
@ -255,17 +253,25 @@ public class ContactsManager extends ContentObserver {
boolean found = false; boolean found = false;
for (LinphoneContact contact : contacts) { for (LinphoneContact contact : contacts) {
if (refkey.equals(contact.getAndroidId())) { if (refkey.equals(contact.getAndroidId())) {
// Native matching contact found, link the friend to it
contact.setFriend(friend); contact.setFriend(friend);
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
if (hasContactAccess) {
// If refkey != null and hasContactAccess but there isn't a native contact with this value, then this contact has been deleted. Let's do the same with the LinphoneFriend
LinphoneManager.getLc().removeFriend(friend);
} else {
// Refkey not null but no contact access => can't link it to native contact so display it on is own
LinphoneContact contact = new LinphoneContact(); LinphoneContact contact = new LinphoneContact();
contact.setFriend(friend); contact.setFriend(friend);
contacts.add(contact); contacts.add(contact);
} }
}
} else { } else {
// No refkey so it's a standalone contact
LinphoneContact contact = new LinphoneContact(); LinphoneContact contact = new LinphoneContact();
contact.setFriend(friend); contact.setFriend(friend);
contacts.add(contact); contacts.add(contact);
@ -273,16 +279,40 @@ public class ContactsManager extends ContentObserver {
} }
for (LinphoneContact contact : contacts) { for (LinphoneContact contact : contacts) {
contact.refresh(); // This will only get name & picture informations to be able to quickly display contacts list
contact.minimalRefresh();
} }
Collections.sort(contacts); Collections.sort(contacts);
// Public the current list of contacts without all the informations populated
publishProgress(contacts);
for (LinphoneContact contact : contacts) {
// This time fetch all informations including phone numbers and SIP addresses
contact.refresh();
}
return contacts; return contacts;
} }
protected void onProgressUpdate(List<LinphoneContact>... result) {
setContacts(result[0]);
for (ContactsUpdatedListener listener : contactsUpdatedListeners) {
listener.onContactsUpdated();
}
}
protected void onPostExecute(List<LinphoneContact> result) {
setContacts(result);
for (ContactsUpdatedListener listener : contactsUpdatedListeners) {
listener.onContactsUpdated();
}
}
}
public static String getAddressOrNumberForAndroidContact(ContentResolver resolver, Uri contactUri) { public static String getAddressOrNumberForAndroidContact(ContentResolver resolver, Uri contactUri) {
// Phone Numbers // Phone Numbers
String[] projection = new String[]{ ContactsContract.CommonDataKinds.Phone.NUMBER }; String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
Cursor c = resolver.query(contactUri, projection, null, null, null); Cursor c = resolver.query(contactUri, projection, null, null, null);
if (c != null) { if (c != null) {
while (c.moveToNext()) { while (c.moveToNext()) {

View file

@ -36,11 +36,12 @@ import android.widget.TextView;
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
public class HistoryDetailFragment extends Fragment implements OnClickListener { public class HistoryDetailFragment extends Fragment implements OnClickListener {
private ImageView dialBack, chat, addToContacts, back; private ImageView dialBack, chat, addToContacts, goToContact, back;
private View view; private View view;
private ImageView contactPicture, callDirection; private ImageView contactPicture, callDirection;
private TextView contactName, contactAddress, time, date; private TextView contactName, contactAddress, time, date;
private String sipUri, displayName, pictureUri; private String sipUri, displayName, pictureUri;
private LinphoneContact contact;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -72,6 +73,9 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
addToContacts = (ImageView) view.findViewById(R.id.add_contact); addToContacts = (ImageView) view.findViewById(R.id.add_contact);
addToContacts.setOnClickListener(this); addToContacts.setOnClickListener(this);
goToContact = (ImageView) view.findViewById(R.id.goto_contact);
goToContact.setOnClickListener(this);
contactPicture = (ImageView) view.findViewById(R.id.contact_picture); contactPicture = (ImageView) view.findViewById(R.id.contact_picture);
contactName = (TextView) view.findViewById(R.id.contact_name); contactName = (TextView) view.findViewById(R.id.contact_name);
@ -107,17 +111,19 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
Log.e(e); Log.e(e);
} }
if(lAddress != null) { if (lAddress != null) {
contactAddress.setText(lAddress.asStringUriOnly()); contactAddress.setText(lAddress.asStringUriOnly());
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(lAddress); contact = ContactsManager.getInstance().findContactFromAddress(lAddress);
if (contact != null) { if (contact != null) {
contactName.setText(contact.getFullName()); contactName.setText(contact.getFullName());
LinphoneUtils.setImagePictureFromUri(view.getContext(),contactPicture,contact.getPhotoUri(),contact.getThumbnailUri()); LinphoneUtils.setImagePictureFromUri(view.getContext(),contactPicture,contact.getPhotoUri(),contact.getThumbnailUri());
addToContacts.setVisibility(View.INVISIBLE); addToContacts.setVisibility(View.GONE);
goToContact.setVisibility(View.VISIBLE);
} else { } else {
contactName.setText(displayName == null ? LinphoneUtils.getAddressDisplayName(sipUri) : displayName); contactName.setText(displayName == null ? LinphoneUtils.getAddressDisplayName(sipUri) : displayName);
contactPicture.setImageResource(R.drawable.avatar); contactPicture.setImageResource(R.drawable.avatar);
addToContacts.setVisibility(View.VISIBLE); addToContacts.setVisibility(View.VISIBLE);
goToContact.setVisibility(View.GONE);
} }
} else { } else {
contactAddress.setText(sipUri); contactAddress.setText(sipUri);
@ -165,6 +171,8 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
Log.e(e); Log.e(e);
} }
LinphoneActivity.instance().displayContactsForEdition(uri); LinphoneActivity.instance().displayContactsForEdition(uri);
} else if (id == R.id.goto_contact) {
LinphoneActivity.instance().displayContact(contact, false);
} }
} }
} }

View file

@ -52,7 +52,7 @@ import android.widget.TextView;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
public class HistoryListFragment extends Fragment implements OnClickListener, OnItemClickListener { public class HistoryListFragment extends Fragment implements OnClickListener, OnItemClickListener, ContactsUpdatedListener {
private ListView historyList; private ListView historyList;
private LayoutInflater mInflater; private LayoutInflater mInflater;
private TextView noCallHistory, noMissedCallHistory; private TextView noCallHistory, noMissedCallHistory;
@ -198,6 +198,7 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
ContactsManager.addContactsListener(this);
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated()) {
LinphoneActivity.instance().selectMenu(FragmentsAvailable.HISTORY_LIST); LinphoneActivity.instance().selectMenu(FragmentsAvailable.HISTORY_LIST);
@ -212,6 +213,17 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
} }
} }
@Override
public void onPause() {
ContactsManager.removeContactsListener(this);
super.onPause();
}
@Override
public void onContactsUpdated() {
historyList.setAdapter(new CallHistoryAdapter(getActivity().getApplicationContext()));
}
@Override @Override
public void onClick(View v) { public void onClick(View v) {
int id = v.getId(); int id = v.getId();
@ -327,18 +339,20 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
topBar.setVisibility(View.VISIBLE); topBar.setVisibility(View.VISIBLE);
refresh(); refresh();
if (!hideHistoryListAndDisplayMessageIfEmpty()){ if (!hideHistoryListAndDisplayMessageIfEmpty()) {
historyList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); historyList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
historyList.setAdapter(new CallHistoryAdapter(getActivity().getApplicationContext())); historyList.setAdapter(new CallHistoryAdapter(getActivity().getApplicationContext()));
} }
if(getResources().getBoolean(R.bool.isTablet)){ if (getResources().getBoolean(R.bool.isTablet)) {
displayFirstLog(); displayFirstLog();
} }
} }
class CallHistoryAdapter extends BaseAdapter { class CallHistoryAdapter extends BaseAdapter {
CallHistoryAdapter(Context aContext) { CallHistoryAdapter(Context aContext) {
} }
public int getCount() { public int getCount() {
return mLogs.size(); return mLogs.size();
} }

View file

@ -70,6 +70,7 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -81,7 +82,6 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
@ -104,6 +104,8 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private static final int PERMISSIONS_REQUEST_OVERLAY = 206; private static final int PERMISSIONS_REQUEST_OVERLAY = 206;
private static final int PERMISSIONS_REQUEST_SYNC = 207; private static final int PERMISSIONS_REQUEST_SYNC = 207;
private static final int PERMISSIONS_REQUEST_CONTACTS = 208; private static final int PERMISSIONS_REQUEST_CONTACTS = 208;
private static final int PERMISSIONS_RECORD_AUDIO_ECHO_CANCELLER = 209;
private static final int PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE = 210;
private static LinphoneActivity instance; private static LinphoneActivity instance;
@ -113,11 +115,12 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private View contacts_selected, history_selected, dialer_selected, chat_selected; private View contacts_selected, history_selected, dialer_selected, chat_selected;
private RelativeLayout mTopBar; private RelativeLayout mTopBar;
private ImageView cancel; private ImageView cancel;
private FragmentsAvailable pendingFragmentTransaction, currentFragment, nextFragment; private FragmentsAvailable pendingFragmentTransaction, currentFragment;
private Fragment fragment;
private List<FragmentsAvailable> fragmentsHistory; private List<FragmentsAvailable> fragmentsHistory;
private Fragment.SavedState dialerSavedState; private Fragment.SavedState dialerSavedState;
private boolean newProxyConfig; private boolean newProxyConfig;
private boolean isAnimationDisabled = true, emptyFragment = false; private boolean emptyFragment = false;
private OrientationEventListener mOrientationHelper; private OrientationEventListener mOrientationHelper;
private LinphoneCoreListenerBase mListener; private LinphoneCoreListenerBase mListener;
private LinearLayout mTabBar; private LinearLayout mTabBar;
@ -194,9 +197,11 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
initButtons(); initButtons();
initSideMenu(); initSideMenu();
currentFragment = nextFragment = FragmentsAvailable.EMPTY; currentFragment = FragmentsAvailable.EMPTY;
if (savedInstanceState == null) { if (savedInstanceState == null) {
changeCurrentFragment(FragmentsAvailable.DIALER, getIntent().getExtras()); changeCurrentFragment(FragmentsAvailable.DIALER, getIntent().getExtras());
} else {
currentFragment = (FragmentsAvailable) savedInstanceState.getSerializable("currentFragment");
} }
mListener = new LinphoneCoreListenerBase(){ mListener = new LinphoneCoreListenerBase(){
@ -273,8 +278,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
LinphoneManager.getLc().setDeviceRotation(rotation); LinphoneManager.getLc().setDeviceRotation(rotation);
mAlwaysChangingPhoneAngle = rotation; mAlwaysChangingPhoneAngle = rotation;
updateAnimationsState();
} }
private void initButtons() { private void initButtons() {
@ -337,7 +340,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT) { if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT) {
return; return;
} }
nextFragment = newFragmentType;
if (currentFragment == FragmentsAvailable.DIALER) { if (currentFragment == FragmentsAvailable.DIALER) {
try { try {
@ -347,81 +349,76 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
} }
} }
Fragment newFragment = null; fragment = null;
switch (newFragmentType) { switch (newFragmentType) {
case HISTORY_LIST: case HISTORY_LIST:
newFragment = new HistoryListFragment(); fragment = new HistoryListFragment();
if (isTablet()) {
((HistoryListFragment) newFragment).displayFirstLog();
}
break; break;
case HISTORY_DETAIL: case HISTORY_DETAIL:
newFragment = new HistoryDetailFragment(); fragment = new HistoryDetailFragment();
break; break;
case CONTACTS_LIST: case CONTACTS_LIST:
checkAndRequestReadContactsPermission(); checkAndRequestReadContactsPermission();
newFragment = new ContactsListFragment(); fragment = new ContactsListFragment();
if (isTablet()) {
((ContactsListFragment) newFragment).displayFirstContact();
}
break; break;
case CONTACT_DETAIL: case CONTACT_DETAIL:
newFragment = new ContactDetailsFragment(); fragment = new ContactDetailsFragment();
break; break;
case CONTACT_EDITOR: case CONTACT_EDITOR:
newFragment = new ContactEditorFragment(); fragment = new ContactEditorFragment();
break; break;
case DIALER: case DIALER:
newFragment = new DialerFragment(); fragment = new DialerFragment();
if (extras == null) { if (extras == null) {
newFragment.setInitialSavedState(dialerSavedState); fragment.setInitialSavedState(dialerSavedState);
} }
break; break;
case SETTINGS: case SETTINGS:
newFragment = new SettingsFragment(); fragment = new SettingsFragment();
break; break;
case ACCOUNT_SETTINGS: case ACCOUNT_SETTINGS:
newFragment = new AccountPreferencesFragment(); fragment = new AccountPreferencesFragment();
break; break;
case ABOUT: case ABOUT:
newFragment = new AboutFragment(); fragment = new AboutFragment();
break; break;
case EMPTY: case EMPTY:
newFragment = new EmptyFragment(); fragment = new EmptyFragment();
break; break;
case CHAT_LIST: case CHAT_LIST:
newFragment = new ChatListFragment(); fragment = new ChatListFragment();
if (isTablet()) {
((ChatListFragment) newFragment).displayFirstChat();
}
break; break;
case CHAT: case CHAT:
newFragment = new ChatFragment(); fragment = new ChatFragment();
break; break;
default: default:
break; break;
} }
if (newFragment != null) { if (fragment != null) {
newFragment.setArguments(extras); fragment.setArguments(extras);
if (isTablet()) { if (isTablet()) {
changeFragmentForTablets(newFragment, newFragmentType, withoutAnimation); changeFragmentForTablets(fragment, newFragmentType, withoutAnimation);
switch (newFragmentType) {
case HISTORY_LIST:
((HistoryListFragment) fragment).displayFirstLog();
break;
case CONTACTS_LIST:
((ContactsListFragment) fragment).displayFirstContact();
break;
case CHAT_LIST:
((ChatListFragment) fragment).displayFirstChat();
break;
}
} else { } else {
changeFragment(newFragment, newFragmentType, withoutAnimation); changeFragment(fragment, newFragmentType, withoutAnimation);
} }
} }
} }
private void updateAnimationsState() {
isAnimationDisabled = getResources().getBoolean(R.bool.disable_animations) || !LinphonePreferences.instance().areAnimationsEnabled();
}
public boolean isAnimationDisabled() {
return isAnimationDisabled;
}
private void changeFragment(Fragment newFragment, FragmentsAvailable newFragmentType, boolean withoutAnimation) { private void changeFragment(Fragment newFragment, FragmentsAvailable newFragmentType, boolean withoutAnimation) {
FragmentManager fm = getFragmentManager(); FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction(); FragmentTransaction transaction = fm.beginTransaction();
@ -784,12 +781,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
changeCurrentFragment(FragmentsAvailable.SETTINGS, null); changeCurrentFragment(FragmentsAvailable.SETTINGS, null);
} }
public void applyConfigChangesIfNeeded() {
if (nextFragment != FragmentsAvailable.SETTINGS && nextFragment != FragmentsAvailable.ACCOUNT_SETTINGS) {
updateAnimationsState();
}
}
public void displayDialer() { public void displayDialer() {
changeCurrentFragment(FragmentsAvailable.DIALER, null); changeCurrentFragment(FragmentsAvailable.DIALER, null);
} }
@ -856,9 +847,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (missedCallsCount > 0) { if (missedCallsCount > 0) {
missedCalls.setText(missedCallsCount + ""); missedCalls.setText(missedCallsCount + "");
missedCalls.setVisibility(View.VISIBLE); missedCalls.setVisibility(View.VISIBLE);
if (!isAnimationDisabled) {
missedCalls.startAnimation(AnimationUtils.loadAnimation(LinphoneActivity.this, R.anim.bounce));
}
} else { } else {
LinphoneManager.getLc().resetMissedCallsCount(); LinphoneManager.getLc().resetMissedCallsCount();
missedCalls.clearAnimation(); missedCalls.clearAnimation();
@ -870,12 +858,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (missedChatCount > 0) { if (missedChatCount > 0) {
missedChats.setText(missedChatCount + ""); missedChats.setText(missedChatCount + "");
missedChats.setVisibility(View.VISIBLE); missedChats.setVisibility(View.VISIBLE);
if (!isAnimationDisabled) {
missedChats.startAnimation(AnimationUtils.loadAnimation(LinphoneActivity.this, R.anim.bounce));
}
if(missedChatCount > 99){
//TODO
}
} else { } else {
missedChats.clearAnimation(); missedChats.clearAnimation();
missedChats.setVisibility(View.GONE); missedChats.setVisibility(View.GONE);
@ -899,7 +881,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
public Dialog displayDialog(String text){ public Dialog displayDialog(String text){
Dialog dialog = new Dialog(this); Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
dialog.setContentView(R.layout.dialog); dialog.setContentView(R.layout.dialog);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
@ -913,7 +895,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
public Dialog displayWrongPasswordDialog(final String username, final String realm, final String domain){ public Dialog displayWrongPasswordDialog(final String username, final String realm, final String domain){
final Dialog dialog = new Dialog(this); final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
dialog.setContentView(R.layout.input_dialog); dialog.setContentView(R.layout.input_dialog);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
@ -1134,6 +1116,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
super.onPause(); super.onPause();
} }
@SuppressWarnings("deprecation")
public static boolean isApplicationBroughtToBackground(final Activity activity) { public static boolean isApplicationBroughtToBackground(final Activity activity) {
ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1); List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
@ -1186,6 +1169,14 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0); checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0);
} }
public void checkAndRequestRecordAudioPermissionForEchoCanceller() {
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_RECORD_AUDIO_ECHO_CANCELLER);
}
public void checkAndRequestReadExternalStoragePermissionForDeviceRingtone() {
checkAndRequestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE);
}
public void checkAndRequestPermissionsToSendImage() { public void checkAndRequestPermissionsToSendImage() {
ArrayList<String> permissionsList = new ArrayList<String>(); ArrayList<String> permissionsList = new ArrayList<String>();
@ -1246,9 +1237,19 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
case PERMISSIONS_REQUEST_CONTACTS: case PERMISSIONS_REQUEST_CONTACTS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
ContactsManager.getInstance().enableContactsAccess(); ContactsManager.getInstance().enableContactsAccess();
ContactsManager.getInstance().fetchContacts();
fetchedContactsOnce = true;
} }
ContactsManager.getInstance().fetchContactsAsync();
fetchedContactsOnce = true;
break;
case PERMISSIONS_RECORD_AUDIO_ECHO_CANCELLER:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
((SettingsFragment) fragment).startEchoCancellerCalibration();
} else {
((SettingsFragment) fragment).echoCalibrationFail();
}
break;
case PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE:
((SettingsFragment) fragment).enableDeviceRingtone(grantResults[0] == PackageManager.PERMISSION_GRANTED);
break; break;
} }
} }
@ -1262,13 +1263,19 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (contacts == PackageManager.PERMISSION_GRANTED && !fetchedContactsOnce) { if (contacts == PackageManager.PERMISSION_GRANTED && !fetchedContactsOnce) {
ContactsManager.getInstance().enableContactsAccess(); ContactsManager.getInstance().enableContactsAccess();
ContactsManager.getInstance().fetchContacts(); ContactsManager.getInstance().fetchContactsAsync();
fetchedContactsOnce = true; fetchedContactsOnce = true;
} else { } else {
checkAndRequestReadContactsPermission(); checkAndRequestReadContactsPermission();
} }
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putSerializable("currentFragment", currentFragment);
super.onSaveInstanceState(outState);
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@ -1282,6 +1289,13 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
lc.addListener(mListener); lc.addListener(mListener);
} }
if (isTablet()) {
LinearLayout ll = (LinearLayout) findViewById(R.id.fragmentContainer2);
if (currentFragment == FragmentsAvailable.DIALER) {
ll.setVisibility(View.GONE);
}
}
refreshAccounts(); refreshAccounts();
updateMissedChatCount(); updateMissedChatCount();
@ -1400,12 +1414,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
} else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) { } else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) {
return true; return true;
} }
} else {
if (isTablet()) {
if (currentFragment == FragmentsAvailable.SETTINGS) {
updateAnimationsState();
}
}
} }
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);

View file

@ -20,6 +20,7 @@ package org.linphone;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -48,7 +49,7 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
private static final long serialVersionUID = 9015568163905205244L; private static final long serialVersionUID = 9015568163905205244L;
private transient LinphoneFriend friend; private transient LinphoneFriend friend;
private String fullName, firstName, lastName, androidId, androidRawId, androidTagId; private String fullName, firstName, lastName, androidId, androidRawId, androidTagId, organization;
private transient Uri photoUri, thumbnailUri; private transient Uri photoUri, thumbnailUri;
private List<LinphoneNumberOrAddress> addresses; private List<LinphoneNumberOrAddress> addresses;
private transient ArrayList<ContentProviderOperation> changesToCommit; private transient ArrayList<ContentProviderOperation> changesToCommit;
@ -65,6 +66,15 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
hasSipAddress = false; hasSipAddress = false;
} }
@Override
public int compareTo(LinphoneContact contact) {
String fullName = getFullName();
String contactFullName = contact.getFullName();
String firstLetter = fullName == null || fullName.isEmpty() ? "" : fullName.substring(0, 1).toUpperCase(Locale.getDefault());
String contactfirstLetter = contactFullName == null || contactFullName.isEmpty() ? "" : contactFullName.substring(0, 1).toUpperCase(Locale.getDefault());
return firstLetter.compareTo(contactfirstLetter);
}
public void setFullName(String name) { public void setFullName(String name) {
fullName = name; fullName = name;
} }
@ -117,6 +127,41 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return lastName; return lastName;
} }
public String getOrganization() {
return organization;
}
public void setOrganization(String org) {
if (isAndroidContact()) {
if (androidRawId != null) {
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE + "'";
String[] args = new String[]{ getAndroidId() };
if (organization != null) {
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build());
} else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build());
}
} else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build());
}
}
organization = org;
}
public boolean hasPhoto() { public boolean hasPhoto() {
return photoUri != null; return photoUri != null;
} }
@ -351,6 +396,72 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return androidId; return androidId;
} }
private void createOrUpdateFriend() {
if (!isLinphoneFriend()) {
friend = LinphoneCoreFactory.instance().createLinphoneFriend();
friend.enableSubscribes(false);
friend.setIncSubscribePolicy(SubscribePolicy.SPDeny);
if (isAndroidContact()) {
friend.setRefKey(getAndroidId());
}
}
if (isLinphoneFriend()) {
updateFriend();
}
}
private void updateFriend() {
if (!isLinphoneFriend()) return;
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return;
friend.edit();
friend.setFamilyName(lastName);
friend.setGivenName(firstName);
for (LinphoneAddress address : friend.getAddresses()) {
friend.removeAddress(address);
}
for (String phone : friend.getPhoneNumbers()) {
friend.removePhoneNumber(phone);
}
if (organization != null && !organization.isEmpty()) {
friend.setOrganization(organization);
}
for (LinphoneNumberOrAddress noa : addresses) {
if (noa.isSIPAddress()) {
try {
LinphoneAddress addr = lc.interpretUrl(noa.getValue());
if (addr != null) {
friend.addAddress(addr);
}
} catch (LinphoneCoreException e) {
Log.e(e);
}
} else {
friend.addPhoneNumber(noa.getValue());
}
}
friend.setName(fullName);
friend.done();
if (friend.getAddress() != null) {
if (lc.findFriendByAddress(friend.getAddress().asString()) == null) {
try {
lc.addFriend(friend);
if (!ContactsManager.getInstance().hasContactsAccess()) {
// This refresh is only needed if app has no contacts permission to refresh the list of LinphoneFriends.
// Otherwise contacts will be refreshed due to changes in native contact and the handler in ContactsManager
ContactsManager.getInstance().fetchContactsAsync();
}
} catch (LinphoneCoreException e) {
Log.e(e);
}
}
}
}
public void save() { public void save() {
if (isAndroidContact() && ContactsManager.getInstance().hasContactsAccess() && changesToCommit.size() > 0) { if (isAndroidContact() && ContactsManager.getInstance().hasContactsAccess() && changesToCommit.size() > 0) {
try { try {
@ -364,49 +475,7 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
} }
if (isLinphoneFriend()) { createOrUpdateFriend();
boolean hasAddr = false;
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return;
friend.edit();
for (LinphoneAddress address : friend.getAddresses()) {
friend.removeAddress(address);
}
for (String phone : friend.getPhoneNumbers()) {
friend.removePhoneNumber(phone);
}
for (LinphoneNumberOrAddress noa : addresses) {
if (noa.isSIPAddress()) {
try {
LinphoneAddress addr = lc.interpretUrl(noa.getValue());
if (addr != null) {
friend.addAddress(addr);
hasAddr = true;
}
} catch (LinphoneCoreException e) {
Log.e(e);
}
} else {
friend.addPhoneNumber(noa.getValue());
}
}
if (hasAddr) {
friend.setName(fullName);
}
friend.done();
if (friend.getAddress() != null) {
if (lc.findFriendByAddress(friend.getAddress().asString()) == null) {
try {
lc.addFriend(friend);
ContactsManager.getInstance().fetchContacts();
} catch (LinphoneCoreException e) {
Log.e(e);
}
}
}
}
} }
public void delete() { public void delete() {
@ -427,14 +496,38 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
} }
public void minimalRefresh() {
hasSipAddress = false;
if (isAndroidContact()) {
getContactNames();
setThumbnailUri(getContactThumbnailPictureUri());
setPhotoUri(getContactPictureUri());
getNativeContactOrganization();
if (isLinphoneFriend()) {
hasSipAddress = friend.getAddress() != null;
}
} else if (isLinphoneFriend()) {
fullName = friend.getName();
lastName = friend.getFamilyName();
firstName = friend.getGivenName();
thumbnailUri = null;
photoUri = null;
hasSipAddress = friend.getAddress() != null;
organization = friend.getOrganization();
}
}
public void refresh() { public void refresh() {
addresses = new ArrayList<LinphoneNumberOrAddress>(); addresses = new ArrayList<LinphoneNumberOrAddress>();
hasSipAddress = false; hasSipAddress = false;
if (isAndroidContact()) { if (isAndroidContact()) {
getContactNames(); getContactNames();
setThumbnailUri(getContactPictureUri()); setThumbnailUri(getContactThumbnailPictureUri());
setPhotoUri(getContactPhotoUri()); setPhotoUri(getContactPictureUri());
androidRawId = findRawContactID(); androidRawId = findRawContactID();
if (LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) { if (LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
@ -445,46 +538,29 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
addNumberOrAddress(noa); addNumberOrAddress(noa);
} }
if (friend == null) { createOrUpdateFriend();
friend = LinphoneCoreFactory.instance().createLinphoneFriend();
friend.setRefKey(getAndroidId());
// Disable subscribes for now
friend.enableSubscribes(false);
friend.setIncSubscribePolicy(SubscribePolicy.SPDeny);
if (hasSipAddress) {
for (LinphoneNumberOrAddress noa : addresses) {
if (noa.isSIPAddress()) {
try {
LinphoneAddress addr = LinphoneManager.getLc().interpretUrl(noa.getValue());
if (addr != null) {
friend.addAddress(addr);
}
} catch (LinphoneCoreException e) {
Log.e(e);
}
} else {
friend.addPhoneNumber(noa.getValue());
}
}
}
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null && friend.getAddress() != null) {
friend.setName(fullName);
try {
lc.addFriend(friend);
} catch (LinphoneCoreException e) {
Log.e(e);
}
}
}
} else if (isLinphoneFriend()) { } else if (isLinphoneFriend()) {
fullName = friend.getName(); fullName = friend.getName();
lastName = friend.getFamilyName();
firstName = friend.getGivenName();
thumbnailUri = null; thumbnailUri = null;
photoUri = null; photoUri = null;
LinphoneAddress addr = friend.getAddress();
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null && lc.isVCardSupported()) {
for (LinphoneAddress addr : friend.getAddresses()) {
if (addr != null) { if (addr != null) {
addresses.add(new LinphoneNumberOrAddress(addr.asStringUriOnly(), true)); addNumberOrAddress(new LinphoneNumberOrAddress(addr.asStringUriOnly(), true));
hasSipAddress = true; }
}
for (String tel : friend.getPhoneNumbers()) {
if (tel != null) {
addNumberOrAddress(new LinphoneNumberOrAddress(tel, false));
}
}
} else {
LinphoneAddress addr = friend.getAddress();
addNumberOrAddress(new LinphoneNumberOrAddress(addr.asStringUriOnly(), true));
} }
} }
} }
@ -512,21 +588,12 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return createLinphoneFriend(); return createLinphoneFriend();
} }
@Override private Uri getContactThumbnailPictureUri() {
public int compareTo(LinphoneContact contact) {
String fullName = getFullName();
String contactFullName = contact.getFullName();
String firstLetter = fullName == null || fullName.isEmpty() ? "" : fullName.substring(0, 1).toUpperCase(Locale.getDefault());
String contactfirstLetter = contactFullName == null || contactFullName.isEmpty() ? "" : contactFullName.substring(0, 1).toUpperCase(Locale.getDefault());
return firstLetter.compareTo(contactfirstLetter);
}
private Uri getContactPictureUri() {
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getAndroidId())); Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getAndroidId()));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
} }
private Uri getContactPhotoUri() { private Uri getContactPictureUri() {
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getAndroidId())); Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(getAndroidId()));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.DISPLAY_PHOTO); return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
} }
@ -547,6 +614,20 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
} }
private void getNativeContactOrganization() {
ContentResolver resolver = ContactsManager.getInstance().getContentResolver();
String[] proj = new String[]{ ContactsContract.CommonDataKinds.Organization.COMPANY };
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?";
String[] args = new String[]{ getAndroidId(), ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE };
Cursor c = resolver.query(ContactsContract.Data.CONTENT_URI, proj, select, args, null);
if (c != null) {
if (c.moveToFirst()) {
organization = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY));
}
c.close();
}
}
private String findRawContactID() { private String findRawContactID() {
ContentResolver resolver = ContactsManager.getInstance().getContentResolver(); ContentResolver resolver = ContactsManager.getInstance().getContentResolver();
String result = null; String result = null;
@ -596,7 +677,7 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
c.close(); c.close();
} }
Collections.sort(result);
return result; return result;
} }

View file

@ -25,16 +25,13 @@ import static android.media.AudioManager.STREAM_VOICE_CALL;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -87,15 +84,12 @@ import android.app.AlertDialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.SensorEvent; import android.hardware.SensorEvent;
import android.hardware.SensorEventListener; import android.hardware.SensorEventListener;
@ -106,7 +100,6 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Environment;
import android.os.Handler; import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.PowerManager.WakeLock; import android.os.PowerManager.WakeLock;
@ -180,7 +173,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mLinphoneFactoryConfigFile = basePath + "/linphonerc"; mLinphoneFactoryConfigFile = basePath + "/linphonerc";
mLinphoneConfigFile = basePath + "/.linphonerc"; mLinphoneConfigFile = basePath + "/.linphonerc";
mLinphoneRootCaFile = basePath + "/rootca.pem"; mLinphoneRootCaFile = basePath + "/rootca.pem";
mRingSoundFile = basePath + "/oldphone_mono.wav"; mRingSoundFile = basePath + "/ringtone.mkv";
mRingbackSoundFile = basePath + "/ringback.wav"; mRingbackSoundFile = basePath + "/ringback.wav";
mPauseSoundFile = basePath + "/hold.mkv"; mPauseSoundFile = basePath + "/hold.mkv";
mChatDatabaseFile = basePath + "/linphone-history.db"; mChatDatabaseFile = basePath + "/linphone-history.db";
@ -290,7 +283,8 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
routeAudioToSpeakerHelper(true); routeAudioToSpeakerHelper(true);
} }
public String getUserAgent() throws NameNotFoundException { public String getUserAgent() {
try {
StringBuilder userAgent = new StringBuilder(); StringBuilder userAgent = new StringBuilder();
userAgent.append("LinphoneAndroid/" + mServiceContext.getPackageManager().getPackageInfo(mServiceContext.getPackageName(),0).versionCode); userAgent.append("LinphoneAndroid/" + mServiceContext.getPackageManager().getPackageInfo(mServiceContext.getPackageName(),0).versionCode);
userAgent.append(" ("); userAgent.append(" (");
@ -298,6 +292,10 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
userAgent.append(Build.DEVICE + " " + Build.MODEL + " Android/" + Build.VERSION.SDK_INT); userAgent.append(Build.DEVICE + " " + Build.MODEL + " Android/" + Build.VERSION.SDK_INT);
userAgent.append(")"); userAgent.append(")");
return userAgent.toString(); return userAgent.toString();
} catch (NameNotFoundException nnfe) {
Log.e(nnfe);
}
return null;
} }
public void routeAudioToReceiver() { public void routeAudioToReceiver() {
@ -359,40 +357,6 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
this.mUploadingImageStream = array; this.mUploadingImageStream = array;
} }
private void storeImage(LinphoneChatMessage msg) {
if (msg == null || msg.getFileTransferInformation() == null || msg.getAppData() == null) return;
File file = new File(Environment.getExternalStorageDirectory(), msg.getAppData());
Bitmap bm = BitmapFactory.decodeFile(file.getPath());
if (bm == null) return;
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, file.getName());
String extension = msg.getFileTransferInformation().getSubtype();
values.put(Images.Media.MIME_TYPE, "image/" + extension);
ContentResolver cr = getContext().getContentResolver();
Uri path = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream stream;
try {
stream = cr.openOutputStream(path);
if (extension != null && extension.toLowerCase(Locale.getDefault()).equals("png")) {
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
} else {
bm.compress(Bitmap.CompressFormat.JPEG, 100, stream);
}
stream.close();
file.delete();
bm.recycle();
msg.setAppData(path.toString());
} catch (FileNotFoundException e) {
Log.e(e);
} catch (IOException e) {
Log.e(e);
}
}
@Override @Override
public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, LinphoneChatMessage.State state) { public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, LinphoneChatMessage.State state) {
if (state == LinphoneChatMessage.State.FileTransferDone) { if (state == LinphoneChatMessage.State.FileTransferDone) {
@ -400,7 +364,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mUploadPendingFileMessage = null; mUploadPendingFileMessage = null;
mUploadingImageStream = null; mUploadingImageStream = null;
} else { } else {
storeImage(msg); LinphoneUtils.storeImage(getContext(), msg);
removePendingMessage(msg); removePendingMessage(msg);
} }
} }
@ -761,12 +725,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
Log.e(e, "cannot get version name"); Log.e(e, "cannot get version name");
} }
mLc.setRing(mRingSoundFile);
if (mR.getBoolean(R.bool.use_linphonecore_ringing)) {
disableRinging();
} else {
mLc.setRing(null); //We'll use the android media player api to play the ringtone
}
mLc.setRingback(mRingbackSoundFile); mLc.setRingback(mRingbackSoundFile);
mLc.setRootCA(mLinphoneRootCaFile); mLc.setRootCA(mLinphoneRootCaFile);
mLc.setPlayFile(mPauseSoundFile); mLc.setPlayFile(mPauseSoundFile);
@ -776,6 +735,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mLc.setUserCertificatesPath(mUserCertificatePath); mLc.setUserCertificatesPath(mUserCertificatePath);
subscribeFriendList(mPrefs.isFriendlistsubscriptionEnabled()); subscribeFriendList(mPrefs.isFriendlistsubscriptionEnabled());
//mLc.setCallErrorTone(Reason.NotFound, mErrorToneFile); //mLc.setCallErrorTone(Reason.NotFound, mErrorToneFile);
enableDeviceRingtone(mPrefs.isDeviceRingtoneEnabled());
int availableCores = Runtime.getRuntime().availableProcessors(); int availableCores = Runtime.getRuntime().availableProcessors();
Log.w("MediaStreamer : " + availableCores + " cores detected and configured"); Log.w("MediaStreamer : " + availableCores + " cores detected and configured");
@ -804,7 +764,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} }
private void copyAssetsFromPackage() throws IOException { private void copyAssetsFromPackage() throws IOException {
copyIfNotExist(R.raw.oldphone_mono, mRingSoundFile); copyIfNotExist(R.raw.notes_of_the_optimistic, mRingSoundFile);
copyIfNotExist(R.raw.ringback, mRingbackSoundFile); copyIfNotExist(R.raw.ringback, mRingbackSoundFile);
copyIfNotExist(R.raw.hold, mPauseSoundFile); copyIfNotExist(R.raw.hold, mPauseSoundFile);
copyIfNotExist(R.raw.incoming_chat, mErrorToneFile); copyIfNotExist(R.raw.incoming_chat, mErrorToneFile);
@ -917,6 +877,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
public static synchronized void destroy() { public static synchronized void destroy() {
if (instance == null) return; if (instance == null) return;
ContactsManager.getInstance().destroy();
getInstance().changeStatusToOffline(); getInstance().changeStatusToOffline();
sExited = true; sExited = true;
instance.doDestroy(); instance.doDestroy();
@ -1070,7 +1031,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} }
} }
if (state == State.IncomingReceived && mR.getBoolean(R.bool.auto_answer_calls)) { if (state == State.IncomingReceived && LinphonePreferences.instance().isAutoAnswerEnabled()) {
try { try {
mLc.acceptCall(call); mLc.acceptCall(call);
} catch (LinphoneCoreException e) { } catch (LinphoneCoreException e) {
@ -1184,20 +1145,16 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
public void startEcCalibration(LinphoneCoreListener l) throws LinphoneCoreException { public void startEcCalibration(LinphoneCoreListener l) throws LinphoneCoreException {
routeAudioToSpeaker(); routeAudioToSpeaker();
Compatibility.setAudioManagerInCallMode((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE));
Log.i("Set audio mode on 'Voice Communication'");
int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL); int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL);
int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL); int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0); mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0);
mLc.startEchoCalibration(l); mLc.startEchoCalibration(l);
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, oldVolume, 0); mAudioManager.setStreamVolume(STREAM_VOICE_CALL, oldVolume, 0);
} }
private boolean isRinging; private boolean isRinging;
private boolean disableRinging = false;
public void disableRinging() {
disableRinging = true;
}
private void requestAudioFocus(){ private void requestAudioFocus(){
if (!mAudioFocused){ if (!mAudioFocused){
@ -1207,11 +1164,21 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} }
} }
public void enableDeviceRingtone(boolean use) {
if (use) {
mLc.setRing(null);
} else {
mLc.setRing(mRingSoundFile);
}
}
private synchronized void startRinging() { private synchronized void startRinging() {
if (disableRinging) { if (!LinphonePreferences.instance().isDeviceRingtoneEnabled()) {
// Enable speaker audio route, linphone library will do the ringing itself automatically
routeAudioToSpeaker(); routeAudioToSpeaker();
return; return;
} }
if (mR.getBoolean(R.bool.allow_ringing_while_early_media)) { if (mR.getBoolean(R.bool.allow_ringing_while_early_media)) {
routeAudioToSpeaker(); // Need to be able to ear the ringtone during the early media routeAudioToSpeaker(); // Need to be able to ear the ringtone during the early media
} }
@ -1577,8 +1544,8 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
@Override @Override
public void ecCalibrationStatus(LinphoneCore lc, EcCalibratorStatus status, public void ecCalibrationStatus(LinphoneCore lc, EcCalibratorStatus status,
int delay_ms, Object data) { int delay_ms, Object data) {
// TODO Auto-generated method stub ((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
Log.i("Set audio mode on 'Normal'");
} }
@Override @Override

View file

@ -21,7 +21,7 @@ package org.linphone;
import java.io.Serializable; import java.io.Serializable;
public class LinphoneNumberOrAddress implements Serializable { public class LinphoneNumberOrAddress implements Serializable, Comparable<LinphoneNumberOrAddress> {
/** /**
* *
*/ */
@ -41,6 +41,15 @@ public class LinphoneNumberOrAddress implements Serializable {
oldValueForUpdatePurpose = old; oldValueForUpdatePurpose = old;
} }
@Override
public int compareTo(LinphoneNumberOrAddress noa) {
if (noa.isSIPAddress() == isSIPAddress()) {
return noa.getValue().compareTo(getValue());
} else {
return isSIPAddress() ? -1 : 1;
}
}
public boolean isSIPAddress() { public boolean isSIPAddress() {
return isSIPAddress; return isSIPAddress;
} }

View file

@ -31,19 +31,21 @@ import org.linphone.core.LinphoneAddress.TransportType;
import org.linphone.core.LinphoneAuthInfo; import org.linphone.core.LinphoneAuthInfo;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.AdaptiveRateAlgorithm; import org.linphone.core.LinphoneCore.AdaptiveRateAlgorithm;
import org.linphone.core.LinphoneCore.FirewallPolicy;
import org.linphone.core.LinphoneCore.LinphoneLimeState; import org.linphone.core.LinphoneCore.LinphoneLimeState;
import org.linphone.core.LinphoneCore.MediaEncryption; import org.linphone.core.LinphoneCore.MediaEncryption;
import org.linphone.core.LinphoneCore.Transports; import org.linphone.core.LinphoneCore.Transports;
import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneNatPolicy;
import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.LpConfig; import org.linphone.core.LpConfig;
import org.linphone.core.TunnelConfig; import org.linphone.core.TunnelConfig;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.purchase.Purchasable; import org.linphone.purchase.Purchasable;
import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
@ -52,6 +54,7 @@ public class LinphonePreferences {
private static final int LINPHONE_CORE_RANDOM_PORT = -1; private static final int LINPHONE_CORE_RANDOM_PORT = -1;
private static LinphonePreferences instance; private static LinphonePreferences instance;
private Context mContext; private Context mContext;
private String basePath;
public static final synchronized LinphonePreferences instance() { public static final synchronized LinphonePreferences instance() {
if (instance == null) { if (instance == null) {
@ -66,6 +69,7 @@ public class LinphonePreferences {
public void setContext(Context c) { public void setContext(Context c) {
mContext = c; mContext = c;
basePath = mContext.getFilesDir().getAbsolutePath();
} }
private String getString(int key) { private String getString(int key) {
@ -90,10 +94,10 @@ public class LinphonePreferences {
} }
if (!LinphoneManager.isInstanciated()) { if (!LinphoneManager.isInstanciated()) {
File linphonerc = new File(mContext.getFilesDir().getAbsolutePath() + "/.linphonerc"); File linphonerc = new File(basePath + "/.linphonerc");
if (linphonerc.exists()) { if (linphonerc.exists()) {
return LinphoneCoreFactory.instance().createLpConfig(linphonerc.getAbsolutePath()); return LinphoneCoreFactory.instance().createLpConfig(linphonerc.getAbsolutePath());
} else { } else if (mContext != null) {
InputStream inputStream = mContext.getResources().openRawResource(R.raw.linphonerc_default); InputStream inputStream = mContext.getResources().openRawResource(R.raw.linphonerc_default);
InputStreamReader inputreader = new InputStreamReader(inputStream); InputStreamReader inputreader = new InputStreamReader(inputStream);
BufferedReader buffreader = new BufferedReader(inputreader); BufferedReader buffreader = new BufferedReader(inputreader);
@ -105,14 +109,15 @@ public class LinphonePreferences {
text.append('\n'); text.append('\n');
} }
} catch (IOException ioe) { } catch (IOException ioe) {
Log.e(ioe);
} }
return LinphoneCoreFactory.instance().createLpConfigFromString(text.toString()); return LinphoneCoreFactory.instance().createLpConfigFromString(text.toString());
} }
} } else {
return LinphoneCoreFactory.instance().createLpConfig(LinphoneManager.getInstance().mLinphoneConfigFile); return LinphoneCoreFactory.instance().createLpConfig(LinphoneManager.getInstance().mLinphoneConfigFile);
} }
return null;
}
public void removePreviousVersionAuthInfoRemoval() { public void removePreviousVersionAuthInfoRemoval() {
getConfig().setBool("sip", "store_auth_info", true); getConfig().setBool("sip", "store_auth_info", true);
@ -905,43 +910,44 @@ public class LinphonePreferences {
return getConfig().getBool("app", "wifi_only", false); return getConfig().getBool("app", "wifi_only", false);
} }
private LinphoneNatPolicy getOrCreateNatPolicy() {
LinphoneNatPolicy nat = getLc().getNatPolicy();
if (nat == null) {
nat = getLc().createNatPolicy();
}
return nat;
}
public String getStunServer() { public String getStunServer() {
return getLc().getStunServer(); LinphoneNatPolicy nat = getOrCreateNatPolicy();
return nat.getStunServer();
} }
public void setStunServer(String stun) { public void setStunServer(String stun) {
getLc().setStunServer(stun); LinphoneNatPolicy nat = getOrCreateNatPolicy();
nat.setStunServer(stun);
if (stun != null && !stun.isEmpty()) {
nat.enableStun(true);
}
getLc().setNatPolicy(nat);
} }
public void setIceEnabled(boolean enabled) { public void setIceEnabled(boolean enabled) {
if (enabled) { LinphoneNatPolicy nat = getOrCreateNatPolicy();
getLc().setFirewallPolicy(FirewallPolicy.UseIce); nat.enableIce(enabled);
} else { getLc().setNatPolicy(nat);
String stun = getStunServer();
if (stun != null && stun.length() > 0) {
getLc().setFirewallPolicy(FirewallPolicy.UseStun);
} else {
getLc().setFirewallPolicy(FirewallPolicy.NoFirewall);
}
} }
public void setTurnEnabled(boolean enabled) {
LinphoneNatPolicy nat = getOrCreateNatPolicy();
nat.enableTurn(enabled);
getLc().setNatPolicy(nat);
} }
public void setUpnpEnabled(boolean enabled) { public void setUpnpEnabled(boolean enabled) {
if (enabled) { LinphoneNatPolicy nat = getOrCreateNatPolicy();
if (isIceEnabled()) { nat.enableUpnp(enabled);
Log.e("Cannot have both ice and upnp enabled, disabling upnp"); getLc().setNatPolicy(nat);
} else {
getLc().setFirewallPolicy(FirewallPolicy.UseUpnp);
}
}
else {
String stun = getStunServer();
if (stun != null && stun.length() > 0) {
getLc().setFirewallPolicy(FirewallPolicy.UseStun);
} else {
getLc().setFirewallPolicy(FirewallPolicy.NoFirewall);
}
}
} }
public void useRandomPort(boolean enabled) { public void useRandomPort(boolean enabled) {
@ -982,11 +988,18 @@ public class LinphonePreferences {
} }
public boolean isUpnpEnabled() { public boolean isUpnpEnabled() {
return getLc().upnpAvailable() && getLc().getFirewallPolicy() == FirewallPolicy.UseUpnp; LinphoneNatPolicy nat = getOrCreateNatPolicy();
return nat.upnpEnabled();
} }
public boolean isIceEnabled() { public boolean isIceEnabled() {
return getLc().getFirewallPolicy() == FirewallPolicy.UseIce; LinphoneNatPolicy nat = getOrCreateNatPolicy();
return nat.iceEnabled();
}
public boolean isTurnEnabled() {
LinphoneNatPolicy nat = getOrCreateNatPolicy();
return nat.turnEnabled();
} }
public MediaEncryption getMediaEncryption() { public MediaEncryption getMediaEncryption() {
@ -1076,14 +1089,6 @@ public class LinphonePreferences {
return getConfig().getBool("app", "background_mode", true); return getConfig().getBool("app", "background_mode", true);
} }
public void setAnimationsEnabled(boolean enabled) {
getConfig().setBool("app", "animations", enabled);
}
public boolean areAnimationsEnabled() {
return getConfig().getBool("app", "animations", false);
}
public boolean isAutoStartEnabled() { public boolean isAutoStartEnabled() {
return getConfig().getBool("app", "auto_start", false); return getConfig().getBool("app", "auto_start", false);
} }
@ -1327,4 +1332,29 @@ public class LinphonePreferences {
} }
return firstTime; return firstTime;
} }
public boolean isDeviceRingtoneEnabled() {
int readExternalStorage = mContext.getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, mContext.getPackageName());
return getConfig().getBool("app", "device_ringtone", true) && readExternalStorage == PackageManager.PERMISSION_GRANTED;
}
public void enableDeviceRingtone(boolean enable) {
getConfig().setBool("app", "device_ringtone", enable);
}
public boolean isBisFeatureEnabled() {
return getConfig().getBool("app", "bis_feature", true);
}
public void enableBisFeature(boolean enable) {
getConfig().setBool("app", "bis_feature", enable);
}
public boolean isAutoAnswerEnabled() {
return getConfig().getBool("app", "auto_answer", false);
}
public void enableAutoAnswer(boolean enable) {
getConfig().setBool("app", "auto_answer", enable);
}
} }

View file

@ -23,10 +23,13 @@ import static android.view.View.VISIBLE;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -42,6 +45,7 @@ import java.util.zip.ZipOutputStream;
import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCall.State;
import org.linphone.core.LinphoneChatMessage;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreFactory;
@ -50,6 +54,8 @@ import org.linphone.mediastream.Log;
import org.linphone.mediastream.video.capture.hwconf.Hacks; import org.linphone.mediastream.video.capture.hwconf.Hacks;
import android.app.Activity; import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
@ -59,7 +65,9 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -464,5 +472,97 @@ public final class LinphoneUtils {
} }
return extension; return extension;
} }
public static void recursiveFileRemoval(File root) {
if (!root.delete()) {
if (root.isDirectory()) {
File[] files = root.listFiles();
if (files != null) {
for (File f : files) {
recursiveFileRemoval(f);
}
}
}
}
}
public static String getDisplayableUsernameFromAddress(String sipAddress) {
String username = sipAddress;
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return username;
if (username.startsWith("sip:")) {
username = username.substring(4);
}
if (username.contains("@")) {
String domain = username.split("@")[1];
LinphoneProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null) {
if (domain.equals(lpc.getDomain())) {
return username.split("@")[0];
}
} else {
if (domain.equals(LinphoneManager.getInstance().getContext().getString(R.string.default_domain))) {
return username.split("@")[0];
}
}
}
return username;
}
public static String getFullAddressFromUsername(String username) {
String sipAddress = username;
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return sipAddress;
if (!sipAddress.startsWith("sip:")) {
sipAddress = "sip:" + sipAddress;
}
if (!sipAddress.contains("@")) {
LinphoneProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null) {
sipAddress = sipAddress + "@" + lpc.getDomain();
} else {
sipAddress = sipAddress + "@" + LinphoneManager.getInstance().getContext().getString(R.string.default_domain);
}
}
return sipAddress;
}
public static void storeImage(Context context, LinphoneChatMessage msg) {
if (msg == null || msg.getFileTransferInformation() == null || msg.getAppData() == null) return;
File file = new File(Environment.getExternalStorageDirectory(), msg.getAppData());
Bitmap bm = BitmapFactory.decodeFile(file.getPath());
if (bm == null) return;
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, file.getName());
String extension = msg.getFileTransferInformation().getSubtype();
values.put(Images.Media.MIME_TYPE, "image/" + extension);
ContentResolver cr = context.getContentResolver();
Uri path = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream stream;
try {
stream = cr.openOutputStream(path);
if (extension != null && extension.toLowerCase(Locale.getDefault()).equals("png")) {
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
} else {
bm.compress(Bitmap.CompressFormat.JPEG, 100, stream);
}
stream.close();
file.delete();
bm.recycle();
msg.setAppData(path.toString());
} catch (FileNotFoundException e) {
Log.e(e);
} catch (IOException e) {
Log.e(e);
}
}
} }

View file

@ -84,7 +84,6 @@ public class PreferencesMigrator {
mNewPrefs.setPushNotificationRegistrationID(getPrefString(R.string.push_reg_id_key, null)); mNewPrefs.setPushNotificationRegistrationID(getPrefString(R.string.push_reg_id_key, null));
mNewPrefs.setDebugEnabled(getPrefBoolean(R.string.pref_debug_key, false)); mNewPrefs.setDebugEnabled(getPrefBoolean(R.string.pref_debug_key, false));
mNewPrefs.setBackgroundModeEnabled(getPrefBoolean(R.string.pref_background_mode_key, true)); mNewPrefs.setBackgroundModeEnabled(getPrefBoolean(R.string.pref_background_mode_key, true));
mNewPrefs.setAnimationsEnabled(getPrefBoolean(R.string.pref_animation_enable_key, false));
mNewPrefs.setAutoStart(getPrefBoolean(R.string.pref_autostart_key, false)); mNewPrefs.setAutoStart(getPrefBoolean(R.string.pref_autostart_key, false));
mNewPrefs.setSharingPictureServerUrl(getPrefString(R.string.pref_image_sharing_server_key, null)); mNewPrefs.setSharingPictureServerUrl(getPrefString(R.string.pref_image_sharing_server_key, null));
mNewPrefs.setRemoteProvisioningUrl(getPrefString(R.string.pref_remote_provisioning_key, null)); mNewPrefs.setRemoteProvisioningUrl(getPrefString(R.string.pref_remote_provisioning_key, null));

View file

@ -42,7 +42,12 @@ import org.linphone.ui.PreferencesListFragment;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.Manifest;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
@ -63,20 +68,18 @@ public class SettingsFragment extends PreferencesListFragment {
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
private LinphoneCoreListenerBase mListener; private LinphoneCoreListenerBase mListener;
public SettingsFragment() {
super(R.xml.preferences);
}
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
mPrefs = LinphonePreferences.instance(); mPrefs = LinphonePreferences.instance();
removePreviousPreferencesFile(); // Required when updating the preferences order removePreviousPreferencesFile(); // Required when updating the preferences order
addPreferencesFromResource(R.xml.preferences);
// Init the settings page interface mListener = new LinphoneCoreListenerBase() {
initSettings();
setListeners();
hideSettings();
mListener = new LinphoneCoreListenerBase(){
@Override @Override
public void ecCalibrationStatus(LinphoneCore lc, final EcCalibratorStatus status, final int delayMs, Object data) { public void ecCalibrationStatus(LinphoneCore lc, final EcCalibratorStatus status, final int delayMs, Object data) {
LinphoneManager.getInstance().routeAudioToReceiver(); LinphoneManager.getInstance().routeAudioToReceiver();
@ -88,22 +91,36 @@ public class SettingsFragment extends PreferencesListFragment {
echoCancellerCalibration.setSummary(R.string.no_echo); echoCancellerCalibration.setSummary(R.string.no_echo);
echoCancellation.setChecked(false); echoCancellation.setChecked(false);
LinphonePreferences.instance().setEchoCancellation(false); LinphonePreferences.instance().setEchoCancellation(false);
((AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
Log.i("Set audio mode on 'Normal'");
} else if (status == EcCalibratorStatus.Done) { } else if (status == EcCalibratorStatus.Done) {
echoCancellerCalibration.setSummary(String.format(getString(R.string.ec_calibrated), delayMs)); echoCancellerCalibration.setSummary(String.format(getString(R.string.ec_calibrated), delayMs));
echoCancellation.setChecked(true); echoCancellation.setChecked(true);
LinphonePreferences.instance().setEchoCancellation(true); LinphonePreferences.instance().setEchoCancellation(true);
((AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
Log.i("Set audio mode on 'Normal'");
} else if (status == EcCalibratorStatus.Failed) { } else if (status == EcCalibratorStatus.Failed) {
echoCancellerCalibration.setSummary(R.string.failed); echoCancellerCalibration.setSummary(R.string.failed);
echoCancellation.setChecked(true); echoCancellation.setChecked(true);
LinphonePreferences.instance().setEchoCancellation(true); LinphonePreferences.instance().setEchoCancellation(true);
((AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
Log.i("Set audio mode on 'Normal'");
} }
} }
}; };
initSettings();
setListeners();
hideSettings();
} }
private void removePreviousPreferencesFile() { private void removePreviousPreferencesFile() {
File dir = new File(LinphoneActivity.instance().getFilesDir().getAbsolutePath() + "shared_prefs"); SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit();
dir.delete(); editor.clear();
editor.commit();
File dir = new File(getActivity().getFilesDir().getAbsolutePath() + "shared_prefs");
LinphoneUtils.recursiveFileRemoval(dir);
} }
// Inits the values or the listener on some settings // Inits the values or the listener on some settings
@ -159,11 +176,6 @@ public class SettingsFragment extends PreferencesListFragment {
hidePreference(R.string.pref_in_app_store_key); hidePreference(R.string.pref_in_app_store_key);
} }
if (getResources().getBoolean(R.bool.disable_animations)) {
uncheckAndHidePreference(R.string.pref_animation_enable_key);
}
if (getResources().getBoolean(R.bool.disable_chat)) { if (getResources().getBoolean(R.bool.disable_chat)) {
findPreference(getString(R.string.pref_image_sharing_server_key)).setLayoutResource(R.layout.hidden); findPreference(getString(R.string.pref_image_sharing_server_key)).setLayoutResource(R.layout.hidden);
} }
@ -173,7 +185,7 @@ public class SettingsFragment extends PreferencesListFragment {
} }
if (!Version.isVideoCapable() || !LinphoneManager.getLcIfManagerNotDestroyedOrNull().isVideoSupported()) { if (!Version.isVideoCapable() || !LinphoneManager.getLcIfManagerNotDestroyedOrNull().isVideoSupported()) {
uncheckAndHidePreference(R.string.pref_video_enable_key); emptyAndHidePreference(R.string.pref_video_key);
} else { } else {
if (!AndroidCameraConfiguration.hasFrontCamera()) { if (!AndroidCameraConfiguration.hasFrontCamera()) {
uncheckAndHidePreference(R.string.pref_video_use_front_camera_key); uncheckAndHidePreference(R.string.pref_video_use_front_camera_key);
@ -186,7 +198,6 @@ public class SettingsFragment extends PreferencesListFragment {
if (getResources().getBoolean(R.bool.hide_camera_settings)) { if (getResources().getBoolean(R.bool.hide_camera_settings)) {
emptyAndHidePreference(R.string.pref_video_key); emptyAndHidePreference(R.string.pref_video_key);
hidePreference(R.string.pref_video_enable_key);
} }
if (getResources().getBoolean(R.bool.disable_every_log)) { if (getResources().getBoolean(R.bool.disable_every_log)) {
@ -245,14 +256,20 @@ public class SettingsFragment extends PreferencesListFragment {
} }
private void setPreferenceDefaultValueAndSummary(int pref, String value) { private void setPreferenceDefaultValueAndSummary(int pref, String value) {
if(value != null) { if (value != null) {
EditTextPreference etPref = (EditTextPreference) findPreference(getString(pref)); EditTextPreference etPref = (EditTextPreference) findPreference(getString(pref));
if (etPref != null) {
etPref.setText(value); etPref.setText(value);
etPref.setSummary(value); etPref.setSummary(value);
} }
} }
}
private void initTunnelSettings() { private void initTunnelSettings() {
if (!LinphoneManager.getLc().isTunnelAvailable()) {
return;
}
setPreferenceDefaultValueAndSummary(R.string.pref_tunnel_host_key, mPrefs.getTunnelHost()); setPreferenceDefaultValueAndSummary(R.string.pref_tunnel_host_key, mPrefs.getTunnelHost());
setPreferenceDefaultValueAndSummary(R.string.pref_tunnel_port_key, String.valueOf(mPrefs.getTunnelPort())); setPreferenceDefaultValueAndSummary(R.string.pref_tunnel_port_key, String.valueOf(mPrefs.getTunnelPort()));
ListPreference tunnelModePref = (ListPreference) findPreference(getString(R.string.pref_tunnel_mode_key)); ListPreference tunnelModePref = (ListPreference) findPreference(getString(R.string.pref_tunnel_mode_key));
@ -464,7 +481,13 @@ public class SettingsFragment extends PreferencesListFragment {
setListPreferenceValues(pref, entries, values); setListPreferenceValues(pref, entries, values);
LinphoneLimeState lime = mPrefs.getLimeEncryption(); LinphoneLimeState lime = mPrefs.getLimeEncryption();
pref.setSummary(lime.toString()); if (lime == LinphoneLimeState.Disabled) {
pref.setSummary(getString(R.string.lime_encryption_entry_disabled));
} else if (lime == LinphoneLimeState.Mandatory) {
pref.setSummary(getString(R.string.lime_encryption_entry_mandatory));
} else if (lime == LinphoneLimeState.Preferred) {
pref.setSummary(getString(R.string.lime_encryption_entry_preferred));
}
pref.setValue(lime.toString()); pref.setValue(lime.toString());
} }
@ -576,11 +599,13 @@ public class SettingsFragment extends PreferencesListFragment {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
synchronized (SettingsFragment.this) { synchronized (SettingsFragment.this) {
try {
LinphoneManager.getInstance().startEcCalibration(mListener);
preference.setSummary(R.string.ec_calibrating); preference.setSummary(R.string.ec_calibrating);
} catch (LinphoneCoreException e) {
Log.w(e, "Cannot calibrate EC"); int recordAudio = getActivity().getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getActivity().getPackageName());
if (recordAudio == PackageManager.PERMISSION_GRANTED) {
startEchoCancellerCalibration();
} else {
LinphoneActivity.instance().checkAndRequestRecordAudioPermissionForEchoCanceller();
} }
} }
return true; return true;
@ -588,6 +613,19 @@ public class SettingsFragment extends PreferencesListFragment {
}); });
} }
public void startEchoCancellerCalibration() {
try {
LinphoneManager.getInstance().startEcCalibration(mListener);
} catch (LinphoneCoreException e) {
Log.e(e);
}
}
public void echoCalibrationFail() {
Preference echoCancellerCalibration = findPreference(getString(R.string.pref_echo_canceller_calibration_key));
echoCancellerCalibration.setSummary(R.string.failed);
}
private void initVideoSettings() { private void initVideoSettings() {
initializePreferredVideoSizePreferences((ListPreference) findPreference(getString(R.string.pref_preferred_video_size_key))); initializePreferredVideoSizePreferences((ListPreference) findPreference(getString(R.string.pref_preferred_video_size_key)));
initializePreferredVideoFpsPreferences((ListPreference) findPreference(getString(R.string.pref_preferred_video_fps_key))); initializePreferredVideoFpsPreferences((ListPreference) findPreference(getString(R.string.pref_preferred_video_fps_key)));
@ -782,9 +820,14 @@ public class SettingsFragment extends PreferencesListFragment {
} }
private void initCallSettings() { private void initCallSettings() {
CheckBoxPreference deviceRingtone = (CheckBoxPreference) findPreference(getString(R.string.pref_device_ringtone_key));
CheckBoxPreference autoAnswer = (CheckBoxPreference) findPreference(getString(R.string.pref_auto_answer_key));
CheckBoxPreference rfc2833 = (CheckBoxPreference) findPreference(getString(R.string.pref_rfc2833_dtmf_key)); CheckBoxPreference rfc2833 = (CheckBoxPreference) findPreference(getString(R.string.pref_rfc2833_dtmf_key));
CheckBoxPreference sipInfo = (CheckBoxPreference) findPreference(getString(R.string.pref_sipinfo_dtmf_key)); CheckBoxPreference sipInfo = (CheckBoxPreference) findPreference(getString(R.string.pref_sipinfo_dtmf_key));
deviceRingtone.setChecked(mPrefs.isDeviceRingtoneEnabled());
autoAnswer.setChecked(mPrefs.isAutoAnswerEnabled());
if (mPrefs.useRfc2833Dtmfs()) { if (mPrefs.useRfc2833Dtmfs()) {
rfc2833.setChecked(true); rfc2833.setChecked(true);
sipInfo.setChecked(false); sipInfo.setChecked(false);
@ -798,7 +841,63 @@ public class SettingsFragment extends PreferencesListFragment {
setPreferenceDefaultValueAndSummary(R.string.pref_voice_mail_key, mPrefs.getVoiceMailUri()); setPreferenceDefaultValueAndSummary(R.string.pref_voice_mail_key, mPrefs.getVoiceMailUri());
} }
public void enableDeviceRingtone(boolean enabled) {
LinphonePreferences.instance().enableDeviceRingtone(enabled);
LinphoneManager.getInstance().enableDeviceRingtone(enabled);
((CheckBoxPreference)findPreference(getString(R.string.pref_device_ringtone_key))).setChecked(enabled);
}
private void setCallPreferencesListener() { private void setCallPreferencesListener() {
findPreference(getString(R.string.pref_device_ringtone_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean use = (Boolean) newValue;
if (use) {
int readExternalStorage = getActivity().getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, getActivity().getPackageName());
if (readExternalStorage == PackageManager.PERMISSION_GRANTED) {
mPrefs.enableDeviceRingtone(true);
LinphoneManager.getInstance().enableDeviceRingtone(true);
} else {
LinphoneActivity.instance().checkAndRequestReadExternalStoragePermissionForDeviceRingtone();
}
} else {
mPrefs.enableDeviceRingtone(false);
LinphoneManager.getInstance().enableDeviceRingtone(false);
}
return true;
}
});
findPreference(getString(R.string.pref_media_encryption_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
MediaEncryption menc = MediaEncryption.None;
if (value.equals(getString(R.string.pref_media_encryption_key_srtp)))
menc = MediaEncryption.SRTP;
else if (value.equals(getString(R.string.pref_media_encryption_key_zrtp)))
menc = MediaEncryption.ZRTP;
else if (value.equals(getString(R.string.pref_media_encryption_key_dtls)))
menc = MediaEncryption.DTLS;
mPrefs.setMediaEncryption(menc);
preference.setSummary(mPrefs.getMediaEncryption().toString());
return true;
}
});
initMediaEncryptionPreference((ListPreference) findPreference(getString(R.string.pref_media_encryption_key)));
findPreference(getString(R.string.pref_auto_answer_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean use = (Boolean) newValue;
mPrefs.enableAutoAnswer(use);
return true;
}
});
findPreference(getString(R.string.pref_rfc2833_dtmf_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_rfc2833_dtmf_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
@ -877,22 +976,14 @@ public class SettingsFragment extends PreferencesListFragment {
} }
private void initNetworkSettings() { private void initNetworkSettings() {
initMediaEncryptionPreference((ListPreference) findPreference(getString(R.string.pref_media_encryption_key)));
((CheckBoxPreference) findPreference(getString(R.string.pref_wifi_only_key))).setChecked(mPrefs.isWifiOnlyEnabled()); ((CheckBoxPreference) findPreference(getString(R.string.pref_wifi_only_key))).setChecked(mPrefs.isWifiOnlyEnabled());
// Disable UPnP if ICE si enabled, or disable ICE if UPnP is enabled // Disable UPnP if ICE si enabled, or disable ICE if UPnP is enabled
CheckBoxPreference ice = (CheckBoxPreference) findPreference(getString(R.string.pref_ice_enable_key)); CheckBoxPreference ice = (CheckBoxPreference) findPreference(getString(R.string.pref_ice_enable_key));
CheckBoxPreference turn = (CheckBoxPreference) findPreference(getString(R.string.pref_turn_enable_key));
CheckBoxPreference upnp = (CheckBoxPreference) findPreference(getString(R.string.pref_upnp_enable_key)); CheckBoxPreference upnp = (CheckBoxPreference) findPreference(getString(R.string.pref_upnp_enable_key));
ice.setChecked(mPrefs.isIceEnabled()); ice.setChecked(mPrefs.isIceEnabled());
if (mPrefs.isIceEnabled()) { turn.setChecked(mPrefs.isTurnEnabled());
upnp.setEnabled(false);
} else {
upnp.setChecked(mPrefs.isUpnpEnabled());
if (mPrefs.isUpnpEnabled()) {
ice.setEnabled(false);
}
}
CheckBoxPreference randomPort = (CheckBoxPreference) findPreference(getString(R.string.pref_transport_use_random_ports_key)); CheckBoxPreference randomPort = (CheckBoxPreference) findPreference(getString(R.string.pref_transport_use_random_ports_key));
randomPort.setChecked(mPrefs.isUsingRandomPort()); randomPort.setChecked(mPrefs.isUsingRandomPort());
@ -934,20 +1025,26 @@ public class SettingsFragment extends PreferencesListFragment {
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
CheckBoxPreference upnp = (CheckBoxPreference) findPreference(getString(R.string.pref_upnp_enable_key)); CheckBoxPreference upnp = (CheckBoxPreference) findPreference(getString(R.string.pref_upnp_enable_key));
boolean value = (Boolean) newValue; boolean value = (Boolean) newValue;
upnp.setChecked(false);
upnp.setEnabled(!value);
mPrefs.setIceEnabled((Boolean) newValue); mPrefs.setIceEnabled((Boolean) newValue);
return true; return true;
} }
}); });
findPreference(getString(R.string.pref_turn_enable_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
CheckBoxPreference upnp = (CheckBoxPreference) findPreference(getString(R.string.pref_upnp_enable_key));
boolean value = (Boolean) newValue;
mPrefs.setTurnEnabled((Boolean) newValue);
return true;
}
});
findPreference(getString(R.string.pref_upnp_enable_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_upnp_enable_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
CheckBoxPreference ice = (CheckBoxPreference) findPreference(getString(R.string.pref_ice_enable_key)); CheckBoxPreference ice = (CheckBoxPreference) findPreference(getString(R.string.pref_ice_enable_key));
boolean value = (Boolean) newValue; boolean value = (Boolean) newValue;
ice.setChecked(false);
ice.setEnabled(!value);
mPrefs.setUpnpEnabled(value); mPrefs.setUpnpEnabled(value);
return true; return true;
} }
@ -978,24 +1075,6 @@ public class SettingsFragment extends PreferencesListFragment {
} }
}); });
findPreference(getString(R.string.pref_media_encryption_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
MediaEncryption menc = MediaEncryption.None;
if (value.equals(getString(R.string.pref_media_encryption_key_srtp)))
menc = MediaEncryption.SRTP;
else if (value.equals(getString(R.string.pref_media_encryption_key_zrtp)))
menc = MediaEncryption.ZRTP;
else if (value.equals(getString(R.string.pref_media_encryption_key_dtls)))
menc = MediaEncryption.DTLS;
mPrefs.setMediaEncryption(menc);
preference.setSummary(mPrefs.getMediaEncryption().toString());
return true;
}
});
findPreference(getString(R.string.pref_push_notification_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_push_notification_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
@ -1016,7 +1095,6 @@ public class SettingsFragment extends PreferencesListFragment {
private void initAdvancedSettings() { private void initAdvancedSettings() {
((CheckBoxPreference)findPreference(getString(R.string.pref_debug_key))).setChecked(mPrefs.isDebugEnabled()); ((CheckBoxPreference)findPreference(getString(R.string.pref_debug_key))).setChecked(mPrefs.isDebugEnabled());
((CheckBoxPreference)findPreference(getString(R.string.pref_background_mode_key))).setChecked(mPrefs.isBackgroundModeEnabled()); ((CheckBoxPreference)findPreference(getString(R.string.pref_background_mode_key))).setChecked(mPrefs.isBackgroundModeEnabled());
((CheckBoxPreference)findPreference(getString(R.string.pref_animation_enable_key))).setChecked(mPrefs.areAnimationsEnabled());
((CheckBoxPreference)findPreference(getString(R.string.pref_service_notification_key))).setChecked(mPrefs.getServiceNotificationVisibility()); ((CheckBoxPreference)findPreference(getString(R.string.pref_service_notification_key))).setChecked(mPrefs.getServiceNotificationVisibility());
((CheckBoxPreference)findPreference(getString(R.string.pref_autostart_key))).setChecked(mPrefs.isAutoStartEnabled()); ((CheckBoxPreference)findPreference(getString(R.string.pref_autostart_key))).setChecked(mPrefs.isAutoStartEnabled());
setPreferenceDefaultValueAndSummary(R.string.pref_remote_provisioning_key, mPrefs.getRemoteProvisioningUrl()); setPreferenceDefaultValueAndSummary(R.string.pref_remote_provisioning_key, mPrefs.getRemoteProvisioningUrl());
@ -1043,15 +1121,6 @@ public class SettingsFragment extends PreferencesListFragment {
} }
}); });
findPreference(getString(R.string.pref_animation_enable_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean value = (Boolean) newValue;
mPrefs.setAnimationsEnabled(value);
return true;
}
});
findPreference(getString(R.string.pref_service_notification_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_service_notification_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
@ -1112,6 +1181,7 @@ public class SettingsFragment extends PreferencesListFragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
// Init the settings page interface
initAccounts(); initAccounts();
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated()) {

View file

@ -42,6 +42,7 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -142,6 +143,20 @@ public class StatusFragment extends Fragment {
}; };
isAttached = true;
Activity activity = getActivity();
if (activity instanceof LinphoneActivity) {
((LinphoneActivity) activity).updateStatusFragment(this);
isInCall = false;
} else if (activity instanceof CallActivity) {
((CallActivity) activity).updateStatusFragment(this);
isInCall = true;
} else if (activity instanceof AssistantActivity) {
((AssistantActivity) activity).updateStatusFragment(this);
isInCall = false;
}
return view; return view;
} }
@ -157,23 +172,6 @@ public class StatusFragment extends Fragment {
} }
} }
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
isAttached = true;
if (activity instanceof LinphoneActivity) {
((LinphoneActivity) activity).updateStatusFragment(this);
isInCall = false;
} else if (activity instanceof CallActivity) {
((CallActivity) activity).updateStatusFragment(this);
isInCall = true;
} else if (activity instanceof AssistantActivity) {
((AssistantActivity) activity).updateStatusFragment(this);
isInCall = false;
}
}
@Override @Override
public void onDetach() { public void onDetach() {
super.onDetach(); super.onDetach();
@ -399,7 +397,7 @@ public class StatusFragment extends Fragment {
if(ZRTPdialog == null || !ZRTPdialog.isShowing()) { if(ZRTPdialog == null || !ZRTPdialog.isShowing()) {
ZRTPdialog = new Dialog(getActivity()); ZRTPdialog = new Dialog(getActivity());
ZRTPdialog.requestWindowFeature(Window.FEATURE_NO_TITLE); ZRTPdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(getActivity(), R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
ZRTPdialog.setContentView(R.layout.dialog); ZRTPdialog.setContentView(R.layout.dialog);
ZRTPdialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); ZRTPdialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

View file

@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import org.linphone.LinphoneActivity; import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
import org.linphone.LinphoneUtils;
import org.linphone.LinphonePreferences.AccountBuilder; import org.linphone.LinphonePreferences.AccountBuilder;
import org.linphone.R; import org.linphone.R;
import org.linphone.StatusFragment; import org.linphone.StatusFragment;
@ -51,6 +52,7 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -120,7 +122,7 @@ private static AssistantActivity instance;
if (state == RegistrationState.RegistrationOk) { if (state == RegistrationState.RegistrationOk) {
if (progress != null) progress.dismiss(); if (progress != null) progress.dismiss();
if (LinphoneManager.getLc().getDefaultProxyConfig() != null) { if (LinphoneManager.getLc().getDefaultProxyConfig() != null) {
launchEchoCancellerCalibration(true); success();
} }
} else if (state == RegistrationState.RegistrationFailed) { } else if (state == RegistrationState.RegistrationFailed) {
if (progress != null) progress.dismiss(); if (progress != null) progress.dismiss();
@ -272,24 +274,20 @@ private static AssistantActivity instance;
} }
} }
private boolean launchEchoCancellerCalibration(boolean sendEcCalibrationResult) { private void launchEchoCancellerCalibration(boolean sendEcCalibrationResult) {
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED) { int recordAudio = getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName());
boolean needsEchoCalibration = LinphoneManager.getLc().needsEchoCalibration(); Log.i("[Permission] Record audio permission is " + (recordAudio == PackageManager.PERMISSION_GRANTED ? "granted" : "denied"));
if (needsEchoCalibration && mPrefs.isFirstLaunch() && !echoCancellerAlreadyDone) {
if (recordAudio == PackageManager.PERMISSION_GRANTED) {
EchoCancellerCalibrationFragment fragment = new EchoCancellerCalibrationFragment(); EchoCancellerCalibrationFragment fragment = new EchoCancellerCalibrationFragment();
fragment.enableEcCalibrationResultSending(sendEcCalibrationResult); fragment.enableEcCalibrationResultSending(sendEcCalibrationResult);
changeFragment(fragment); changeFragment(fragment);
currentFragment = AssistantFragmentsEnum.ECHO_CANCELLER_CALIBRATION; currentFragment = AssistantFragmentsEnum.ECHO_CANCELLER_CALIBRATION;
back.setVisibility(View.VISIBLE); back.setVisibility(View.VISIBLE);
cancel.setEnabled(false); cancel.setEnabled(false);
echoCancellerAlreadyDone = true;
return true;
}
isEchoCalibrationFinished();
} else { } else {
checkAndRequestAudioPermission(); checkAndRequestAudioPermission();
} }
return false;
} }
private void logIn(String username, String password, String displayName, String domain, TransportType transport, boolean sendEcCalibrationResult) { private void logIn(String username, String password, String displayName, String domain, TransportType transport, boolean sendEcCalibrationResult) {
@ -379,7 +377,6 @@ private static AssistantActivity instance;
} }
private void launchDownloadCodec() { private void launchDownloadCodec() {
Log.i("linphone salut c'est miguel download");
OpenH264DownloadHelper downloadHelper = LinphoneCoreFactory.instance().createOpenH264DownloadHelper(); OpenH264DownloadHelper downloadHelper = LinphoneCoreFactory.instance().createOpenH264DownloadHelper();
if (Version.getCpuAbis().contains("armeabi-v7a") && !Version.getCpuAbis().contains("x86") && !downloadHelper.isCodecFound()) { if (Version.getCpuAbis().contains("armeabi-v7a") && !Version.getCpuAbis().contains("x86") && !downloadHelper.isCodecFound()) {
CodecDownloaderFragment codecFragment = new CodecDownloaderFragment(); CodecDownloaderFragment codecFragment = new CodecDownloaderFragment();
@ -388,27 +385,19 @@ private static AssistantActivity instance;
back.setVisibility(View.VISIBLE); back.setVisibility(View.VISIBLE);
cancel.setEnabled(false); cancel.setEnabled(false);
} else } else
endDownloadCodec(); goToLinphoneActivity();
} }
public void endDownloadCodec() { public void endDownloadCodec() {
success(); goToLinphoneActivity();
} }
public void saveCreatedAccount(String username, String password, String displayName, String domain, TransportType transport) { public void saveCreatedAccount(String username, String password, String displayName, String domain, TransportType transport) {
if (accountCreated) if (accountCreated)
return; return;
if(username.startsWith("sip:")) { username = LinphoneUtils.getDisplayableUsernameFromAddress(username);
username = username.substring(4); domain = LinphoneUtils.getDisplayableUsernameFromAddress(domain);
}
if (username.contains("@"))
username = username.split("@")[0];
if(domain.startsWith("sip:")) {
domain = domain.substring(4);
}
String identity = "sip:" + username + "@" + domain; String identity = "sip:" + username + "@" + domain;
try { try {
@ -486,7 +475,7 @@ private static AssistantActivity instance;
public void displayRegistrationInProgressDialog() { public void displayRegistrationInProgressDialog() {
if(LinphoneManager.getLc().isNetworkReachable()) { if(LinphoneManager.getLc().isNetworkReachable()) {
progress = ProgressDialog.show(this, null, null); progress = ProgressDialog.show(this, null, null);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorE)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorE));
d.setAlpha(200); d.setAlpha(200);
progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
progress.getWindow().setBackgroundDrawable(d); progress.getWindow().setBackgroundDrawable(d);
@ -499,7 +488,7 @@ private static AssistantActivity instance;
remoteProvisioningInProgress = true; remoteProvisioningInProgress = true;
progress = ProgressDialog.show(this, null, null); progress = ProgressDialog.show(this, null, null);
Drawable d = new ColorDrawable(getResources().getColor(R.color.colorE)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorE));
d.setAlpha(200); d.setAlpha(200);
progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); progress.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
progress.getWindow().setBackgroundDrawable(d); progress.getWindow().setBackgroundDrawable(d);
@ -553,6 +542,15 @@ private static AssistantActivity instance;
} }
public void success() { public void success() {
boolean needsEchoCalibration = LinphoneManager.getLc().needsEchoCalibration();
if (needsEchoCalibration && mPrefs.isFirstLaunch()) {
launchEchoCancellerCalibration(true);
} else {
launchDownloadCodec();
}
}
private void goToLinphoneActivity() {
mPrefs.firstLaunchSuccessful(); mPrefs.firstLaunchSuccessful();
startActivity(new Intent().setClass(this, LinphoneActivity.class).putExtra("isNewProxyConfig", true)); startActivity(new Intent().setClass(this, LinphoneActivity.class).putExtra("isNewProxyConfig", true));
finish(); finish();

View file

@ -17,9 +17,13 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
import java.net.URL; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.LinphoneXmlRpcRequest;
import org.linphone.core.LinphoneXmlRpcRequest.LinphoneXmlRpcRequestListener;
import org.linphone.core.LinphoneXmlRpcRequestImpl;
import org.linphone.core.LinphoneXmlRpcSession;
import org.linphone.core.LinphoneXmlRpcSessionImpl;
import android.app.Fragment; import android.app.Fragment;
import android.os.Bundle; import android.os.Bundle;
@ -30,17 +34,16 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.Toast; import android.widget.Toast;
import de.timroes.axmlrpc.XMLRPCCallback;
import de.timroes.axmlrpc.XMLRPCClient;
import de.timroes.axmlrpc.XMLRPCException;
import de.timroes.axmlrpc.XMLRPCServerException;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
public class CreateAccountActivationFragment extends Fragment { public class CreateAccountActivationFragment extends Fragment implements LinphoneXmlRpcRequestListener {
private String username, password, domain; private String username, password;
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
private Button checkAccount; private Button checkAccount;
private LinphoneXmlRpcSession xmlRpcSession;
private LinphoneXmlRpcRequest xmlRpcRequest;
private Runnable runNotOk, runOk, runNotReachable;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -59,57 +62,48 @@ public class CreateAccountActivationFragment extends Fragment {
} }
}); });
return view; runNotOk = new Runnable() {
}
private void isAccountVerified(final String username) {
final Runnable runNotReachable = new Runnable() {
public void run() {
Toast.makeText(getActivity(), getString(R.string.wizard_server_unavailable), Toast.LENGTH_LONG).show();
}
};
try {
XMLRPCClient client = new XMLRPCClient(new URL(getString(R.string.wizard_url)));
XMLRPCCallback listener = new XMLRPCCallback() {
Runnable runNotOk = new Runnable() {
public void run() { public void run() {
checkAccount.setEnabled(true); checkAccount.setEnabled(true);
Toast.makeText(getActivity(), getString(R.string.assistant_account_not_validated), Toast.LENGTH_LONG).show(); Toast.makeText(getActivity(), getString(R.string.assistant_account_not_validated), Toast.LENGTH_LONG).show();
} }
}; };
runOk = new Runnable() {
Runnable runOk = new Runnable() {
public void run() { public void run() {
checkAccount.setEnabled(true); checkAccount.setEnabled(true);
AssistantActivity.instance().saveCreatedAccount(username,password,null, getString(R.string.default_domain),null); AssistantActivity.instance().saveCreatedAccount(username,password,null, getString(R.string.default_domain),null);
AssistantActivity.instance().isAccountVerified(username); AssistantActivity.instance().isAccountVerified(username);
} }
}; };
runNotReachable = new Runnable() {
public void run() {
Toast.makeText(getActivity(), getString(R.string.wizard_server_unavailable), Toast.LENGTH_LONG).show();
}
};
public void onResponse(long id, Object result) { xmlRpcSession = new LinphoneXmlRpcSessionImpl(LinphoneManager.getLcIfManagerNotDestroyedOrNull(), getString(R.string.wizard_url));
int answer = (Integer) result; xmlRpcRequest = new LinphoneXmlRpcRequestImpl("check_account_validated", LinphoneXmlRpcRequest.ArgType.Int);
if (answer != 1) { xmlRpcRequest.setListener(this);
return view;
}
@Override
public void onXmlRpcRequestResponse(LinphoneXmlRpcRequest request) {
if (request.getStatus() == LinphoneXmlRpcRequest.Status.Ok) {
int response = request.getIntResponse();
if (response != 1) {
mHandler.post(runNotOk); mHandler.post(runNotOk);
} else { } else {
mHandler.post(runOk); mHandler.post(runOk);
} }
} } else if (request.getStatus() == LinphoneXmlRpcRequest.Status.Failed) {
public void onError(long id, XMLRPCException error) {
mHandler.post(runNotReachable); mHandler.post(runNotReachable);
} }
}
public void onServerError(long id, XMLRPCServerException error) { private void isAccountVerified(final String username) {
mHandler.post(runNotReachable); xmlRpcRequest.addStringArg(username + "@" + getString(R.string.default_domain));
} xmlRpcSession.sendRequest(xmlRpcRequest);
};
client.callAsync(listener, "check_account_validated", username + "@" + getString(R.string.default_domain));
}
catch(Exception ex) {
mHandler.post(runNotReachable);
}
} }
} }

View file

@ -17,20 +17,22 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
import java.net.URL;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphoneService;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.LinphoneXmlRpcRequest;
import org.linphone.core.LinphoneXmlRpcRequest.LinphoneXmlRpcRequestListener;
import org.linphone.core.LinphoneXmlRpcRequestImpl;
import org.linphone.core.LinphoneXmlRpcSession;
import org.linphone.core.LinphoneXmlRpcSessionImpl;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.Editable; import android.text.Editable;
@ -45,10 +47,6 @@ import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import de.timroes.axmlrpc.XMLRPCCallback;
import de.timroes.axmlrpc.XMLRPCClient;
import de.timroes.axmlrpc.XMLRPCException;
import de.timroes.axmlrpc.XMLRPCServerException;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
@ -63,11 +61,7 @@ public class CreateAccountFragment extends Fragment {
private boolean confirmPasswordOk = false; private boolean confirmPasswordOk = false;
private Button createAccount; private Button createAccount;
private final Pattern UPPER_CASE_REGEX = Pattern.compile("[A-Z]"); private final Pattern UPPER_CASE_REGEX = Pattern.compile("[A-Z]");
private char[] acceptedChars = new char[]{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', private LinphoneXmlRpcSession xmlRpcSession;
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '_', '-' };
private char[] acceptedCharsForPhoneNumbers = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+' };
private String inputFilterCharacters;
private String getUsername() { private String getUsername() {
String username = usernameEdit.getText().toString(); String username = usernameEdit.getText().toString();
@ -96,9 +90,7 @@ public class CreateAccountFragment extends Fragment {
addXMLRPCUsernameHandler(usernameEdit, null); addXMLRPCUsernameHandler(usernameEdit, null);
inputFilterCharacters = new String(acceptedChars);
if (getResources().getBoolean(R.bool.allow_only_phone_numbers_in_wizard)) { if (getResources().getBoolean(R.bool.allow_only_phone_numbers_in_wizard)) {
inputFilterCharacters = new String(acceptedCharsForPhoneNumbers);
usernameEdit.setInputType(InputType.TYPE_CLASS_NUMBER); usernameEdit.setInputType(InputType.TYPE_CLASS_NUMBER);
} }
@ -127,6 +119,8 @@ public class CreateAccountFragment extends Fragment {
} }
} }
xmlRpcSession = new LinphoneXmlRpcSessionImpl(LinphoneManager.getLcIfManagerNotDestroyedOrNull(), getString(R.string.wizard_url));
return view; return view;
} }
@ -152,59 +146,47 @@ public class CreateAccountFragment extends Fragment {
} }
private void isUsernameRegistred(final String username, final ImageView icon) { private void isUsernameRegistred(final String username, final ImageView icon) {
final Runnable runNotReachable = new Runnable() { final Runnable runNotOk = new Runnable() {
public void run() { public void run() {
usernameOk = false; usernameOk = false;
displayError(usernameOk, usernameError, usernameEdit, getResources().getString(R.string.wizard_server_unavailable)); displayError(usernameOk, usernameError, usernameEdit, LinphoneManager.getInstance().getContext().getString(R.string.wizard_username_unavailable));
createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk);
} }
}; };
final Runnable runOk = new Runnable() {
try {
XMLRPCClient client = new XMLRPCClient(new URL(getString(R.string.wizard_url)));
XMLRPCCallback listener = new XMLRPCCallback() {
Runnable runNotOk = new Runnable() {
public void run() {
usernameOk = false;
displayError(usernameOk, usernameError, usernameEdit, getResources().getString(R.string.wizard_username_unavailable));
createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk);
}
};
Runnable runOk = new Runnable() {
public void run() { public void run() {
usernameOk = true; usernameOk = true;
displayError(usernameOk, usernameError, usernameEdit, ""); displayError(usernameOk, usernameError, usernameEdit, "");
createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk);
} }
}; };
final Runnable runNotReachable = new Runnable() {
public void onResponse(long id, Object result) { public void run() {
int answer = (Integer) result; usernameOk = false;
if (answer != 0) { displayError(usernameOk, usernameError, usernameEdit, LinphoneManager.getInstance().getContext().getString(R.string.wizard_server_unavailable));
mHandler.post(runNotOk); createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk);
}
else {
mHandler.post(runOk);
}
}
public void onError(long id, XMLRPCException error) {
mHandler.post(runNotReachable);
}
public void onServerError(long id, XMLRPCServerException error) {
mHandler.post(runNotReachable);
} }
}; };
client.callAsync(listener, "check_account", username); LinphoneXmlRpcRequest xmlRpcRequest = new LinphoneXmlRpcRequestImpl("check_account", LinphoneXmlRpcRequest.ArgType.Int);
xmlRpcRequest.setListener(new LinphoneXmlRpcRequestListener() {
@Override
public void onXmlRpcRequestResponse(LinphoneXmlRpcRequest request) {
if (request.getStatus() == LinphoneXmlRpcRequest.Status.Ok) {
int response = request.getIntResponse();
if (response != 0) {
mHandler.post(runNotOk);
} else {
mHandler.post(runOk);
} }
catch(Exception ex) { } else if (request.getStatus() == LinphoneXmlRpcRequest.Status.Failed) {
mHandler.post(runNotReachable); mHandler.post(runNotReachable);
} }
} }
});
xmlRpcRequest.addStringArg(username);
xmlRpcSession.sendRequest(xmlRpcRequest);
}
private boolean isEmailCorrect(String email) { private boolean isEmailCorrect(String email) {
Pattern emailPattern = Patterns.EMAIL_ADDRESS; Pattern emailPattern = Patterns.EMAIL_ADDRESS;
@ -216,53 +198,43 @@ public class CreateAccountFragment extends Fragment {
} }
private void createAccount(final String username, final String password, String email, boolean suscribe) { private void createAccount(final String username, final String password, String email, boolean suscribe) {
final Runnable runNotReachable = new Runnable() { final Runnable runNotOk = new Runnable() {
public void run() {
//TODO errorMessage.setText(R.string.wizard_server_unavailable);
}
};
final Context context = AssistantActivity.instance() == null ? LinphoneService.instance().getApplicationContext() : AssistantActivity.instance();
try {
XMLRPCClient client = new XMLRPCClient(new URL(context.getString(R.string.wizard_url)));
XMLRPCCallback listener = new XMLRPCCallback() {
Runnable runNotOk = new Runnable() {
public void run() { public void run() {
//TODO errorMessage.setText(R.string.wizard_failed); //TODO errorMessage.setText(R.string.wizard_failed);
} }
}; };
final Runnable runOk = new Runnable() {
Runnable runOk = new Runnable() {
public void run() { public void run() {
AssistantActivity.instance().displayAssistantConfirm(username, password); AssistantActivity.instance().displayAssistantConfirm(username, password);
} }
}; };
final Runnable runNotReachable = new Runnable() {
public void run() {
//TODO errorMessage.setText(R.string.wizard_not_reachable);
}
};
public void onResponse(long id, Object result) { LinphoneXmlRpcRequest xmlRpcRequest = new LinphoneXmlRpcRequestImpl("create_account_with_useragent", LinphoneXmlRpcRequest.ArgType.Int);
int answer = (Integer) result; xmlRpcRequest.setListener(new LinphoneXmlRpcRequestListener() {
if (answer != 0) { @Override
public void onXmlRpcRequestResponse(LinphoneXmlRpcRequest request) {
if (request.getStatus() == LinphoneXmlRpcRequest.Status.Ok) {
int response = request.getIntResponse();
if (response != 0) {
mHandler.post(runNotOk); mHandler.post(runNotOk);
} else { } else {
mHandler.post(runOk); mHandler.post(runOk);
} }
} } else if (request.getStatus() == LinphoneXmlRpcRequest.Status.Failed) {
public void onError(long id, XMLRPCException error) {
mHandler.post(runNotReachable); mHandler.post(runNotReachable);
} }
public void onServerError(long id, XMLRPCServerException error) {
mHandler.post(runNotReachable);
}
};
client.callAsync(listener, "create_account_with_useragent", username, password, email, LinphoneManager.getInstance().getUserAgent());
}
catch(Exception ex) {
mHandler.post(runNotReachable);
} }
});
xmlRpcRequest.addStringArg(username);
xmlRpcRequest.addStringArg(password);
xmlRpcRequest.addStringArg(email);
xmlRpcRequest.addStringArg(LinphoneManager.getInstance().getUserAgent());
xmlRpcSession.sendRequest(xmlRpcRequest);
} }
private void addXMLRPCUsernameHandler(final EditText field, final ImageView icon) { private void addXMLRPCUsernameHandler(final EditText field, final ImageView icon) {

View file

@ -19,35 +19,37 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
import java.net.URL;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.LinphoneCore.EcCalibratorStatus;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.EcCalibratorStatus;
import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.core.LinphoneXmlRpcRequest;
import org.linphone.core.LinphoneXmlRpcRequest.LinphoneXmlRpcRequestListener;
import org.linphone.core.LinphoneXmlRpcRequestImpl;
import org.linphone.core.LinphoneXmlRpcSession;
import org.linphone.core.LinphoneXmlRpcSessionImpl;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import android.app.Fragment;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.app.Fragment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import de.timroes.axmlrpc.XMLRPCCallback;
import de.timroes.axmlrpc.XMLRPCClient;
import de.timroes.axmlrpc.XMLRPCException;
import de.timroes.axmlrpc.XMLRPCServerException;
/** /**
* @author Ghislain MARY * @author Ghislain MARY
*/ */
public class EchoCancellerCalibrationFragment extends Fragment { public class EchoCancellerCalibrationFragment extends Fragment implements LinphoneXmlRpcRequestListener {
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
private boolean mSendEcCalibrationResult = false; private boolean mSendEcCalibrationResult = false;
private LinphoneCoreListenerBase mListener; private LinphoneCoreListenerBase mListener;
private LinphoneXmlRpcSession xmlRpcSession;
private LinphoneXmlRpcRequest xmlRpcRequest;
private Runnable runFinished;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -56,7 +58,7 @@ public class EchoCancellerCalibrationFragment extends Fragment {
mListener = new LinphoneCoreListenerBase(){ mListener = new LinphoneCoreListenerBase(){
@Override @Override
public void ecCalibrationStatus(LinphoneCore lc,LinphoneCore.EcCalibratorStatus status, int delay_ms, Object data) { public void ecCalibrationStatus(LinphoneCore lc, LinphoneCore.EcCalibratorStatus status, int delay_ms, Object data) {
LinphoneManager.getInstance().routeAudioToReceiver(); LinphoneManager.getInstance().routeAudioToReceiver();
if (mSendEcCalibrationResult) { if (mSendEcCalibrationResult) {
sendEcCalibrationResult(status, delay_ms); sendEcCalibrationResult(status, delay_ms);
@ -65,6 +67,15 @@ public class EchoCancellerCalibrationFragment extends Fragment {
} }
} }
}; };
runFinished = new Runnable() {
public void run() {
AssistantActivity.instance().isEchoCalibrationFinished();
}
};
xmlRpcSession = new LinphoneXmlRpcSessionImpl(LinphoneManager.getLcIfManagerNotDestroyedOrNull(), getString(R.string.wizard_url));
xmlRpcRequest = new LinphoneXmlRpcRequestImpl("add_ec_calibration_result", LinphoneXmlRpcRequest.ArgType.None);
xmlRpcRequest.setListener(this);
try { try {
LinphoneManager.getInstance().startEcCalibration(mListener); LinphoneManager.getInstance().startEcCalibration(mListener);
@ -79,34 +90,19 @@ public class EchoCancellerCalibrationFragment extends Fragment {
mSendEcCalibrationResult = enabled; mSendEcCalibrationResult = enabled;
} }
@Override
public void onXmlRpcRequestResponse(LinphoneXmlRpcRequest request) {
mHandler.post(runFinished);
}
private void sendEcCalibrationResult(EcCalibratorStatus status, int delayMs) { private void sendEcCalibrationResult(EcCalibratorStatus status, int delayMs) {
try {
XMLRPCClient client = new XMLRPCClient(new URL(getString(R.string.wizard_url)));
XMLRPCCallback listener = new XMLRPCCallback() {
Runnable runFinished = new Runnable() {
public void run() {
AssistantActivity.instance().isEchoCalibrationFinished();
}
};
public void onResponse(long id, Object result) {
mHandler.post(runFinished);
}
public void onError(long id, XMLRPCException error) {
mHandler.post(runFinished);
}
public void onServerError(long id, XMLRPCServerException error) {
mHandler.post(runFinished);
}
};
Boolean hasBuiltInEchoCanceler = LinphoneManager.getLc().hasBuiltInEchoCanceler(); Boolean hasBuiltInEchoCanceler = LinphoneManager.getLc().hasBuiltInEchoCanceler();
Log.i("Add echo canceller calibration result: manufacturer=" + Build.MANUFACTURER + " model=" + Build.MODEL + " status=" + status + " delay=" + delayMs + "ms" + " hasBuiltInEchoCanceler " + hasBuiltInEchoCanceler); Log.i("Add echo canceller calibration result: manufacturer=" + Build.MANUFACTURER + " model=" + Build.MODEL + " status=" + status + " delay=" + delayMs + "ms" + " hasBuiltInEchoCanceler " + hasBuiltInEchoCanceler);
client.callAsync(listener, "add_ec_calibration_result", Build.MANUFACTURER, Build.MODEL, status.toString(), delayMs, hasBuiltInEchoCanceler); xmlRpcRequest.addStringArg(Build.MANUFACTURER);
} xmlRpcRequest.addStringArg(Build.MODEL);
catch(Exception ex) {} xmlRpcRequest.addStringArg(status.toString());
xmlRpcRequest.addIntArg(delayMs);
xmlRpcRequest.addIntArg(hasBuiltInEchoCanceler ? 1 : 0);
xmlRpcSession.sendRequest(xmlRpcRequest);
} }
} }

View file

@ -20,9 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.xmlrpc.XmlRpcHelper; import org.linphone.xmlrpc.XmlRpcHelper;
import org.linphone.xmlrpc.XmlRpcListenerBase; import org.linphone.xmlrpc.XmlRpcListenerBase;
@ -32,7 +32,6 @@ import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
/** /**
@ -40,7 +39,6 @@ import android.widget.Toast;
*/ */
public class RemoteProvisioningLoginActivity extends Activity implements OnClickListener { public class RemoteProvisioningLoginActivity extends Activity implements OnClickListener {
private EditText login, password, domain; private EditText login, password, domain;
private ImageView cancel;
private Button connect; private Button connect;
private LinphoneCoreListenerBase mListener; private LinphoneCoreListenerBase mListener;
@ -53,9 +51,6 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick
password = (EditText) findViewById(R.id.assistant_password); password = (EditText) findViewById(R.id.assistant_password);
domain = (EditText) findViewById(R.id.assistant_domain); domain = (EditText) findViewById(R.id.assistant_domain);
//cancel = (ImageView) findViewById(R.id.cancel);
//cancel.setOnClickListener(this);
connect = (Button) findViewById(R.id.assistant_connect); connect = (Button) findViewById(R.id.assistant_connect);
connect.setOnClickListener(this); connect.setOnClickListener(this);
@ -86,8 +81,6 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick
} }
private boolean storeAccount(String username, String password, String domain) { private boolean storeAccount(String username, String password, String domain) {
LinphoneCore lc = LinphoneManager.getLc();
XmlRpcHelper xmlRpcHelper = new XmlRpcHelper(); XmlRpcHelper xmlRpcHelper = new XmlRpcHelper();
xmlRpcHelper.getRemoteProvisioningFilenameAsync(new XmlRpcListenerBase() { xmlRpcHelper.getRemoteProvisioningFilenameAsync(new XmlRpcListenerBase() {
@Override @Override

View file

@ -36,6 +36,7 @@ import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.media.AudioManager; import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
import android.os.PowerManager;
import android.preference.Preference; import android.preference.Preference;
import android.provider.Settings; import android.provider.Settings;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
@ -344,4 +345,13 @@ public class Compatibility {
} }
return true; return true;
} }
@SuppressWarnings("deprecation")
public static boolean isScreenOn(PowerManager pm) {
if (Version.sdkAboveOrEqual(20)) {
return pm.isInteractive();
} else {
return pm.isScreenOn();
}
}
} }

View file

@ -43,19 +43,22 @@ public class GCMService extends GCMBaseIntentService {
} }
@Override private void initLogger(Context context) {
protected void onError(Context context, String errorId) { LinphonePreferences.instance().setContext(context);
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
LinphoneCoreFactory.instance().enableLogCollection(isDebugEnabled); LinphoneCoreFactory.instance().enableLogCollection(isDebugEnabled);
LinphoneCoreFactory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name)); LinphoneCoreFactory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
}
@Override
protected void onError(Context context, String errorId) {
initLogger(context);
Log.e("Error while registering push notification : " + errorId); Log.e("Error while registering push notification : " + errorId);
} }
@Override @Override
protected void onMessage(Context context, Intent intent) { protected void onMessage(Context context, Intent intent) {
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); initLogger(context);
LinphoneCoreFactory.instance().enableLogCollection(isDebugEnabled);
LinphoneCoreFactory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
Log.d("Push notification received"); Log.d("Push notification received");
if (!LinphoneService.isReady()) { if (!LinphoneService.isReady()) {
@ -70,15 +73,12 @@ public class GCMService extends GCMBaseIntentService {
} }
} }
}); });
} }
} }
@Override @Override
protected void onRegistered(Context context, String regId) { protected void onRegistered(Context context, String regId) {
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); initLogger(context);
LinphoneCoreFactory.instance().enableLogCollection(isDebugEnabled);
LinphoneCoreFactory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
Log.d("Registered push notification : " + regId); Log.d("Registered push notification : " + regId);
LinphonePreferences.instance().setPushNotificationRegistrationID(regId); LinphonePreferences.instance().setPushNotificationRegistrationID(regId);
@ -86,9 +86,7 @@ public class GCMService extends GCMBaseIntentService {
@Override @Override
protected void onUnregistered(Context context, String regId) { protected void onUnregistered(Context context, String regId) {
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); initLogger(context);
LinphoneCoreFactory.instance().enableLogCollection(isDebugEnabled);
LinphoneCoreFactory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
Log.w("Unregistered push notification : " + regId); Log.w("Unregistered push notification : " + regId);
LinphonePreferences.instance().setPushNotificationRegistrationID(null); LinphonePreferences.instance().setPushNotificationRegistrationID(null);

View file

@ -39,7 +39,6 @@ import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;

View file

@ -339,7 +339,8 @@ public class InAppPurchaseHelper {
} }
private Purchasable verifySignature(String payload, String signature) { private Purchasable verifySignature(String payload, String signature) {
XmlRpcHelper helper = new XmlRpcHelper(); // TODO FIXME rework to be async
/*XmlRpcHelper helper = new XmlRpcHelper();
if (helper.verifySignature(payload, signature)) { if (helper.verifySignature(payload, signature)) {
try { try {
JSONObject json = new JSONObject(payload); JSONObject json = new JSONObject(payload);
@ -350,7 +351,7 @@ public class InAppPurchaseHelper {
} catch (JSONException e) { } catch (JSONException e) {
Log.e(e); Log.e(e);
} }
} }*/
return null; return null;
} }

View file

@ -29,7 +29,6 @@ import java.util.Map.Entry;
import org.linphone.LinphoneActivity; import org.linphone.LinphoneActivity;
import org.linphone.LinphoneContact; import org.linphone.LinphoneContact;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
import org.linphone.LinphoneUtils; import org.linphone.LinphoneUtils;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.LinphoneBuffer; import org.linphone.core.LinphoneBuffer;

View file

@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
package org.linphone.ui; package org.linphone.ui;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.CallDirection; import org.linphone.core.CallDirection;
import org.linphone.core.LinphoneCallLog; import org.linphone.core.LinphoneCallLog;
@ -54,7 +55,7 @@ public class CallButton extends ImageView implements OnClickListener, AddressAwa
if (mAddress.getText().length() > 0) { if (mAddress.getText().length() > 0) {
LinphoneManager.getInstance().newOutgoingCall(mAddress); LinphoneManager.getInstance().newOutgoingCall(mAddress);
} else { } else {
if (getContext().getResources().getBoolean(R.bool.call_last_log_if_adress_is_empty)) { if (LinphonePreferences.instance().isBisFeatureEnabled()) {
LinphoneCallLog[] logs = LinphoneManager.getLc().getCallLogs(); LinphoneCallLog[] logs = LinphoneManager.getLc().getCallLogs();
LinphoneCallLog log = null; LinphoneCallLog log = null;
for (LinphoneCallLog l : logs) { for (LinphoneCallLog l : logs) {

View file

@ -26,6 +26,7 @@ public class LinphoneOverlay extends org.linphone.mediastream.video.display.GL2J
private float y; private float y;
private float touchX; private float touchX;
private float touchY; private float touchY;
private boolean dragEnabled;
private AndroidVideoWindowImpl androidVideoWindowImpl; private AndroidVideoWindowImpl androidVideoWindowImpl;
public LinphoneOverlay(Context context, AttributeSet attrs, int defStyle) { public LinphoneOverlay(Context context, AttributeSet attrs, int defStyle) {
@ -71,6 +72,13 @@ public class LinphoneOverlay extends org.linphone.mediastream.video.display.GL2J
context.startActivity(intent); context.startActivity(intent);
} }
}); });
setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
dragEnabled = true;
return true;
}
});
} }
public LinphoneOverlay(Context context, AttributeSet attrs) { public LinphoneOverlay(Context context, AttributeSet attrs) {
@ -95,11 +103,14 @@ public class LinphoneOverlay extends org.linphone.mediastream.video.display.GL2J
touchY = event.getY(); touchY = event.getY();
break; break;
case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_MOVE:
if (dragEnabled) {
updateViewPostion(); updateViewPostion();
}
break; break;
case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
touchX = touchY = 0; touchX = touchY = 0;
dragEnabled = false;
break; break;
default: default:
break; break;

View file

@ -1,7 +1,5 @@
package org.linphone.ui; package org.linphone.ui;
import org.linphone.R;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;

View file

@ -70,7 +70,7 @@ public class PreferencesListFragment extends ListFragment {
} }
// Must be provided // Must be provided
public PreferencesListFragment(){ public PreferencesListFragment() {
} }
@ -123,7 +123,7 @@ public class PreferencesListFragment extends ListFragment {
m.setAccessible(true); m.setAccessible(true);
m.invoke(mPreferenceManager); m.invoke(mPreferenceManager);
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] onStop " + e);
} }
} }
@ -136,7 +136,7 @@ public class PreferencesListFragment extends ListFragment {
m.setAccessible(true); m.setAccessible(true);
m.invoke(mPreferenceManager); m.invoke(mPreferenceManager);
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] onDestroy " + e);
} }
} }
@ -154,7 +154,7 @@ public class PreferencesListFragment extends ListFragment {
m.setAccessible(true); m.setAccessible(true);
m.invoke(mPreferenceManager, requestCode, resultCode, data); m.invoke(mPreferenceManager, requestCode, resultCode, data);
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] onActivityResult " + e);
} }
} }
@ -188,7 +188,7 @@ public class PreferencesListFragment extends ListFragment {
PreferenceManager preferenceManager = c.newInstance(this.getActivity(), FIRST_REQUEST_CODE); PreferenceManager preferenceManager = c.newInstance(this.getActivity(), FIRST_REQUEST_CODE);
return preferenceManager; return preferenceManager;
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] onCreatePreferenceManager " + e);
return null; return null;
} }
} }
@ -215,7 +215,7 @@ public class PreferencesListFragment extends ListFragment {
postBindPreferences(); postBindPreferences();
} }
}catch(Exception e){ }catch(Exception e){
Log.e(e); Log.e("[PreferencesListFragment] setPreferenceScreen " + e);
} }
} }
@ -231,7 +231,7 @@ public class PreferencesListFragment extends ListFragment {
m.setAccessible(true); m.setAccessible(true);
return (PreferenceScreen) m.invoke(mPreferenceManager); return (PreferenceScreen) m.invoke(mPreferenceManager);
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] getPreferenceScreen " + e);
} }
return null; return null;
@ -250,7 +250,7 @@ public class PreferencesListFragment extends ListFragment {
PreferenceScreen prefScreen = (PreferenceScreen) m.invoke(mPreferenceManager, getActivity(), preferencesResId, getPreferenceScreen()); PreferenceScreen prefScreen = (PreferenceScreen) m.invoke(mPreferenceManager, getActivity(), preferencesResId, getPreferenceScreen());
setPreferenceScreen(prefScreen); setPreferenceScreen(prefScreen);
} catch(Exception e) { } catch(Exception e) {
Log.e(e); Log.e("[PreferencesListFragment] addPreferencesFromResource " + e);
} }
} }
@ -263,6 +263,7 @@ public class PreferencesListFragment extends ListFragment {
*/ */
public Preference findPreference(CharSequence key) { public Preference findPreference(CharSequence key) {
if (mPreferenceManager == null) { if (mPreferenceManager == null) {
Log.e("[PreferencesListFragment] PreferenceManager is null !");
return null; return null;
} }
return mPreferenceManager.findPreference(key); return mPreferenceManager.findPreference(key);

View file

@ -160,6 +160,7 @@ public class SlidingDrawer extends ViewGroup {
* @param defStyle * @param defStyle
* The style to apply to this widget. * The style to apply to this widget.
*/ */
@SuppressWarnings("deprecation")
public SlidingDrawer(Context context, AttributeSet attrs, int defStyle) { public SlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, TypedArray a = context.obtainStyledAttributes(attrs,

File diff suppressed because it is too large Load diff

@ -1 +1 @@
Subproject commit cedccbe75ca28f1a7f5ab953d652511b46804fa4 Subproject commit 2b6e15cddcd3e4480161b3a5a3b3af77317cefd5

@ -1 +1 @@
Subproject commit fa1dbedef5e69cb304dbf77463b05376618795b4 Subproject commit d892c1c397370d26e646a412d5df6bd5fb103a88

@ -1 +0,0 @@
Subproject commit c47eaa453fb75d55d32304413672c16706af85e0

@ -1 +1 @@
Subproject commit d0c6e9766c86fca904db40c17f78cf00eb0e8c0c Subproject commit 2974b7ef419876105d6142750b4dbb40723e8a87