Merge branch 'dev_group_chat' of git.linphone.org:linphone-android into dev_qrcode

This commit is contained in:
Erwan Croze 2018-05-18 14:55:09 +02:00
commit 97c533fc67
87 changed files with 761 additions and 428 deletions

2
.gitmodules vendored
View file

@ -46,7 +46,7 @@
url = git://git.linphone.org/belle-sip.git url = git://git.linphone.org/belle-sip.git
[submodule "submodules/externals/libxml2"] [submodule "submodules/externals/libxml2"]
path = submodules/externals/libxml2 path = submodules/externals/libxml2
url = git://git.gnome.org/libxml2.git url = https://github.com/GNOME/libxml2.git
ignore = dirty ignore = dirty
[submodule "submodules/externals/libupnp"] [submodule "submodules/externals/libupnp"]
path = submodules/externals/libupnp path = submodules/externals/libupnp

View file

@ -2,17 +2,13 @@
<manifest package="org.linphone" <manifest package="org.linphone"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto" android:installLocation="auto"
android:versionCode="3993" android:versionCode="3995"
android:versionName="3.99.2"> android:versionName="3.99.4">
<uses-sdk <uses-sdk
android:minSdkVersion="16" android:minSdkVersion="16"
android:targetSdkVersion="26"/> android:targetSdkVersion="26"/>
<!-- Permissions for Push Notification -->
<!-- <uses-permission android:name="org.linphone.permission.C2D_MESSAGE"/> GCM permission -->
<!-- Change package ! -->
<!-- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> GCM permission -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/>
@ -266,24 +262,6 @@
<action android:name="android.intent.action.NEW_OUTGOING_CALL" /> <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- Needed for push notification -->
<!--
<receiver
android:name=".gcm.GCMReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="org.linphone"/>
-->
<!-- Change package ! -->
<!--
</intent-filter>
</receiver>
<service android:name=".gcm.GCMService"/>
-->
<receiver <receiver
android:name=".receivers.AccountEnableReceiver" android:name=".receivers.AccountEnableReceiver"

View file

@ -19,7 +19,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.android.tools.build:gradle:3.1.0'
if (googleFile.exists()) { if (googleFile.exists()) {
classpath 'com.google.gms:google-services:3.1.0' classpath 'com.google.gms:google-services:3.1.0'
} }
@ -38,18 +38,16 @@ allprojects {
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
dependencies { dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:+') { androidTestImplementation('com.android.support.test.espresso:espresso-core:+') {
exclude module: 'support-annotations' exclude module: 'support-annotations'
} }
androidTestCompile 'com.jayway.android.robotium:robotium-solo:+' androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.6.3'
androidTestCompile 'junit:junit:+' androidTestImplementation 'junit:junit:4.12'
compile 'org.apache.commons:commons-compress:+' implementation 'org.apache.commons:commons-compress:1.16.1'
if (firebaseEnable()) { if (firebaseEnable()) {
compile 'com.google.firebase:firebase-messaging:11.+' implementation 'com.google.firebase:firebase-messaging:15.0.2'
} else {
compile fileTree(include: 'gcm.jar', dir: 'libs')
compile 'com.android.support:support-v4:26.0.1'
} }
implementation 'com.android.support:support-v4:26.0.1'
} }
if (firebaseEnable()) { if (firebaseEnable()) {
@ -84,7 +82,6 @@ excludePackage.add('**/LICENSE.txt')
android { android {
defaultConfig { defaultConfig {
compileSdkVersion 26 compileSdkVersion 26
buildToolsVersion "26.0.1"
applicationId getPackageName() applicationId getPackageName()
multiDexEnabled true multiDexEnabled true
@ -165,6 +162,7 @@ android {
packagingOptions { packagingOptions {
pickFirst 'META-INF/NOTICE' pickFirst 'META-INF/NOTICE'
pickFirst 'META-INF/LICENSE' pickFirst 'META-INF/LICENSE'
pickFirst 'META-INF/MANIFEST.MF'
} }
} }

View file

@ -1,6 +1,6 @@
#Tue Aug 29 16:02:50 CEST 2017 #Wed May 16 15:22:42 CEST 2018
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip

View file

@ -8,7 +8,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.android.tools.build:gradle:3.1.0'
} }
} }
@ -28,8 +28,8 @@ configurations {
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
dependencies { dependencies {
compile group: 'org.apache.commons', name: 'commons-compress', version: '+' compile 'org.apache.commons:commons-compress:1.16.1'
javadocDeps group: 'org.apache.commons', name: 'commons-compress', version: '+' javadocDeps 'org.apache.commons:commons-compress:1.16.1'
} }
def srcDir = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper'] def srcDir = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper']

View file

@ -29,11 +29,11 @@ allprojects {
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
dependencies { dependencies {
androidTestCompile group: 'org.apache.commons', name: 'commons-compress', version: '+' androidTestCompile 'org.apache.commons:commons-compress:1.16.1'
androidTestCompile group: 'junit', name: 'junit', version: '+' androidTestCompile group: 'junit', name: 'junit', version: '+'
androidTestCompile group: 'com.jayway.android.robotium', name: 'robotium', version: '+' androidTestCompile group: 'com.jayway.android.robotium', name: 'robotium', version: '+'
androidTestCompile fileTree(dir: 'libs', include: 'android-junit-report*.jar') androidTestCompile fileTree(dir: 'libs', include: 'android-junit-report*.jar')
compile group: 'org.apache.commons', name: 'commons-compress', version: '+' compile 'org.apache.commons:commons-compress:1.16.1'
compile group: 'junit', name: 'junit', version: '+' compile group: 'junit', name: 'junit', version: '+'
compile group: 'com.jayway.android.robotium', name: 'robotium-solo', version: '+' compile group: 'com.jayway.android.robotium', name: 'robotium-solo', version: '+'
compile fileTree(dir: 'libs', include: 'android-junit-report*.jar') compile fileTree(dir: 'libs', include: 'android-junit-report*.jar')

Binary file not shown.

View file

@ -14,7 +14,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.android.tools.build:gradle:3.1.0'
if (googleFile.exists()) { if (googleFile.exists()) {
classpath 'com.google.gms:google-services:3.1.0' classpath 'com.google.gms:google-services:3.1.0'
} }
@ -33,12 +33,11 @@ allprojects {
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
dependencies { dependencies {
compile group: 'org.apache.commons', name: 'commons-compress', version: '+' implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
if (firebaseEnable()) { if (firebaseEnable()) {
compile 'com.google.firebase:firebase-messaging:11.2.0' implementation 'com.google.firebase:firebase-messaging:15.0.2'
} else { } else {
compile fileTree(include: 'gcm.jar', dir: 'libs') implementation 'com.android.support:support-v4:26.0.1'
compile 'com.android.support:support-v4:+'
} }
} }
@ -68,7 +67,6 @@ excludePackage.add('**/LICENSE.txt')
android { android {
defaultConfig { defaultConfig {
compileSdkVersion 26 compileSdkVersion 26
buildToolsVersion "26.0.0"
multiDexEnabled true multiDexEnabled true
} }

View file

@ -333,6 +333,18 @@ copy-libs:
\tif test -d "liblinphone-sdk/android-x86/share/linphonej"; then \\ \tif test -d "liblinphone-sdk/android-x86/share/linphonej"; then \\
\t\tcp -R liblinphone-sdk/android-x86/share/linphonej/java/* src/linphone-wrapper; \\ \t\tcp -R liblinphone-sdk/android-x86/share/linphonej/java/* src/linphone-wrapper; \\
\tfi \tfi
\tif test -d "liblinphone-sdk/android-arm/share/belr/grammars"; then \\
\t\tcp liblinphone-sdk/android-arm/share/belr/grammars/cpim_grammar res/raw/; \\
\tfi
\tif test -d "liblinphone-sdk/android-armv7/share/belr/grammars"; then \\
\t\tcp liblinphone-sdk/android-armv7/share/belr/grammars/cpim_grammar res/raw/; \\
\tfi
\tif test -d "liblinphone-sdk/android-arm64/share/belr/grammars"; then \\
\t\tcp liblinphone-sdk/android-arm64/share/belr/grammars/cpim_grammar res/raw/; \\
\tfi
\tif test -d "liblinphone-sdk/android-x86/share/belr/grammars"; then \\
\t\tcp liblinphone-sdk/android-x86/share/belr/grammars/cpim_grammar res/raw/; \\
\tfi
copy-libs-mediastreamer: copy-libs-mediastreamer:
\trm -rf submodules/mediastreamer2/java/libs/armeabi \trm -rf submodules/mediastreamer2/java/libs/armeabi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -64,6 +64,7 @@
<TextView <TextView
android:text="@string/app_name" android:text="@string/app_name"
style="@style/font15" style="@style/font15"
android:visibility="gone"
android:paddingTop="5dp" android:paddingTop="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -20,6 +20,7 @@
<TextView <TextView
android:text="@string/app_name" android:text="@string/app_name"
style="@style/font21" style="@style/font21"
android:visibility="gone"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"

View file

@ -58,6 +58,7 @@
<TextView <TextView
android:text="@string/app_name" android:text="@string/app_name"
style="@style/font22" style="@style/font22"
android:visibility="gone"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"

View file

@ -142,7 +142,6 @@
android:id="@+id/message" android:id="@+id/message"
style="@style/font11" style="@style/font11"
android:autoLink="web" android:autoLink="web"
android:textIsSelectable="true"
android:linksClickable="true" android:linksClickable="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>

View file

@ -26,12 +26,22 @@
android:layout_weight="0.2" android:layout_weight="0.2"
android:padding="18dp"/> android:padding="18dp"/>
<TextView
android:text="@string/imdn_info"
style="@style/font6"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.6"
android:padding="15dp"/>
<ImageView <ImageView
android:visibility="invisible" android:visibility="invisible"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.8" android:layout_weight="0.2"
android:padding="15dp"/> android:padding="15dp"/>
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>
@ -115,6 +125,35 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"/> android:orientation="vertical"/>
<LinearLayout
android:id="@+id/sent_layout_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:background="@color/colorG">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/font28"
android:text="@string/sent"/>
<ImageView
android:visibility="invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:src="@drawable/message_delivered"/>
</LinearLayout>
<LinearLayout
android:id="@+id/sent_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
<LinearLayout <LinearLayout
android:id="@+id/undelivered_layout_header" android:id="@+id/undelivered_layout_header"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -127,7 +166,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/font29" style="@style/font29"
android:text="@string/undelivered"/> android:text="@string/error"/>
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -19,6 +19,7 @@
<TextView <TextView
android:text="@string/app_name" android:text="@string/app_name"
style="@style/font21" style="@style/font21"
android:visibility="gone"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/copy_text"
android:title="@string/copy_text" />
<item android:id="@+id/imdn_infos"
android:title="@string/imdn_info" />
<item android:id="@+id/delete_message"
android:title="@string/delete" />
</menu>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/resend"
android:title="@string/resend" />
<item android:id="@+id/copy_text"
android:title="@string/copy_text" />
<item android:id="@+id/imdn_infos"
android:title="@string/imdn_info" />
<item android:id="@+id/delete_message"
android:title="@string/delete" />
</menu>

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

View file

@ -1,5 +1,3 @@
[sip] [sip]
contact="Linphone Android" <sip:linphone.android@unknown-host> contact="Linphone Android" <sip:linphone.android@unknown-host>
use_info=0 use_info=0

View file

@ -40,10 +40,12 @@ ec_calibrator_cool_tones=1
max_calls=10 max_calls=10
history_max_size=100 history_max_size=100
enable_basic_to_client_group_chat_room_migration=0 enable_basic_to_client_group_chat_room_migration=0
enable_simple_group_chat_message_state=0
aggregate_imdn=1
[app] [app]
activation_code_length=4 activation_code_length=4
prefer_basic_chat_room=0 prefer_basic_chat_room=1
[in-app-purchase] [in-app-purchase]
server_url=https://subscribe.linphone.org:444/inapp.php server_url=https://subscribe.linphone.org:444/inapp.php

View file

@ -58,6 +58,7 @@
<string name="pref_wizard_key">pref_wizard_key</string> <string name="pref_wizard_key">pref_wizard_key</string>
<string name="pref_activated_key">pref_activated_key</string> <string name="pref_activated_key">pref_activated_key</string>
<string name="pref_debug_key">pref_debug_key</string> <string name="pref_debug_key">pref_debug_key</string>
<string name="pref_java_debug_key">pref_java_debug_key</string>
<string name="first_launch_succeeded_once_key">first_launch_succeeded_once_key</string> <string name="first_launch_succeeded_once_key">first_launch_succeeded_once_key</string>
<string name="pref_wifi_only_key">pref_wifi_only_key</string> <string name="pref_wifi_only_key">pref_wifi_only_key</string>
@ -80,6 +81,7 @@
<string name="pref_escape_plus_key">pref_escape_plus_key</string> <string name="pref_escape_plus_key">pref_escape_plus_key</string>
<string name="pref_friendlist_subscribe_key">pref_friendlist_subscribe_key</string> <string name="pref_friendlist_subscribe_key">pref_friendlist_subscribe_key</string>
<string name="pref_link_account_key">pref_link_account_key</string> <string name="pref_link_account_key">pref_link_account_key</string>
<string name="pref_proxy_push_notif_key">pref_proxy_push_notif_key</string>
<string name="pref_echo_cancellation_key">pref_echo_cancellation_key</string> <string name="pref_echo_cancellation_key">pref_echo_cancellation_key</string>
<string name="pref_autostart_key">pref_autostart_key</string> <string name="pref_autostart_key">pref_autostart_key</string>
<string name="pref_enable_outbound_proxy_key">Outbound proxy</string> <string name="pref_enable_outbound_proxy_key">Outbound proxy</string>

View file

@ -196,10 +196,10 @@
<string name="sent">Sent</string> <string name="sent">Sent</string>
<string name="resend">Resend</string> <string name="resend">Resend</string>
<string name="error_opening_file">An error occurs when opening this file.</string> <string name="error_opening_file">An error occurs when opening this file.</string>
<string name="conversation_information">Infos</string> <string name="conversation_information">Info</string>
<string name="administrator">Admin</string> <string name="administrator">Admin</string>
<string name="conversation_subject_hint">Name your group</string> <string name="conversation_subject_hint">Name your group</string>
<string name="chat_room_infos_title">Infos</string> <string name="chat_room_infos_title">Info</string>
<string name="chat_room_infos_admin">Admin</string> <string name="chat_room_infos_admin">Admin</string>
<string name="chat_room_participants">Participants</string> <string name="chat_room_participants">Participants</string>
<string name="chat_room_leave_group">Leave the group</string> <string name="chat_room_leave_group">Leave the group</string>
@ -221,6 +221,7 @@
<string name="chat_room_leave_button">Leave</string> <string name="chat_room_leave_button">Leave</string>
<string name="chat_room_delete_dialog">Do you want to delete and leave the selected conversations?</string> <string name="chat_room_delete_dialog">Do you want to delete and leave the selected conversations?</string>
<string name="separator">:&#160;</string> <string name="separator">:&#160;</string>
<string name="imdn_info">Delivery status</string>
<!-- Status Bar --> <!-- Status Bar -->
<string name="status_connected">Registered</string> <string name="status_connected">Registered</string>
@ -331,6 +332,7 @@
<string name="pref_change_password">Change password</string> <string name="pref_change_password">Change password</string>
<string name="pref_default_account">Use as default</string> <string name="pref_default_account">Use as default</string>
<string name="pref_password_changed">Password changed</string> <string name="pref_password_changed">Password changed</string>
<string name="pref_proxy_push_notif">Allow push notification</string>
<!-- Settings --> <!-- Settings -->
<string name="pref_sipaccounts">SIP Accounts</string> <string name="pref_sipaccounts">SIP Accounts</string>
@ -427,6 +429,7 @@
<string name="pref_advanced_title">Advanced</string> <string name="pref_advanced_title">Advanced</string>
<string name="pref_debug_title">Debug</string> <string name="pref_debug_title">Debug</string>
<string name="pref_debug">Debug</string> <string name="pref_debug">Debug</string>
<string name="pref_java_debug">Use Java logger</string>
<string name="pref_friendlist_subscribe">Friendlist subscribe</string> <string name="pref_friendlist_subscribe">Friendlist subscribe</string>
<string name="pref_background_mode">Background mode</string> <string name="pref_background_mode">Background mode</string>
<string name="pref_animation_enable_title">Enable Animations</string> <string name="pref_animation_enable_title">Enable Animations</string>
@ -521,5 +524,5 @@
<string name="content_title_notification_service">Linphone Service</string> <string name="content_title_notification_service">Linphone Service</string>
<string name="content_title_notification">Linphone Notification</string> <string name="content_title_notification">Linphone Notification</string>
<string name="content_description_conversation_subject">Group chat room subject</string> <string name="content_description_conversation_subject">Group chat room subject</string>
<string name="content_description_conversation_infos">Group chat room infos</string> <string name="content_description_conversation_infos">Group chat room info</string>
</resources> </resources>

View file

@ -103,6 +103,11 @@
android:key="@string/pref_link_account_key" android:key="@string/pref_link_account_key"
android:persistent="false"/> android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_proxy_push_notif"
android:key="@string/pref_proxy_push_notif_key"
android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory

View file

@ -354,6 +354,11 @@
android:key="@string/pref_debug_key" android:key="@string/pref_debug_key"
android:persistent="false"/> android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_java_debug"
android:key="@string/pref_java_debug_key"
android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory

View file

@ -64,7 +64,6 @@ import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.PowerManager.WakeLock; import android.os.PowerManager.WakeLock;
import android.os.Vibrator; import android.os.Vibrator;
import android.preference.CheckBoxPreference;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException; import android.provider.Settings.SettingNotFoundException;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@ -100,7 +99,6 @@ import org.linphone.core.Core.LogCollectionUploadState;
import org.linphone.core.RegistrationState; import org.linphone.core.RegistrationState;
import org.linphone.core.ConfiguringState; import org.linphone.core.ConfiguringState;
import org.linphone.core.CoreException; import org.linphone.core.CoreException;
import org.linphone.core.ErrorInfo;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.CoreListener; import org.linphone.core.CoreListener;
import org.linphone.core.Event; import org.linphone.core.Event;
@ -110,13 +108,13 @@ import org.linphone.core.InfoMessage;
import org.linphone.core.PresenceActivity; import org.linphone.core.PresenceActivity;
import org.linphone.core.ProxyConfig; import org.linphone.core.ProxyConfig;
import org.linphone.core.PublishState; import org.linphone.core.PublishState;
import org.linphone.core.Tunnel;
import org.linphone.core.tools.OpenH264DownloadHelperListener; import org.linphone.core.tools.OpenH264DownloadHelperListener;
import org.linphone.core.PayloadType;
import org.linphone.core.PresenceBasicStatus; import org.linphone.core.PresenceBasicStatus;
import org.linphone.core.PresenceModel; import org.linphone.core.PresenceModel;
import org.linphone.core.Reason; import org.linphone.core.Reason;
import org.linphone.core.SubscriptionState; import org.linphone.core.SubscriptionState;
//import org.linphone.core.TunnelConfig; import org.linphone.core.TunnelConfig;
import org.linphone.core.VersionUpdateCheckResult; import org.linphone.core.VersionUpdateCheckResult;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.mediastream.Version; import org.linphone.mediastream.Version;
@ -237,7 +235,6 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
private final String mRingSoundFile; private final String mRingSoundFile;
private final String mCallLogDatabaseFile; private final String mCallLogDatabaseFile;
private final String mFriendsDatabaseFile; private final String mFriendsDatabaseFile;
private byte[] mUploadingImage;
private Timer mTimer; private Timer mTimer;
private Map<String, Integer> mUnreadChatsPerRoom; private Map<String, Integer> mUnreadChatsPerRoom;
@ -502,13 +499,6 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
String getDisplayedName(); String getDisplayedName();
} }
public interface NewOutgoingCallUiListener {
public void onWrongDestinationAddress();
public void onCannotGetCallParameters();
public void onAlreadyInCall();
}
public void enableCamera(Call call, boolean enable) { public void enableCamera(Call call, boolean enable) {
if (call != null) { if (call != null) {
call.enableCamera(enable); call.enableCamera(enable);
@ -538,17 +528,18 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
if (!mLc.tunnelAvailable()) if (!mLc.tunnelAvailable())
return; return;
/*NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
mLc.tunnelCleanServers(); Tunnel tunnel = mLc.getTunnel();
tunnel.cleanServers();
TunnelConfig config = mPrefs.getTunnelConfig(); TunnelConfig config = mPrefs.getTunnelConfig();
if (config.getHost() != null) { if (config.getHost() != null) {
mLc.tunnelAddServer(config); tunnel.addServer(config);
manageTunnelServer(info); manageTunnelServer(info);
}*/ // TODO FIXME }
} }
private boolean isTunnelNeeded(NetworkInfo info) { private boolean isTunnelNeeded(NetworkInfo info) {
/*if (info == null) { if (info == null) {
Log.i("No connectivity: tunnel should be disabled"); Log.i("No connectivity: tunnel should be disabled");
return false; return false;
} }
@ -563,7 +554,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
&& getString(R.string.tunnel_mode_entry_value_3G_only).equals(pref)) { && getString(R.string.tunnel_mode_entry_value_3G_only).equals(pref)) {
Log.i("need tunnel: 'no wifi' connection"); Log.i("need tunnel: 'no wifi' connection");
return true; return true;
}*/ // TODO FIXME }
return false; return false;
} }
@ -571,19 +562,20 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
private void manageTunnelServer(NetworkInfo info) { private void manageTunnelServer(NetworkInfo info) {
if (mLc == null) return; if (mLc == null) return;
if (!mLc.tunnelAvailable()) return; if (!mLc.tunnelAvailable()) return;
Tunnel tunnel = mLc.getTunnel();
/*Log.i("Managing tunnel"); Log.i("Managing tunnel");
if (isTunnelNeeded(info)) { if (isTunnelNeeded(info)) {
Log.i("Tunnel need to be activated"); Log.i("Tunnel need to be activated");
mLc.tunnelSetMode(Core.TunnelMode.enable); tunnel.setMode(Tunnel.Mode.Enable);
} else { } else {
Log.i("Tunnel should not be used"); Log.i("Tunnel should not be used");
String pref = mPrefs.getTunnelMode(); String pref = mPrefs.getTunnelMode();
mLc.tunnelSetMode(Core.TunnelMode.disable); tunnel.setMode(Tunnel.Mode.Disable);
if (getString(R.string.tunnel_mode_entry_value_auto).equals(pref)) { if (getString(R.string.tunnel_mode_entry_value_auto).equals(pref)) {
mLc.tunnelSetMode(Core.TunnelMode.auto); tunnel.setMode(Tunnel.Mode.Auto);
}
} }
}*/ // TODO FIXME
} }
public synchronized final void destroyCore() { public synchronized final void destroyCore() {
@ -691,11 +683,19 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
Log.i("[Push Notification] Assuming GCM jar is not provided."); Log.i("[Push Notification] Assuming GCM jar is not provided.");
} }
}else if (getString(R.string.push_type).equals("firebase")){ }else if (getString(R.string.push_type).equals("firebase")){
final String refreshedToken = com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken(); try{
Class<?> firebaseClass = Class.forName("com.google.firebase.iid.FirebaseInstanceId");
Object firebaseInstance = firebaseClass.getMethod("getInstance").invoke(null);
final String refreshedToken = (String)firebaseClass.getMethod("getToken").invoke(firebaseInstance);
//final String refreshedToken = com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken();
if (refreshedToken != null) { if (refreshedToken != null) {
Log.i("[Push Notification] current token is: " + refreshedToken); Log.i("[Push Notification] current token is: " + refreshedToken);
LinphonePreferences.instance().setPushNotificationRegistrationID(refreshedToken); LinphonePreferences.instance().setPushNotificationRegistrationID(refreshedToken);
} }
}catch(Exception e){
Log.i("[Push Notification] firebase not available.");
}
} }
} }
@ -1111,9 +1111,9 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
} else { } else {
String subject = cr.getSubject(); String subject = cr.getSubject();
if (contact != null) { if (contact != null) {
LinphoneService.instance().displayGroupChatMessageNotification(subject, cr.getPeerAddress().asString(), contact.getFullName(), contact.getThumbnailUri(), textMessage); LinphoneService.instance().displayGroupChatMessageNotification(subject, cr.getPeerAddress().asStringUriOnly(), contact.getFullName(), contact.getThumbnailUri(), textMessage);
} else { } else {
LinphoneService.instance().displayGroupChatMessageNotification(subject, cr.getPeerAddress().asString(), from.getUsername(), null, textMessage); LinphoneService.instance().displayGroupChatMessageNotification(subject, cr.getPeerAddress().asStringUriOnly(), from.getUsername(), null, textMessage);
} }
} }
} }
@ -1121,6 +1121,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
public void setCurrentChatRoomAddress(Address address) { public void setCurrentChatRoomAddress(Address address) {
mCurrentChatRoomAddress = address; mCurrentChatRoomAddress = address;
LinphoneService.instance().setCurrentlyDisplayedChatRoom(address != null ? address.asStringUriOnly() : null);
} }
@Override @Override
@ -1624,6 +1625,12 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
Log.d("Notify received for event "+eventName); Log.d("Notify received for event "+eventName);
if (content!=null) Log.d("with content "+content.getType()+"/"+content.getSubtype()+" data:"+content.getStringBuffer()); if (content!=null) Log.d("with content "+content.getType()+"/"+content.getSubtype()+" data:"+content.getStringBuffer());
} }
@Override
public void onSubscribeReceived(Core lc, Event lev, String subscribeEvent, Content body) {
}
@Override @Override
public void onPublishStateChanged(Core lc, Event ev, PublishState state) { public void onPublishStateChanged(Core lc, Event ev, PublishState state) {
Log.d("Publish state changed to " + state + " for event name " + ev.getName()); Log.d("Publish state changed to " + state + " for event name " + ev.getName());

View file

@ -38,6 +38,8 @@ import org.linphone.core.NatPolicy;
import org.linphone.core.ProxyConfig; import org.linphone.core.ProxyConfig;
import org.linphone.core.Config; import org.linphone.core.Config;
//import org.linphone.core.TunnelConfig; //import org.linphone.core.TunnelConfig;
import org.linphone.core.Tunnel;
import org.linphone.core.TunnelConfig;
import org.linphone.core.VideoActivationPolicy; import org.linphone.core.VideoActivationPolicy;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.purchase.Purchasable; import org.linphone.purchase.Purchasable;
@ -395,6 +397,7 @@ public class LinphonePreferences {
int port = 0; int port = 0;
if (transport.equals(getString(R.string.pref_transport_udp_key))) { if (transport.equals(getString(R.string.pref_transport_udp_key))) {
proxyAddr.setTransport(TransportType.Udp); proxyAddr.setTransport(TransportType.Udp);
} else if (transport.equals(getString(R.string.pref_transport_tcp_key))) { } else if (transport.equals(getString(R.string.pref_transport_tcp_key))) {
proxyAddr.setTransport(TransportType.Tcp); proxyAddr.setTransport(TransportType.Tcp);
} else if (transport.equals(getString(R.string.pref_transport_tls_key))) { } else if (transport.equals(getString(R.string.pref_transport_tls_key))) {
@ -724,6 +727,20 @@ public class LinphonePreferences {
prxCfg.done(); prxCfg.done();
} }
public void enablePushNotifForProxy(int n, boolean enable) {
ProxyConfig prxCfg = getProxyConfig(n);
prxCfg.edit();
prxCfg.setPushNotificationAllowed(enable);
prxCfg.done();
setPushNotificationEnabled(isPushNotificationEnabled());
}
public boolean isPushNotifEnabledForProxy(int n) {
ProxyConfig prxCfg = getProxyConfig(n);
return prxCfg.isPushNotificationAllowed();
}
public boolean isFriendlistsubscriptionEnabled() { public boolean isFriendlistsubscriptionEnabled() {
return getConfig().getBool("app", "friendlist_subscription_enabled", false); return getConfig().getBool("app", "friendlist_subscription_enabled", false);
} }
@ -1142,15 +1159,24 @@ public class LinphonePreferences {
String appId = getString(R.string.push_sender_id); String appId = getString(R.string.push_sender_id);
if (regId != null && lc.getProxyConfigList().length > 0) { if (regId != null && lc.getProxyConfigList().length > 0) {
for (ProxyConfig lpc : lc.getProxyConfigList()) { for (ProxyConfig lpc : lc.getProxyConfigList()) {
if (!lpc.isPushNotificationAllowed()) {
lpc.edit();
lpc.setContactUriParameters(null);
lpc.done();
if (lpc.getIdentityAddress() != null)
Log.d("Push notif infos removed from proxy config " + lpc.getIdentityAddress().asStringUriOnly());
} else {
String contactInfos = "app-id=" + appId + ";pn-type=" + getString(R.string.push_type) + ";pn-tok=" + regId + ";pn-silent=1"; String contactInfos = "app-id=" + appId + ";pn-type=" + getString(R.string.push_type) + ";pn-tok=" + regId + ";pn-silent=1";
String prevContactParams = lpc.getContactParameters(); String prevContactParams = lpc.getContactParameters();
if (prevContactParams == null || prevContactParams.compareTo(contactInfos)!=0) { if (prevContactParams == null || prevContactParams.compareTo(contactInfos) != 0) {
lpc.edit(); lpc.edit();
lpc.setContactUriParameters(contactInfos); lpc.setContactUriParameters(contactInfos);
lpc.done(); lpc.done();
if (lpc.getIdentityAddress() != null)
Log.d("Push notif infos added to proxy config " + lpc.getIdentityAddress().asStringUriOnly()); Log.d("Push notif infos added to proxy config " + lpc.getIdentityAddress().asStringUriOnly());
} }
} }
}
lc.refreshRegisters(); lc.refreshRegisters();
} }
} else { } else {
@ -1159,6 +1185,7 @@ public class LinphonePreferences {
lpc.edit(); lpc.edit();
lpc.setContactUriParameters(null); lpc.setContactUriParameters(null);
lpc.done(); lpc.done();
if (lpc.getIdentityAddress() != null)
Log.d("Push notif infos removed from proxy config " + lpc.getIdentityAddress().asStringUriOnly()); Log.d("Push notif infos removed from proxy config " + lpc.getIdentityAddress().asStringUriOnly());
} }
lc.refreshRegisters(); lc.refreshRegisters();
@ -1192,14 +1219,22 @@ public class LinphonePreferences {
// Advanced settings // Advanced settings
public void setDebugEnabled(boolean enabled) { public void setDebugEnabled(boolean enabled) {
getConfig().setBool("app", "debug", enabled); getConfig().setBool("app", "debug", enabled);
Factory.instance().enableLogCollection(LogCollectionState.Enabled); LinphoneUtils.initLoggingService(enabled, mContext.getString(R.string.app_name));
Factory.instance().setDebugMode(enabled, getString(R.string.app_name));
} }
public boolean isDebugEnabled() { public boolean isDebugEnabled() {
return getConfig().getBool("app", "debug", false); return getConfig().getBool("app", "debug", false);
} }
public void setJavaLogger(boolean enabled) {
getConfig().setBool("app", "java_logger", enabled);
LinphoneUtils.initLoggingService(isDebugEnabled(), mContext.getString(R.string.app_name));
}
public boolean useJavaLogger() {
return getConfig().getBool("app", "java_logger", false);
}
public void setBackgroundModeEnabled(boolean enabled) { public void setBackgroundModeEnabled(boolean enabled) {
getConfig().setBool("app", "background_mode", enabled); getConfig().setBool("app", "background_mode", enabled);
} }
@ -1257,12 +1292,13 @@ public class LinphonePreferences {
// End of advanced settings // End of advanced settings
// Tunnel settings // Tunnel settings
/*private TunnelConfig tunnelConfig = null; private TunnelConfig tunnelConfig = null;
public TunnelConfig getTunnelConfig() { public TunnelConfig getTunnelConfig() {
if(getLc().tunnelAvailable()) { if(getLc().tunnelAvailable()) {
if(tunnelConfig == null) { Tunnel tunnel = getLc().getTunnel();
TunnelConfig servers[] = getLc().tunnelGetServers(); if (tunnelConfig == null) {
TunnelConfig servers[] = tunnel.getServers();
if(servers.length > 0) { if(servers.length > 0) {
tunnelConfig = servers[0]; tunnelConfig = servers[0];
} else { } else {
@ -1316,7 +1352,7 @@ public class LinphonePreferences {
public void setTunnelMode(String mode) { public void setTunnelMode(String mode) {
getConfig().setString("app", "tunnel", mode); getConfig().setString("app", "tunnel", mode);
LinphoneManager.getInstance().initTunnelFromConf(); LinphoneManager.getInstance().initTunnelFromConf();
}*/ }
// End of tunnel settings // End of tunnel settings
public boolean isProvisioningLoginViewEnabled() { public boolean isProvisioningLoginViewEnabled() {

View file

@ -22,6 +22,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.linphone.activities.LinphoneActivity; import org.linphone.activities.LinphoneActivity;
import org.linphone.compatibility.Compatibility; import org.linphone.compatibility.Compatibility;
@ -32,6 +34,9 @@ import org.linphone.core.Call;
import org.linphone.core.Call.State; import org.linphone.core.Call.State;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.GlobalState; import org.linphone.core.GlobalState;
import org.linphone.core.LogLevel;
import org.linphone.core.LoggingService;
import org.linphone.core.LoggingServiceListener;
import org.linphone.core.RegistrationState; import org.linphone.core.RegistrationState;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.LogCollectionState; import org.linphone.core.LogCollectionState;
@ -64,6 +69,7 @@ import android.os.IBinder;
import android.os.SystemClock; import android.os.SystemClock;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.util.ArrayMap;
import android.view.WindowManager; import android.view.WindowManager;
/** /**
@ -89,7 +95,6 @@ public final class LinphoneService extends Service {
private final static int NOTIF_ID=1; private final static int NOTIF_ID=1;
private final static int INCALL_NOTIF_ID=2; private final static int INCALL_NOTIF_ID=2;
private final static int MESSAGE_NOTIF_ID=3;
private final static int CUSTOM_NOTIF_ID=4; private final static int CUSTOM_NOTIF_ID=4;
private final static int MISSED_NOTIF_ID=5; private final static int MISSED_NOTIF_ID=5;
private final static int SAS_NOTIF_ID=6; private final static int SAS_NOTIF_ID=6;
@ -115,10 +120,8 @@ public final class LinphoneService extends Service {
private Notification mNotif; private Notification mNotif;
private Notification mIncallNotif; private Notification mIncallNotif;
private Notification mMsgNotif;
private Notification mCustomNotif; private Notification mCustomNotif;
private Notification mSasNotif; private Notification mSasNotif;
private int mMsgNotifCount;
private PendingIntent mNotifContentIntent; private PendingIntent mNotifContentIntent;
private String mNotificationTitle; private String mNotificationTitle;
private boolean mDisableRegistrationStatus; private boolean mDisableRegistrationStatus;
@ -128,7 +131,27 @@ public final class LinphoneService extends Service {
private LinphoneOverlay mOverlay; private LinphoneOverlay mOverlay;
private Application.ActivityLifecycleCallbacks activityCallbacks; private Application.ActivityLifecycleCallbacks activityCallbacks;
private class Notified {
int notificationId;
int numberOfUnreadMessage;
}
private HashMap<String, Notified> mChatNotifMap;
private int mLastNotificationId;
public void setCurrentlyDisplayedChatRoom(String address) {
if (address != null) {
resetMessageNotifCount(address);
}
}
private void resetMessageNotifCount(String address) {
Notified notif = mChatNotifMap.get(address);
if (notif != null) {
notif.numberOfUnreadMessage = 0;
mNM.cancel(notif.notificationId);
}
}
/*Believe me or not, but knowing the application visibility state on Android is a nightmare. /*Believe me or not, but knowing the application visibility state on Android is a nightmare.
After two days of hard work I ended with the following class, that does the job more or less reliabily. After two days of hard work I ended with the following class, that does the job more or less reliabily.
@ -241,6 +264,9 @@ public final class LinphoneService extends Service {
if (LinphoneManager.isInstanciated()) if (LinphoneManager.isInstanciated())
LinphoneManager.getInstance().subscribeFriendList(false); LinphoneManager.getInstance().subscribeFriendList(false);
} }
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().enterBackground();
}
} }
protected void onForegroundMode() { protected void onForegroundMode() {
@ -249,6 +275,9 @@ public final class LinphoneService extends Service {
if (LinphoneManager.isInstanciated()) if (LinphoneManager.isInstanciated())
LinphoneManager.getInstance().subscribeFriendList(true); LinphoneManager.getInstance().subscribeFriendList(true);
} }
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().enterForeground();
}
} }
private void setupActivityMonitor(){ private void setupActivityMonitor(){
@ -256,10 +285,6 @@ public final class LinphoneService extends Service {
getApplication().registerActivityLifecycleCallbacks(activityCallbacks = new ActivityMonitor()); getApplication().registerActivityLifecycleCallbacks(activityCallbacks = new ActivityMonitor());
} }
public void resetMessageNotifCount() {
mMsgNotifCount = 0;
}
public boolean displayServiceNotification() { public boolean displayServiceNotification() {
return LinphonePreferences.instance().getServiceNotificationVisibility(); return LinphonePreferences.instance().getServiceNotificationVisibility();
} }
@ -289,6 +314,8 @@ public final class LinphoneService extends Service {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mLastNotificationId = 8; // To not interfere with other notifs ids
mChatNotifMap = new HashMap<String, Notified>();
setupActivityMonitor(); setupActivityMonitor();
// In case restart after a crash. Main in LinphoneActivity // In case restart after a crash. Main in LinphoneActivity
@ -298,8 +325,7 @@ public final class LinphoneService extends Service {
LinphonePreferences.instance().setContext(getBaseContext()); LinphonePreferences.instance().setContext(getBaseContext());
Factory.instance().setLogCollectionPath(getFilesDir().getAbsolutePath()); Factory.instance().setLogCollectionPath(getFilesDir().getAbsolutePath());
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
Factory.instance().enableLogCollection(LogCollectionState.Enabled); LinphoneUtils.initLoggingService(isDebugEnabled, getString(R.string.app_name));
Factory.instance().setDebugMode(isDebugEnabled, getString(R.string.app_name));
// Dump some debugging information to the logs // Dump some debugging information to the logs
Log.i(START_LINPHONE_LOGS); Log.i(START_LINPHONE_LOGS);
@ -582,11 +608,6 @@ public final class LinphoneService extends Service {
notifyWrapper(CUSTOM_NOTIF_ID, mCustomNotif); notifyWrapper(CUSTOM_NOTIF_ID, mCustomNotif);
} }
public void removeCustomNotification() {
mNM.cancel(CUSTOM_NOTIF_ID);
resetIntentLaunchedOnNotificationClick();
}
public void displayGroupChatMessageNotification(String subject, String conferenceAddress, String fromName, Uri fromPictureUri, String message) { public void displayGroupChatMessageNotification(String subject, String conferenceAddress, String fromName, Uri fromPictureUri, String message) {
Intent notifIntent = new Intent(this, LinphoneActivity.class); Intent notifIntent = new Intent(this, LinphoneActivity.class);
notifIntent.putExtra("GoToChat", true); notifIntent.putExtra("GoToChat", true);
@ -594,10 +615,15 @@ public final class LinphoneService extends Service {
PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (mMsgNotif == null) { Notified notif = mChatNotifMap.get(conferenceAddress);
mMsgNotifCount = 1; if (notif != null) {
notif.numberOfUnreadMessage += 1;
} else { } else {
mMsgNotifCount++; notif = new Notified();
notif.numberOfUnreadMessage = 1;
notif.notificationId = mLastNotificationId;
mLastNotificationId += 1;
mChatNotifMap.put(conferenceAddress, notif);
} }
Bitmap bm = null; Bitmap bm = null;
@ -610,10 +636,10 @@ public final class LinphoneService extends Service {
} else { } else {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar); bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar);
} }
mMsgNotif = Compatibility.createMessageNotification(getApplicationContext(), mMsgNotifCount, subject, Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.numberOfUnreadMessage, subject,
getString(R.string.group_chat_notif).replace("%1", fromName).replace("%2", message), bm, notifContentIntent); getString(R.string.group_chat_notif).replace("%1", fromName).replace("%2", message), bm, notifContentIntent);
notifyWrapper(MESSAGE_NOTIF_ID, mMsgNotif); notifyWrapper(notif.notificationId, notification);
} }
public void displayMessageNotification(String fromSipUri, String fromName, Uri fromPictureUri, String message) { public void displayMessageNotification(String fromSipUri, String fromName, Uri fromPictureUri, String message) {
@ -627,10 +653,15 @@ public final class LinphoneService extends Service {
fromName = fromSipUri; fromName = fromSipUri;
} }
if (mMsgNotif == null) { Notified notif = mChatNotifMap.get(fromSipUri);
mMsgNotifCount = 1; if (notif != null) {
notif.numberOfUnreadMessage += 1;
} else { } else {
mMsgNotifCount++; notif = new Notified();
notif.numberOfUnreadMessage = 1;
notif.notificationId = mLastNotificationId;
mLastNotificationId += 1;
mChatNotifMap.put(fromSipUri, notif);
} }
Bitmap bm = null; Bitmap bm = null;
@ -643,9 +674,9 @@ public final class LinphoneService extends Service {
} else { } else {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar); bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar);
} }
mMsgNotif = Compatibility.createMessageNotification(getApplicationContext(), mMsgNotifCount, fromName, message, bm, notifContentIntent); Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.numberOfUnreadMessage, fromName, message, bm, notifContentIntent);
notifyWrapper(MESSAGE_NOTIF_ID, mMsgNotif); notifyWrapper(notif.notificationId, notification);
} }
public void displayInappNotification(String message) { public void displayInappNotification(String message) {
@ -658,11 +689,6 @@ public final class LinphoneService extends Service {
notifyWrapper(NOTIF_ID, mNotif); notifyWrapper(NOTIF_ID, mNotif);
} }
public void removeMessageNotification() {
mNM.cancel(MESSAGE_NOTIF_ID);
resetIntentLaunchedOnNotificationClick();
}
public void displaySasNotification(String sas) { public void displaySasNotification(String sas) {
mSasNotif = Compatibility.createSimpleNotification(getApplicationContext(), mSasNotif = Compatibility.createSimpleNotification(getApplicationContext(),
getString(R.string.zrtp_notification_title), getString(R.string.zrtp_notification_title),
@ -837,7 +863,10 @@ public final class LinphoneService extends Service {
// Make sure our notification is gone. // Make sure our notification is gone.
stopForegroundCompat(NOTIF_ID); stopForegroundCompat(NOTIF_ID);
mNM.cancel(INCALL_NOTIF_ID); mNM.cancel(INCALL_NOTIF_ID);
mNM.cancel(MESSAGE_NOTIF_ID); for (Notified notif : mChatNotifMap.values()) {
mNM.cancel(notif.notificationId);
}
// This will prevent the app from crashing if the service gets killed in background mode // This will prevent the app from crashing if the service gets killed in background mode
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated()) {
@ -857,17 +886,6 @@ public final class LinphoneService extends Service {
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
Log.e(e); Log.e(e);
} }
resetIntentLaunchedOnNotificationClick();
}
private void resetIntentLaunchedOnNotificationClick() {
Intent notifIntent = new Intent(this, incomingReceivedActivity);
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
/*if (mNotif != null) {
mNotif.contentIntent = mNotifContentIntent;
}
notifyWrapper(NOTIF_ID, mNotif);*/
} }
protected void onIncomingReceived() { protected void onIncomingReceived() {

View file

@ -23,11 +23,9 @@ import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentUris; import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.CursorLoader; import android.content.CursorLoader;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
@ -41,38 +39,34 @@ import android.os.Looper;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract; import android.provider.DocumentsContract;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
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 org.linphone.compatibility.Compatibility; import org.linphone.compatibility.Compatibility;
import org.linphone.contacts.ContactsManager; import org.linphone.contacts.ContactsManager;
import org.linphone.core.DialPlan;
import org.linphone.core.AccountCreator; import org.linphone.core.AccountCreator;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.Call; import org.linphone.core.Call;
import org.linphone.core.Call.State; import org.linphone.core.Call.State;
import org.linphone.core.ChatMessage;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.Friend; import org.linphone.core.Friend;
import org.linphone.core.FriendList; import org.linphone.core.FriendList;
import org.linphone.core.LogCollectionState;
import org.linphone.core.LogLevel;
import org.linphone.core.LoggingService;
import org.linphone.core.LoggingServiceListener;
import org.linphone.core.ProxyConfig; import org.linphone.core.ProxyConfig;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.mediastream.video.capture.hwconf.Hacks; import org.linphone.mediastream.video.capture.hwconf.Hacks;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -81,7 +75,6 @@ import java.io.FileOutputStream;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
@ -94,8 +87,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
@ -111,6 +102,39 @@ public final class LinphoneUtils {
} }
public static void initLoggingService(boolean isDebugEnabled, String appName) {
if (!LinphonePreferences.instance().useJavaLogger()) {
Factory.instance().enableLogCollection(LogCollectionState.Enabled);
Factory.instance().setDebugMode(isDebugEnabled, appName);
} else {
Factory.instance().setDebugMode(isDebugEnabled, appName);
Factory.instance().enableLogCollection(LogCollectionState.EnabledWithoutPreviousLogHandler);
Factory.instance().getLoggingService().setListener(new LoggingServiceListener() {
@Override
public void onLogMessageWritten(LoggingService logService, String domain, LogLevel lev, String message) {
switch (lev) {
case Debug:
android.util.Log.d(domain, message);
break;
case Message:
android.util.Log.i(domain, message);
break;
case Warning:
android.util.Log.w(domain, message);
break;
case Error:
android.util.Log.e(domain, message);
break;
case Fatal:
default:
android.util.Log.wtf(domain, message);
break;
}
}
});
}
}
public static void dispatchOnUIThread(Runnable r) { public static void dispatchOnUIThread(Runnable r) {
mHandler.post(r); mHandler.post(r);
} }

View file

@ -730,8 +730,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
} }
LinphoneService.instance().resetMessageNotifCount();
LinphoneService.instance().removeMessageNotification();
LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0); LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0);
displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount());
} }
@ -798,8 +796,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
} }
} }
LinphoneService.instance().resetMessageNotifCount();
LinphoneService.instance().removeMessageNotification();
LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0); LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0);
displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount());
} }
@ -1470,7 +1466,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
} }
Bundle extras = intent.getExtras(); Bundle extras = intent.getExtras();
if (extras != null && extras.getBoolean("GoToChat", false)) { if (extras != null && extras.getBoolean("GoToChat", false)) {
LinphoneService.instance().removeMessageNotification();
String sipUri = extras.getString("ChatContactSipUri"); String sipUri = extras.getString("ChatContactSipUri");
doNotGoToCallActivity = true; doNotGoToCallActivity = true;
displayChat(sipUri, null, null); displayChat(sipUri, null, null);
@ -1478,7 +1473,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
doNotGoToCallActivity = true; doNotGoToCallActivity = true;
changeCurrentFragment(FragmentsAvailable.HISTORY_LIST, null); changeCurrentFragment(FragmentsAvailable.HISTORY_LIST, null);
} else if (extras != null && extras.getBoolean("GoToInapp", false)) { } else if (extras != null && extras.getBoolean("GoToInapp", false)) {
LinphoneService.instance().removeMessageNotification();
doNotGoToCallActivity = true; doNotGoToCallActivity = true;
displayInapp(); displayInapp();
} else if (extras != null && extras.getBoolean("Notification", false)) { } else if (extras != null && extras.getBoolean("Notification", false)) {

View file

@ -1634,7 +1634,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
String.valueOf((int) stats.getUploadBandwidth()) + " kbits/s"); String.valueOf((int) stats.getUploadBandwidth()) + " kbits/s");
if (isVideo) { if (isVideo) {
formatText(edl, getString(R.string.call_stats_estimated_download), formatText(edl, getString(R.string.call_stats_estimated_download),
String.valueOf(0/*(int) stats.getEstimatedDownloadBandwidth()*/) + " kbits/s"); String.valueOf(stats.getEstimatedDownloadBandwidth()) + " kbits/s");
} }
formatText(ice, getString(R.string.call_stats_ice), formatText(ice, getString(R.string.call_stats_ice),
stats.getIceState().toString()); stats.getIceState().toString());

View file

@ -41,11 +41,13 @@ import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
import org.linphone.contacts.ContactAddress; import org.linphone.contacts.ContactAddress;
import org.linphone.contacts.ContactsManager; import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneNumberOrAddress;
import org.linphone.contacts.SearchContactsListAdapter; import org.linphone.contacts.SearchContactsListAdapter;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomListenerStub; import org.linphone.core.ChatRoomListenerStub;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.ProxyConfig; import org.linphone.core.ProxyConfig;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.ui.ContactSelectView; import org.linphone.ui.ContactSelectView;
@ -127,7 +129,9 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mSearchField.addTextChangedListener(new TextWatcher() { mSearchField.addTextChangedListener(new TextWatcher() {
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
if (before > count) {
ContactsManager.getInstance().getMagicSearch().resetSearchCache();
}
} }
@Override @Override
@ -247,12 +251,22 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private int getIndexOfCa(ContactAddress ca, List<ContactAddress> caList) { private int getIndexOfCa(ContactAddress ca, List<ContactAddress> caList) {
for (int i = 0 ; i < caList.size() ; i++) { for (int i = 0 ; i < caList.size() ; i++) {
if (ca.getAddress() != null && ca.getAddress().getUsername() != null) {
if (caList.get(i).getAddressAsDisplayableString().compareTo(ca.getAddressAsDisplayableString()) == 0) if (caList.get(i).getAddressAsDisplayableString().compareTo(ca.getAddressAsDisplayableString()) == 0)
return i; return i;
} else if (ca.getPhoneNumber() != null && caList.get(i).getPhoneNumber() !=null) {
if (ca.getPhoneNumber().compareTo(caList.get(i).getPhoneNumber()) == 0)
return i;
}
} }
return -1; return -1;
} }
private void resetAndResearch() {
ContactsManager.getInstance().getMagicSearch().resetSearchCache();
mSearchAdapter.searchContacts(mSearchField.getText().toString(), mContactsList);
}
private void addSelectedContactAddress(ContactAddress ca) { private void addSelectedContactAddress(ContactAddress ca) {
View viewContact = LayoutInflater.from(LinphoneActivity.instance()).inflate(R.layout.contact_selected, null); View viewContact = LayoutInflater.from(LinphoneActivity.instance()).inflate(R.layout.contact_selected, null);
if (ca.getContact() != null) { if (ca.getContact() != null) {
@ -321,6 +335,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mLinphoneContactsButton.setEnabled(true); mLinphoneContactsButton.setEnabled(true);
mLinphoneContactsSelected.setVisibility(View.INVISIBLE); mLinphoneContactsSelected.setVisibility(View.INVISIBLE);
updateList(); updateList();
resetAndResearch();
} else if (id == R.id.linphone_contacts) { } else if (id == R.id.linphone_contacts) {
mSearchAdapter.setOnlySipContact(true); mSearchAdapter.setOnlySipContact(true);
mLinphoneContactsSelected.setVisibility(View.VISIBLE); mLinphoneContactsSelected.setVisibility(View.VISIBLE);
@ -328,6 +343,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mAllContactsButton.setEnabled(mOnlyDisplayLinphoneContacts = true); mAllContactsButton.setEnabled(mOnlyDisplayLinphoneContacts = true);
mAllContactsSelected.setVisibility(View.INVISIBLE); mAllContactsSelected.setVisibility(View.INVISIBLE);
updateList(); updateList();
resetAndResearch();
} else if (id == R.id.back) { } else if (id == R.id.back) {
if (LinphoneActivity.instance().isTablet()) { if (LinphoneActivity.instance().isTablet()) {
LinphoneActivity.instance().goToChatList(); LinphoneActivity.instance().goToChatList();
@ -346,7 +362,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
if (chatRoom == null) { if (chatRoom == null) {
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true);
mChatRoom.addListener(mChatRoomCreationListener); mChatRoom.addListener(mChatRoomCreationListener);
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {

View file

@ -159,6 +159,11 @@ public class ChatEventsAdapter extends ListSelectionAdapter {
return i; return i;
} }
public void removeItem(int i) {
mHistory.remove(i);
notifyDataSetChanged();
}
@Override @Override
public View getView(int i, View view, ViewGroup viewGroup) { public View getView(int i, View view, ViewGroup viewGroup) {
ChatBubbleViewHolder holder; ChatBubbleViewHolder holder;
@ -183,7 +188,6 @@ public class ChatEventsAdapter extends ListSelectionAdapter {
holder.messageStatus.setVisibility(View.INVISIBLE); holder.messageStatus.setVisibility(View.INVISIBLE);
holder.messageSendingInProgress.setVisibility(View.GONE); holder.messageSendingInProgress.setVisibility(View.GONE);
holder.imdmLayout.setVisibility(View.INVISIBLE); holder.imdmLayout.setVisibility(View.INVISIBLE);
holder.imdmLabel.setOnClickListener(null);
holder.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); holder.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
if (isEditionEnabled()) { if (isEditionEnabled()) {
@ -240,24 +244,12 @@ public class ChatEventsAdapter extends ListSelectionAdapter {
holder.imdmIcon.setImageResource(R.drawable.chat_error); holder.imdmIcon.setImageResource(R.drawable.chat_error);
holder.imdmLabel.setText(R.string.error); holder.imdmLabel.setText(R.string.error);
holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI)); holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI));
holder.imdmLabel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO resend message
}
});
} else if (status == ChatMessage.State.FileTransferError) { } else if (status == ChatMessage.State.FileTransferError) {
holder.imdmLayout.setVisibility(View.VISIBLE); holder.imdmLayout.setVisibility(View.VISIBLE);
holder.imdmIcon.setImageResource(R.drawable.chat_error); holder.imdmIcon.setImageResource(R.drawable.chat_error);
holder.imdmLabel.setText(R.string.file_transfer_error); holder.imdmLabel.setText(R.string.file_transfer_error);
holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI)); holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI));
} }
holder.imdmLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinphoneActivity.instance().goToChatMessageImdnInfos(mFragment.getRemoteSipUri(), message.getMessageId());
}
});
if (isEditionEnabled()) { if (isEditionEnabled()) {
layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId()); layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId());

View file

@ -22,6 +22,9 @@ package org.linphone.chat;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.Fragment; import android.app.Fragment;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
@ -33,12 +36,16 @@ import android.os.Parcelable;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
@ -152,7 +159,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
String displayName = LinphoneUtils.getAddressDisplayName(a); String displayName = LinphoneUtils.getAddressDisplayName(a);
c.setFullName(displayName); c.setFullName(displayName);
} }
ContactAddress ca = new ContactAddress(c, a.asString(), c.isFriend(), p.isAdmin()); ContactAddress ca = new ContactAddress(c, a.asString(), "", c.isFriend(), p.isAdmin());
participants.add(ca); participants.add(ca);
} }
LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false); LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false);
@ -206,6 +213,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mRemoteComposing = view.findViewById(R.id.remote_composing); mRemoteComposing = view.findViewById(R.id.remote_composing);
mChatEventsList = view.findViewById(R.id.chat_message_list); mChatEventsList = view.findViewById(R.id.chat_message_list);
registerForContextMenu(mChatEventsList);
return view; return view;
} }
@ -320,6 +328,70 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
} }
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
EventLog event = (EventLog) mEventsAdapter.getItem(info.position);
if (event.getType() != EventLog.Type.ConferenceChatMessage) {
return;
}
MenuInflater inflater = getActivity().getMenuInflater();
ChatMessage message = event.getChatMessage();
if (message.getState() == ChatMessage.State.NotDelivered) {
inflater.inflate(R.menu.chat_bubble_menu_with_resend, menu);
} else {
inflater.inflate(R.menu.chat_bubble_menu, menu);
}
if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) {
// Do not show messages' IDMN state in 1 to 1 chat room as it is already visible in the lower corner of the bubble
menu.removeItem(R.id.imdn_infos);
}
if (!message.hasTextContent()) {
// Do not show copy text option if message doesn't have any text
menu.removeItem(R.id.copy_text);
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
EventLog event = (EventLog) mEventsAdapter.getItem(info.position);
if (event.getType() != EventLog.Type.ConferenceChatMessage) {
return super.onContextItemSelected(item);
}
ChatMessage message = event.getChatMessage();
String messageId = message.getMessageId();
switch(item.getItemId()) {
case R.id.resend:
mEventsAdapter.removeItem(info.position);
message.resend();
return true;
case R.id.imdn_infos:
LinphoneActivity.instance().goToChatMessageImdnInfos(getRemoteSipUri(), messageId);
return true;
case R.id.copy_text:
if (message.hasTextContent()) {
ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Message", message.getTextContent());
clipboard.setPrimaryClip(clip);
}
return true;
case R.id.delete_message:
mChatRoom.deleteMessage(message);
mEventsAdapter.removeItem(info.position);
return true;
default:
return super.onContextItemSelected(item);
}
}
/** /**
* Keyboard management * Keyboard management
*/ */
@ -418,14 +490,14 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
getContactsForParticipants(); getContactsForParticipants();
mRemoteComposing.setVisibility(View.INVISIBLE);
} }
private void displayChatRoomHeader() { private void displayChatRoomHeader() {
Core core = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); Core core = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (core == null || mChatRoom == null) return; if (core == null || mChatRoom == null) return;
mRemoteComposing.setVisibility(View.INVISIBLE);
if (core.getCallsNb() > 0) { if (core.getCallsNb() > 0) {
mBackToCallButton.setVisibility(View.VISIBLE); mBackToCallButton.setVisibility(View.VISIBLE);
} else { } else {
@ -679,6 +751,19 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
} }
/*@Override
public void onAllInformationReceived(ChatRoom cr) {
// Currently flexisip doesn't send the participants list in the INVITE
// So we have to refresh the display when information is available
// In the meantime header will be chatroom-xxxxxxx
if (mChatRoom == null) mChatRoom = cr;
if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) && mChatRoom.getParticipants().length > 0) {
mRemoteParticipantAddress = mChatRoom.getParticipants()[0].getAddress();
}
getContactsForParticipants();
displayChatRoomHeader();
}*/
@Override @Override
public void onChatMessageReceived(ChatRoom cr, EventLog event) { public void onChatMessageReceived(ChatRoom cr, EventLog event) {
cr.markAsRead(); cr.markAsRead();
@ -767,6 +852,16 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
@Override
public void onConferenceJoined(ChatRoom cr, EventLog eventLog) {
}
@Override
public void onConferenceLeft(ChatRoom cr, EventLog eventLog) {
}
@Override @Override
public void onParticipantRemoved(ChatRoom cr, EventLog event) { public void onParticipantRemoved(ChatRoom cr, EventLog event) {
getContactsForParticipants(); getContactsForParticipants();

View file

@ -129,7 +129,7 @@ public class GroupInfoAdapter extends BaseAdapter {
} else if (mChatRoom != null) { } else if (mChatRoom != null) {
boolean found = false; boolean found = false;
for (Participant p : mChatRoom.getParticipants()) { for (Participant p : mChatRoom.getParticipants()) {
if (p.getAddress().asStringUriOnly().equals(ca.getAddress().asStringUriOnly())) { if (p.getAddress().weakEqual(ca.getAddress())) {
found = true; found = true;
break; break;
} }

View file

@ -227,7 +227,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
public void onClick(View view) { public void onClick(View view) {
if (!mIsAlreadyCreatedGroup) { if (!mIsAlreadyCreatedGroup) {
mWaitLayout.setVisibility(View.VISIBLE); mWaitLayout.setVisibility(View.VISIBLE);
mTempChatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString()); mTempChatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString(), mParticipants.size() == 1);
mTempChatRoom.addListener(mChatRoomCreationListener); mTempChatRoom.addListener(mChatRoomCreationListener);
Address addresses[] = new Address[mParticipants.size()]; Address addresses[] = new Address[mParticipants.size()];
@ -249,7 +249,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
for (Participant p : mChatRoom.getParticipants()) { for (Participant p : mChatRoom.getParticipants()) {
boolean found = false; boolean found = false;
for (ContactAddress c : mParticipants) { for (ContactAddress c : mParticipants) {
if (c.getAddress().asStringUriOnly().equals(p.getAddress().asStringUriOnly())) { if (c.getAddress().weakEqual(p.getAddress())) {
found = true; found = true;
break; break;
} }
@ -267,7 +267,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
for (ContactAddress c : mParticipants) { for (ContactAddress c : mParticipants) {
boolean found = false; boolean found = false;
for (Participant p : mChatRoom.getParticipants()) { for (Participant p : mChatRoom.getParticipants()) {
if (p.getAddress().asStringUriOnly().equals(c.getAddress().asStringUriOnly())) { if (p.getAddress().weakEqual(c.getAddress())) {
// Admin rights // Admin rights
if (c.isAdmin() != p.isAdmin()) { if (c.isAdmin() != p.isAdmin()) {
mChatRoom.setParticipantAdminStatus(p, c.isAdmin()); mChatRoom.setParticipantAdminStatus(p, c.isAdmin());
@ -348,7 +348,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
String displayName = LinphoneUtils.getAddressDisplayName(a); String displayName = LinphoneUtils.getAddressDisplayName(a);
c.setFullName(displayName); c.setFullName(displayName);
} }
ContactAddress ca = new ContactAddress(c, a.asString(), c.isFriend(), p.isAdmin()); ContactAddress ca = new ContactAddress(c, a.asString(), "", c.isFriend(), p.isAdmin());
mParticipants.add(ca); mParticipants.add(ca);
} }
@ -448,6 +448,16 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
} }
@Override
public void onConferenceJoined(ChatRoom cr, EventLog eventLog) {
}
@Override
public void onConferenceLeft(ChatRoom cr, EventLog eventLog) {
}
@Override @Override
public void onParticipantDeviceAdded(ChatRoom cr, EventLog event_log) { public void onParticipantDeviceAdded(ChatRoom cr, EventLog event_log) {

View file

@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
package org.linphone.chat; package org.linphone.chat;
import android.app.Fragment; import android.app.Fragment;
import android.media.Image;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.Spanned; import android.text.Spanned;
@ -41,25 +42,29 @@ import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneContact; import org.linphone.contacts.LinphoneContact;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ChatMessage; import org.linphone.core.ChatMessage;
import org.linphone.core.ChatMessageListenerStub;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.ParticipantImdnState;
public class ImdnFragment extends Fragment { public class ImdnFragment extends Fragment {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private LinearLayout mRead, mDelivered, mUndelivered; private LinearLayout mRead, mReadHeader, mDelivered, mDeliveredHeader, mSent, mSentHeader, mUndelivered, mUndeliveredHeader;
private ImageView mBackButton; private ImageView mBackButton;
private ChatBubbleViewHolder mBubble; private ChatBubbleViewHolder mBubble;
private ViewGroup mContainer;
private String mRoomUri, mMessageId; private String mRoomUri, mMessageId;
private Address mRoomAddr; private Address mRoomAddr;
private ChatRoom mRoom; private ChatRoom mRoom;
private ChatMessage mMessage;
private ChatMessageListenerStub mListener;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String roomUri;
if (getArguments() != null) { if (getArguments() != null) {
mRoomUri = getArguments().getString("SipUri"); mRoomUri = getArguments().getString("SipUri");
mRoomAddr = LinphoneManager.getLc().createAddress(mRoomUri); mRoomAddr = LinphoneManager.getLc().createAddress(mRoomUri);
@ -75,6 +80,7 @@ public class ImdnFragment extends Fragment {
} }
mInflater = inflater; mInflater = inflater;
mContainer = container;
View view = mInflater.inflate(R.layout.chat_imdn, container, false); View view = mInflater.inflate(R.layout.chat_imdn, container, false);
mBackButton = view.findViewById(R.id.back); mBackButton = view.findViewById(R.id.back);
@ -91,7 +97,12 @@ public class ImdnFragment extends Fragment {
mRead = view.findViewById(R.id.read_layout); mRead = view.findViewById(R.id.read_layout);
mDelivered = view.findViewById(R.id.delivered_layout); mDelivered = view.findViewById(R.id.delivered_layout);
mSent = view.findViewById(R.id.sent_layout);
mUndelivered = view.findViewById(R.id.undelivered_layout); mUndelivered = view.findViewById(R.id.undelivered_layout);
mReadHeader = view.findViewById(R.id.read_layout_header);
mDeliveredHeader = view.findViewById(R.id.delivered_layout_header);
mSentHeader = view.findViewById(R.id.sent_layout_header);
mUndeliveredHeader = view.findViewById(R.id.undelivered_layout_header);
mBubble = new ChatBubbleViewHolder(view.findViewById(R.id.bubble)); mBubble = new ChatBubbleViewHolder(view.findViewById(R.id.bubble));
mBubble.eventLayout.setVisibility(View.GONE); mBubble.eventLayout.setVisibility(View.GONE);
@ -107,17 +118,44 @@ public class ImdnFragment extends Fragment {
mBubble.imdmLayout.setVisibility(View.INVISIBLE); mBubble.imdmLayout.setVisibility(View.INVISIBLE);
mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
mMessage = mRoom.findMessage(mMessageId);
mListener = new ChatMessageListenerStub() {
@Override
public void onParticipantImdnStateChanged(ChatMessage msg, ParticipantImdnState state) {
refreshInfo();
}
};
mMessage.setListener(mListener);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
layoutParams.setMargins(100, 10, 10, 10); layoutParams.setMargins(100, 10, 10, 10);
if (mMessage.isOutgoing()) {
mBubble.background.setBackgroundResource(R.drawable.resizable_chat_bubble_outgoing); mBubble.background.setBackgroundResource(R.drawable.resizable_chat_bubble_outgoing);
Compatibility.setTextAppearance(mBubble.contactName, getActivity(), R.style.font3); Compatibility.setTextAppearance(mBubble.contactName, getActivity(), R.style.font3);
Compatibility.setTextAppearance(mBubble.fileTransferAction, getActivity(), R.style.font15); Compatibility.setTextAppearance(mBubble.fileTransferAction, getActivity(), R.style.font15);
mBubble.fileTransferAction.setBackgroundResource(R.drawable.resizable_confirm_delete_button); mBubble.fileTransferAction.setBackgroundResource(R.drawable.resizable_confirm_delete_button);
mBubble.contactPictureMask.setImageResource(R.drawable.avatar_chat_mask_outgoing); mBubble.contactPictureMask.setImageResource(R.drawable.avatar_chat_mask_outgoing);
} else {
mBubble.background.setBackgroundResource(R.drawable.resizable_chat_bubble_incoming);
Compatibility.setTextAppearance(mBubble.contactName, getActivity(), R.style.font9);
Compatibility.setTextAppearance(mBubble.fileTransferAction, getActivity(), R.style.font8);
mBubble.fileTransferAction.setBackgroundResource(R.drawable.resizable_assistant_button);
mBubble.contactPictureMask.setImageResource(R.drawable.avatar_chat_mask);
}
ChatMessage message = mRoom.findMessage(mMessageId); return view;
Address remoteSender = message.getFromAddress(); }
@Override
public void onResume() {
super.onResume();
refreshInfo();
}
private void refreshInfo() {
Address remoteSender = mMessage.getFromAddress();
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(remoteSender); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(remoteSender);
String displayName; String displayName;
@ -130,50 +168,123 @@ public class ImdnFragment extends Fragment {
mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
if (contact.hasPhoto()) { if (contact.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), mBubble.contactPicture, contact.getThumbnailUri()); LinphoneUtils.setThumbnailPictureFromUri(getActivity(), mBubble.contactPicture, contact.getThumbnailUri());
} }
} else { } else {
displayName = LinphoneUtils.getAddressDisplayName(remoteSender); displayName = LinphoneUtils.getAddressDisplayName(remoteSender);
mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); mBubble.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
} }
mBubble.contactName.setText(LinphoneUtils.timestampToHumanDate(getActivity(), message.getTime(), R.string.messages_date_format) + " - " + displayName); mBubble.contactName.setText(LinphoneUtils.timestampToHumanDate(getActivity(), mMessage.getTime(), R.string.messages_date_format) + " - " + displayName);
if (message.hasTextContent()) { if (mMessage.hasTextContent()) {
String msg = message.getTextContent(); String msg = mMessage.getTextContent();
Spanned text = LinphoneUtils.getTextWithHttpLinks(msg); Spanned text = LinphoneUtils.getTextWithHttpLinks(msg);
mBubble.messageText.setText(text); mBubble.messageText.setText(text);
mBubble.messageText.setMovementMethod(LinkMovementMethod.getInstance()); mBubble.messageText.setMovementMethod(LinkMovementMethod.getInstance());
mBubble.messageText.setVisibility(View.VISIBLE); mBubble.messageText.setVisibility(View.VISIBLE);
} }
String appData = message.getAppdata(); String appData = mMessage.getAppdata();
if (appData != null) { // Something to display if (appData != null) { // Something to display
mBubble.fileName.setVisibility(View.VISIBLE); mBubble.fileName.setVisibility(View.VISIBLE);
mBubble.fileName.setText(LinphoneUtils.getNameFromFilePath(appData)); mBubble.fileName.setText(LinphoneUtils.getNameFromFilePath(appData));
// We purposely chose not to display the image // We purposely chose not to display the image
} }
// TODO: real values mRead.removeAllViews();
View v = mInflater.inflate(R.layout.chat_imdn_cell, container, false); mDelivered.removeAllViews();
v.findViewById(R.id.separator).setVisibility(View.GONE); mSent.removeAllViews();
((TextView)v.findViewById(R.id.time)).setText("Aujourd'hui - 17h58"); mUndelivered.removeAllViews();
((TextView)v.findViewById(R.id.name)).setText("Albert");
mRead.addView(v);
v = mInflater.inflate(R.layout.chat_imdn_cell, container, false);
((TextView)v.findViewById(R.id.time)).setText("Aujourd'hui - 17h52");
((TextView)v.findViewById(R.id.name)).setText("Charlotte");
mRead.addView(v);
v = mInflater.inflate(R.layout.chat_imdn_cell, container, false);
v.findViewById(R.id.separator).setVisibility(View.GONE);
((TextView)v.findViewById(R.id.time)).setText("Aujourd'hui - 17h36");
((TextView)v.findViewById(R.id.name)).setText("Fabrice");
mDelivered.addView(v);
v = mInflater.inflate(R.layout.chat_imdn_cell, container, false);
v.findViewById(R.id.separator).setVisibility(View.GONE);
((TextView)v.findViewById(R.id.name)).setText("Heloïse");
mUndelivered.addView(v);
// End of todo
return view; ParticipantImdnState[] participants = mMessage.getParticipantsByImdnState(ChatMessage.State.Displayed);
mReadHeader.setVisibility(participants.length == 0 ? View.GONE : View.VISIBLE);
boolean first = true;
for (ParticipantImdnState participant : participants) {
Address address = participant.getParticipant().getAddress();
LinphoneContact participantContact = ContactsManager.getInstance().findContactFromAddress(address);
String participantDisplayName = participantContact != null ? participantContact.getFullName() : LinphoneUtils.getAddressDisplayName(address);
View v = mInflater.inflate(R.layout.chat_imdn_cell, mContainer, false);
v.findViewById(R.id.separator).setVisibility(first ? View.GONE : View.VISIBLE);
((TextView)v.findViewById(R.id.time)).setText(LinphoneUtils.timestampToHumanDate(getActivity(), participant.getStateChangeTime(), R.string.messages_date_format));
((TextView)v.findViewById(R.id.name)).setText(participantDisplayName);
if (participantContact != null && participantContact.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(getActivity(), ((ImageView)v.findViewById(R.id.contact_picture)), participantContact.getThumbnailUri());
} else {
((ImageView)v.findViewById(R.id.contact_picture)).setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
}
mRead.addView(v);
first = false;
}
participants = mMessage.getParticipantsByImdnState(ChatMessage.State.DeliveredToUser);
mDeliveredHeader.setVisibility(participants.length == 0 ? View.GONE : View.VISIBLE);
first = true;
for (ParticipantImdnState participant : participants) {
Address address = participant.getParticipant().getAddress();
LinphoneContact participantContact = ContactsManager.getInstance().findContactFromAddress(address);
String participantDisplayName = participantContact != null ? participantContact.getFullName() : LinphoneUtils.getAddressDisplayName(address);
View v = mInflater.inflate(R.layout.chat_imdn_cell, mContainer, false);
v.findViewById(R.id.separator).setVisibility(first ? View.GONE : View.VISIBLE);
((TextView)v.findViewById(R.id.time)).setText(LinphoneUtils.timestampToHumanDate(getActivity(), participant.getStateChangeTime(), R.string.messages_date_format));
((TextView)v.findViewById(R.id.name)).setText(participantDisplayName);
if (participantContact != null && participantContact.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(getActivity(), ((ImageView)v.findViewById(R.id.contact_picture)), participantContact.getThumbnailUri());
} else {
((ImageView)v.findViewById(R.id.contact_picture)).setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
}
mDelivered.addView(v);
first = false;
}
participants = mMessage.getParticipantsByImdnState(ChatMessage.State.Delivered);
mSentHeader.setVisibility(participants.length == 0 ? View.GONE : View.VISIBLE);
first = true;
for (ParticipantImdnState participant : participants) {
Address address = participant.getParticipant().getAddress();
LinphoneContact participantContact = ContactsManager.getInstance().findContactFromAddress(address);
String participantDisplayName = participantContact != null ? participantContact.getFullName() : LinphoneUtils.getAddressDisplayName(address);
View v = mInflater.inflate(R.layout.chat_imdn_cell, mContainer, false);
v.findViewById(R.id.separator).setVisibility(first ? View.GONE : View.VISIBLE);
((TextView)v.findViewById(R.id.time)).setText(LinphoneUtils.timestampToHumanDate(getActivity(), participant.getStateChangeTime(), R.string.messages_date_format));
((TextView)v.findViewById(R.id.name)).setText(participantDisplayName);
if (participantContact != null && participantContact.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(getActivity(), ((ImageView)v.findViewById(R.id.contact_picture)), participantContact.getThumbnailUri());
} else {
((ImageView)v.findViewById(R.id.contact_picture)).setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
}
mSent.addView(v);
first = false;
}
participants = mMessage.getParticipantsByImdnState(ChatMessage.State.NotDelivered);
mUndeliveredHeader.setVisibility(participants.length == 0 ? View.GONE : View.VISIBLE);
first = true;
for (ParticipantImdnState participant : participants) {
Address address = participant.getParticipant().getAddress();
LinphoneContact participantContact = ContactsManager.getInstance().findContactFromAddress(address);
String participantDisplayName = participantContact != null ? participantContact.getFullName() : LinphoneUtils.getAddressDisplayName(address);
View v = mInflater.inflate(R.layout.chat_imdn_cell, mContainer, false);
v.findViewById(R.id.separator).setVisibility(first ? View.GONE : View.VISIBLE);
((TextView)v.findViewById(R.id.name)).setText(participantDisplayName);
if (participantContact != null && participantContact.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(getActivity(), ((ImageView)v.findViewById(R.id.contact_picture)), participantContact.getThumbnailUri());
} else {
((ImageView)v.findViewById(R.id.contact_picture)).setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
}
mUndelivered.addView(v);
first = false;
}
} }
} }

View file

@ -23,12 +23,15 @@ import android.view.View;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.SearchResult;
import java.io.Serializable; import java.io.Serializable;
public class ContactAddress implements Serializable { public class ContactAddress implements Serializable {
private LinphoneContact contact; private LinphoneContact contact;
private SearchResult result;
private String address; private String address;
private String phoneNumber;
private boolean isLinphoneContact; private boolean isLinphoneContact;
private boolean isSelect = false; private boolean isSelect = false;
private boolean isAdmin = false; private boolean isAdmin = false;
@ -58,13 +61,32 @@ public class ContactAddress implements Serializable {
return contact; return contact;
} }
public SearchResult getResult() {
return result;
}
public void setResult(SearchResult result) {
this.result = result;
}
public String getAddressAsDisplayableString() { public String getAddressAsDisplayableString() {
Address addr = getAddress();
if (addr != null && addr.getUsername() != null) return addr.asStringUriOnly();
return address; return address;
} }
public Address getAddress() { public Address getAddress() {
String presence = contact.getPresenceModelForUriOrTel(address); String presence = contact.getPresenceModelForUriOrTel((phoneNumber != null && !phoneNumber.isEmpty()) ? phoneNumber: address);
return Factory.instance().createAddress(presence != null ? presence : address); Address addr = Factory.instance().createAddress(presence != null ? presence : address);
// Remove the user=phone URI param if existing, it will break everything otherwise
if (addr.hasUriParam("user")) {
addr.removeUriParam("user");
}
return addr;
}
public String getPhoneNumber() {
return phoneNumber;
} }
public void setSelect(boolean select) { public void setSelect(boolean select) {
@ -75,16 +97,19 @@ public class ContactAddress implements Serializable {
return isLinphoneContact; return isLinphoneContact;
} }
public ContactAddress(LinphoneContact c, String a, boolean isLC){ private void init(LinphoneContact c, String a, String pn, boolean isLC) {
this.contact = c; this.contact = c;
this.address = a; this.address = a;
this.phoneNumber = pn;
this.isLinphoneContact = isLC; this.isLinphoneContact = isLC;
} }
public ContactAddress(LinphoneContact c, String a, boolean isLC, boolean isAdmin){ public ContactAddress(LinphoneContact c, String a, String pn, boolean isLC) {
this.contact = c; init(c, a, pn, isLC);
this.address = a; }
this.isLinphoneContact = isLC;
public ContactAddress(LinphoneContact c, String a, String pn, boolean isLC, boolean isAdmin) {
init(c, a, pn, isLC);
this.isAdmin = isAdmin; this.isAdmin = isAdmin;
} }

View file

@ -82,7 +82,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
mWaitLayout.setVisibility(View.VISIBLE); mWaitLayout.setVisibility(View.VISIBLE);
mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true);
mChatRoom.addListener(mChatRoomCreationListener); mChatRoom.addListener(mChatRoomCreationListener);
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {

View file

@ -42,8 +42,10 @@ import org.linphone.LinphoneService;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.Friend; import org.linphone.core.Friend;
import org.linphone.core.FriendList; import org.linphone.core.FriendList;
import org.linphone.core.MagicSearch;
import org.linphone.core.ProxyConfig; import org.linphone.core.ProxyConfig;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
@ -61,6 +63,7 @@ public class ContactsManager extends ContentObserver {
private static ContactsManager instance; private static ContactsManager instance;
private List<LinphoneContact> contacts, sipContacts; private List<LinphoneContact> contacts, sipContacts;
private MagicSearch magicSearch;
private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true; private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true;
private ContentResolver contentResolver; private ContentResolver contentResolver;
private Context context; private Context context;
@ -84,6 +87,9 @@ public class ContactsManager extends ContentObserver {
contactsUpdatedListeners = new ArrayList<ContactsUpdatedListener>(); contactsUpdatedListeners = new ArrayList<ContactsUpdatedListener>();
contacts = new ArrayList<LinphoneContact>(); contacts = new ArrayList<LinphoneContact>();
sipContacts = new ArrayList<LinphoneContact>(); sipContacts = new ArrayList<LinphoneContact>();
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
magicSearch = LinphoneManager.getLcIfManagerNotDestroyedOrNull().createMagicSearch();
}
} }
public void destroy() { public void destroy() {
@ -91,6 +97,10 @@ public class ContactsManager extends ContentObserver {
instance = null; instance = null;
} }
public MagicSearch getMagicSearch() {
return magicSearch;
}
public boolean contactsFetchedOnce() { public boolean contactsFetchedOnce() {
return contacts.size() > 0; return contacts.size() > 0;
} }
@ -220,6 +230,7 @@ public class ContactsManager extends ContentObserver {
} }
public synchronized LinphoneContact findContactFromAddress(Address address) { public synchronized LinphoneContact findContactFromAddress(Address address) {
if (address == null) return null;
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
Friend lf = lc.findFriend(address); Friend lf = lc.findFriend(address);
if (lf != null) { if (lf != null) {
@ -301,6 +312,9 @@ public class ContactsManager extends ContentObserver {
LinphoneContact contact = (LinphoneContact) friend.getUserData(); LinphoneContact contact = (LinphoneContact) friend.getUserData();
if (contact != null) { if (contact != null) {
contact.clearAddresses(); contact.clearAddresses();
if (contact.hasAddress()) {
sipContacts.add(contact);
}
contacts.add(contact); contacts.add(contact);
if (contact.getAndroidId() != null) { if (contact.getAndroidId() != null) {
androidContactsCache.put(contact.getAndroidId(), contact); androidContactsCache.put(contact.getAndroidId(), contact);

View file

@ -33,10 +33,11 @@ import org.linphone.LinphoneUtils;
import org.linphone.R; import org.linphone.R;
import org.linphone.activities.LinphoneActivity; import org.linphone.activities.LinphoneActivity;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ProxyConfig;
import org.linphone.core.SearchResult;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
public class SearchContactsListAdapter extends BaseAdapter { public class SearchContactsListAdapter extends BaseAdapter {
@ -87,8 +88,13 @@ public class SearchContactsListAdapter extends BaseAdapter {
private boolean contactIsSelected(ContactAddress ca) { private boolean contactIsSelected(ContactAddress ca) {
for (ContactAddress c : contactsSelected) { for (ContactAddress c : contactsSelected) {
Address addr = c.getAddress(); Address addr = c.getAddress();
if (addr == null) continue; if (addr.getUsername() != null && ca.getAddress() != null) {
if (addr.asStringUriOnly().compareTo(ca.getAddress().asStringUriOnly()) == 0) return true; if (addr.asStringUriOnly().compareTo(ca.getAddress().asStringUriOnly()) == 0) return true;
} else {
if (c.getPhoneNumber() != null && ca.getPhoneNumber() != null) {
if (c.getPhoneNumber().compareTo(ca.getPhoneNumber()) == 0) return true;
}
}
} }
return false; return false;
} }
@ -122,11 +128,18 @@ public class SearchContactsListAdapter extends BaseAdapter {
for (LinphoneContact contact : contacts) { for (LinphoneContact contact : contacts) {
for (LinphoneNumberOrAddress noa : contact.getNumbersOrAddresses()) { for (LinphoneNumberOrAddress noa : contact.getNumbersOrAddresses()) {
if (!mOnlySipContact || (mOnlySipContact && (noa.isSIPAddress() || contact.getPresenceModelForUriOrTel(noa.getValue()) != null))) { if (!mOnlySipContact || (mOnlySipContact && (noa.isSIPAddress() || contact.getPresenceModelForUriOrTel(noa.getValue()) != null))) {
ContactAddress ca = null;
if (noa.isSIPAddress()) {
Address address = LinphoneManager.getLc().interpretUrl(noa.getValue()); Address address = LinphoneManager.getLc().interpretUrl(noa.getValue());
if (address != null) { if (address != null) {
ContactAddress ca = new ContactAddress(contact, address.asString(), contact.isFriend()); ca = new ContactAddress(contact, address.asString(), "", contact.isFriend());
list.add(ca);
} }
} else {
ProxyConfig prx = LinphoneManager.getLc().getDefaultProxyConfig();
String number = (prx != null) ? prx.normalizePhoneNumber(noa.getValue()) : noa.getValue();
ca = new ContactAddress(contact, "", number, contact.isFriend());
}
if (ca != null) list.add(ca);
} }
} }
} }
@ -156,6 +169,9 @@ public class SearchContactsListAdapter extends BaseAdapter {
if (search == null || search.length() == 0 || search.trim().length() == 0) { if (search == null || search.length() == 0 || search.trim().length() == 0) {
contacts = getContactsList(); contacts = getContactsList();
resultContactsSearch.setAdapter(this); resultContactsSearch.setAdapter(this);
if (ContactsManager.getInstance() != null) {
ContactsManager.getInstance().getMagicSearch().resetSearchCache();
}
oldSize = 0; oldSize = 0;
return; return;
} }
@ -163,28 +179,38 @@ public class SearchContactsListAdapter extends BaseAdapter {
search = search.trim(); search = search.trim();
List<ContactAddress> result = new ArrayList<>(); List<ContactAddress> result = new ArrayList<>();
String searchAddress = "sip:" + search + "@" + LinphoneManager.getLc().getDefaultProxyConfig().getDomain(); String domain = "";
if (search.contains("@") || search.startsWith("sip:")) { ProxyConfig prx = LinphoneManager.getLc().getDefaultProxyConfig();
searchAddress = search; if (prx != null) domain = prx.getDomain();
SearchResult[] results = ContactsManager.getInstance().getMagicSearch().getContactListFromFilter(search, mOnlySipContact ? domain :"");
for (SearchResult sr : results) {
boolean found = false;
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(sr.getAddress());
if (contact == null) {
contact = new LinphoneContact();
if (sr.getFriend() != null) {
contact.setFriend(sr.getFriend());
contact.refresh();
} }
}
boolean searchFound = false; if (sr.getAddress() != null || sr.getPhoneNumber() != null) {
if (search != null) { for (ContactAddress ca : result) {
for (ContactAddress c : (search.length() < oldSize) ? getContactsList() : getContacts()) { String normalizedPhoneNumber = (ca.getPhoneNumber() != null) ? prx.normalizePhoneNumber(ca.getPhoneNumber()) : null;
String address = c.getAddressAsDisplayableString(); if ((sr.getAddress() != null && ca.getAddress() != null
if (address.equals(searchAddress)) searchFound = true; && ca.getAddress().asStringUriOnly().equals(sr.getAddress().asStringUriOnly()))
if (address.startsWith("sip:")) address = address.substring(4); || (sr.getPhoneNumber() != null && normalizedPhoneNumber != null
if (c.getContact() != null && c.getContact().getFullName() != null && sr.getPhoneNumber().equals(normalizedPhoneNumber))) {
&& c.getContact().getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault())) found = true;
|| address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) { break;
result.add(c);
} }
} }
} }
if (!searchFound) { if (!found) {
LinphoneContact searchContact = new LinphoneContact(); result.add(new ContactAddress(contact,
searchContact.setFullName(search); (sr.getAddress() != null) ? sr.getAddress().asStringUriOnly() : "",
result.add(new ContactAddress(searchContact, searchAddress, false)); sr.getPhoneNumber(),
contact.isFriend()));
}
} }
oldSize = search.length(); oldSize = search.length();
@ -208,7 +234,7 @@ public class SearchContactsListAdapter extends BaseAdapter {
} }
ContactAddress contact = getItem(position); ContactAddress contact = getItem(position);
final String a = contact.getAddressAsDisplayableString(); final String a = (contact.getAddressAsDisplayableString().isEmpty()) ? contact.getPhoneNumber() : contact.getAddressAsDisplayableString();
LinphoneContact c = contact.getContact(); LinphoneContact c = contact.getContact();
holder.avatar.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); holder.avatar.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
@ -216,11 +242,20 @@ public class SearchContactsListAdapter extends BaseAdapter {
LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), holder.avatar, c.getThumbnailUri()); LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), holder.avatar, c.getThumbnailUri());
} }
String address = null; String address = contact.getAddressAsDisplayableString();
if (c != null) { if (c != null && c.getFullName() != null) {
if (address == null)
address = c.getPresenceModelForUriOrTel(a); address = c.getPresenceModelForUriOrTel(a);
holder.name.setVisibility(View.VISIBLE); holder.name.setVisibility(View.VISIBLE);
holder.name.setText(c.getFullName()); holder.name.setText(c.getFullName());
} else if (contact.getAddress() != null) {
if (contact.getAddress().getUsername() != null) {
holder.name.setVisibility(View.VISIBLE);
holder.name.setText(contact.getAddress().getUsername());
} else if (contact.getAddress().getDisplayName() != null) {
holder.name.setVisibility(View.VISIBLE);
holder.name.setText(contact.getAddress().getDisplayName());
}
} else { } else {
holder.name.setVisibility(View.GONE); holder.name.setVisibility(View.GONE);
} }

View file

@ -32,6 +32,7 @@ public class FirebaseIdService extends FirebaseInstanceIdService {
// Get updated InstanceID token. // Get updated InstanceID token.
final String refreshedToken = FirebaseInstanceId.getInstance().getToken(); final String refreshedToken = FirebaseInstanceId.getInstance().getToken();
android.util.Log.i("FirebaseIdService", "[Push Notification] Refreshed token: " + refreshedToken); android.util.Log.i("FirebaseIdService", "[Push Notification] Refreshed token: " + refreshedToken);
LinphoneUtils.dispatchOnUIThread(new Runnable() { LinphoneUtils.dispatchOnUIThread(new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -52,5 +52,4 @@ public class FirebaseMessaging extends FirebaseMessagingService {
}); });
} }
} }
} }

View file

@ -260,6 +260,18 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
return true; return true;
} }
}; };
OnPreferenceChangeListener pushNotificationListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean value = (Boolean) newValue;
if (isNewAccount) {
//TODO
} else {
mPrefs.enablePushNotifForProxy(n, value);
}
return true;
}
};
OnPreferenceChangeListener disableChangedListener = new OnPreferenceChangeListener() { OnPreferenceChangeListener disableChangedListener = new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
@ -443,6 +455,12 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
Preference linkAccount = advanced.getPreference(10); Preference linkAccount = advanced.getPreference(10);
linkAccount.setOnPreferenceClickListener(linkAccountListener); linkAccount.setOnPreferenceClickListener(linkAccountListener);
CheckBoxPreference pushNotif = (CheckBoxPreference) advanced.getPreference(11);
pushNotif.setOnPreferenceChangeListener(pushNotificationListener);
if(!isNewAccount){
pushNotif.setChecked(mPrefs.isPushNotifEnabledForProxy(n));
}
PreferenceCategory manage = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_manage_key)); PreferenceCategory manage = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_manage_key));
final CheckBoxPreference disable = (CheckBoxPreference) manage.getPreference(0); final CheckBoxPreference disable = (CheckBoxPreference) manage.getPreference(0);
disable.setEnabled(true); disable.setEnabled(true);

View file

@ -204,7 +204,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
mWaitLayout.setVisibility(View.VISIBLE); mWaitLayout.setVisibility(View.VISIBLE);
mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true);
mChatRoom.addListener(mChatRoomCreationListener); mChatRoom.addListener(mChatRoomCreationListener);
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {

View file

@ -221,6 +221,7 @@ public class SettingsFragment extends PreferencesListFragment {
if (getResources().getBoolean(R.bool.disable_every_log)) { if (getResources().getBoolean(R.bool.disable_every_log)) {
uncheckAndHidePreference(R.string.pref_debug_key); uncheckAndHidePreference(R.string.pref_debug_key);
uncheckAndHidePreference(R.string.pref_java_debug_key);
} }
if (!LinphoneManager.getLc().upnpAvailable()) { if (!LinphoneManager.getLc().upnpAvailable()) {
@ -289,16 +290,16 @@ public class SettingsFragment extends PreferencesListFragment {
return; 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));
String tunnelMode = mPrefs.getTunnelMode(); String tunnelMode = mPrefs.getTunnelMode();
tunnelModePref.setSummary(tunnelMode); tunnelModePref.setSummary(tunnelMode);
tunnelModePref.setValue(tunnelMode);*/ tunnelModePref.setValue(tunnelMode);
} }
private void setTunnelPreferencesListener() { private void setTunnelPreferencesListener() {
/*findPreference(getString(R.string.pref_tunnel_host_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_tunnel_host_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
String host = newValue.toString(); String host = newValue.toString();
@ -328,7 +329,7 @@ public class SettingsFragment extends PreferencesListFragment {
preference.setSummary(mode); preference.setSummary(mode);
return true; return true;
} }
});*/ });
} }
private void initAccounts() { private void initAccounts() {
@ -1267,6 +1268,7 @@ public class SettingsFragment extends PreferencesListFragment {
private void initAdvancedSettings() { private void initAdvancedSettings() {
((CheckBoxPreference)findPreference(getString(R.string.pref_friendlist_subscribe_key))).setChecked(mPrefs.isFriendlistsubscriptionEnabled()); ((CheckBoxPreference)findPreference(getString(R.string.pref_friendlist_subscribe_key))).setChecked(mPrefs.isFriendlistsubscriptionEnabled());
((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_java_debug_key))).setChecked(mPrefs.useJavaLogger());
((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_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());
@ -1296,6 +1298,15 @@ public class SettingsFragment extends PreferencesListFragment {
} }
}); });
findPreference(getString(R.string.pref_java_debug_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean value = (Boolean) newValue;
mPrefs.setJavaLogger(value);
return true;
}
});
findPreference(getString(R.string.pref_background_mode_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { findPreference(getString(R.string.pref_background_mode_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {

View file

@ -1,31 +0,0 @@
package org.linphone.gcm;
/*
GCMReceiver.java
Copyright (C) 2017 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import android.content.Context;
import com.google.android.gcm.GCMBroadcastReceiver;
public class GCMReceiver extends GCMBroadcastReceiver {
@Override
protected String getGCMIntentServiceClassName(Context context) {
return "org.linphone.gcm.GCMService";
}
}

View file

@ -1,105 +0,0 @@
package org.linphone.gcm;
/*
GCMService.java
Copyright (C) 2017 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import static android.content.Intent.ACTION_MAIN;
import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
import org.linphone.LinphoneService;
import org.linphone.LinphoneUtils;
import org.linphone.R;
import org.linphone.core.Factory;
import org.linphone.core.LogCollectionState;
import org.linphone.mediastream.Log;
import android.content.Context;
import android.content.Intent;
import com.google.android.gcm.GCMBaseIntentService;
// Warning ! Do not rename the service !
public class GCMService extends GCMBaseIntentService {
public GCMService() {
}
private void initLogger(Context context) {
LinphonePreferences.instance().setContext(context);
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
Factory.instance().enableLogCollection(isDebugEnabled ? LogCollectionState.Enabled : LogCollectionState.Disabled);
Factory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
}
@Override
protected void onError(Context context, String errorId) {
initLogger(context);
Log.e("[Push Notification] Error while registering: " + errorId);
}
@Override
protected void onMessage(Context context, Intent intent) {
initLogger(context);
Log.d("[Push Notification] Received");
if (!LinphoneService.isReady()) {
context.startService(new Intent(ACTION_MAIN).setClass(context, LinphoneService.class));
} else if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() == 0) {
LinphoneUtils.dispatchOnUIThread(new Runnable(){
@Override
public void run() {
if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() == 0){
LinphoneManager.getLc().setNetworkReachable(false);
LinphoneManager.getLc().setNetworkReachable(true);
}
}
});
}
}
@Override
protected void onRegistered(Context context, final String regId) {
initLogger(context);
Log.d("[Push Notification] Registered: " + regId);
LinphoneUtils.dispatchOnUIThread(new Runnable(){
@Override
public void run() {
LinphonePreferences.instance().setPushNotificationRegistrationID(regId);
}
});
}
@Override
protected void onUnregistered(Context context, String regId) {
initLogger(context);
Log.w("[Push Notification] Unregistered: " + regId);
LinphoneUtils.dispatchOnUIThread(new Runnable(){
@Override
public void run() {
LinphonePreferences.instance().setPushNotificationRegistrationID(null);
}
});
}
protected String[] getSenderIds(Context context) {
return new String[] { context.getString(R.string.push_sender_id) };
}
}

View file

@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
import org.linphone.LinphoneService; import org.linphone.LinphoneService;
import org.linphone.LinphoneUtils;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.Factory; import org.linphone.core.Factory;
@ -43,8 +44,7 @@ public class DozeReceiver extends android.content.BroadcastReceiver {
if (!LinphoneService.isReady()) return; if (!LinphoneService.isReady()) return;
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
Factory.instance().enableLogCollection(isDebugEnabled ? LogCollectionState.Enabled : LogCollectionState.Disabled); LinphoneUtils.initLoggingService(isDebugEnabled, context.getString(R.string.app_name));
Factory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return; if (lc == null) return;

View file

@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
import org.linphone.LinphoneService; import org.linphone.LinphoneService;
import org.linphone.LinphoneUtils;
import org.linphone.R; import org.linphone.R;
import org.linphone.compatibility.Compatibility; import org.linphone.compatibility.Compatibility;
import org.linphone.core.Core; import org.linphone.core.Core;
@ -46,8 +47,7 @@ public class KeepAliveReceiver extends BroadcastReceiver {
return; return;
} else { } else {
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled(); boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
Factory.instance().enableLogCollection(isDebugEnabled ? LogCollectionState.Enabled : LogCollectionState.Disabled); LinphoneUtils.initLoggingService(isDebugEnabled, context.getString(R.string.app_name));
Factory.instance().setDebugMode(isDebugEnabled, context.getString(R.string.app_name));
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return; if (lc == null) return;

View file

@ -19,6 +19,7 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
import org.linphone.LinphoneUtils;
import org.linphone.call.CallActivity; import org.linphone.call.CallActivity;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences; import org.linphone.LinphonePreferences;
@ -139,7 +140,6 @@ public class Digit extends Button implements AddressAware {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
if(which == 0){ if(which == 0){
LinphonePreferences.instance().setDebugEnabled(false); LinphonePreferences.instance().setDebugEnabled(false);
Factory.instance().enableLogCollection(LogCollectionState.Disabled);
} }
if(which == 1) { if(which == 1) {
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
@ -155,7 +155,6 @@ public class Digit extends Button implements AddressAware {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
if(which == 0) { if(which == 0) {
LinphonePreferences.instance().setDebugEnabled(true); LinphonePreferences.instance().setDebugEnabled(true);
Factory.instance().enableLogCollection(LogCollectionState.Enabled);
} }
} }
}); });

@ -1 +1 @@
Subproject commit e9473d2e5772c9ad1aea83c504b9c6aa9a92bc67 Subproject commit acf7727002fa4837a25582b5c798516b6b288fac

@ -1 +1 @@
Subproject commit 8c1027652d3219521a6d9112614066a9cc9f8cb1 Subproject commit 7376c8ba975617c8b2a7232c3acc428513a4ae8f

@ -1 +1 @@
Subproject commit 91f5b7273064a496ba1c314c5b78ad492289e584 Subproject commit cbb4ab4c2a58e4fa1954043f6b17266e1685c887

@ -1 +1 @@
Subproject commit 18abde9e43e8f98e22c09afee3e089c4e7691173 Subproject commit 8e841b047641b1812a83880a90e89d702747ca5b

@ -1 +1 @@
Subproject commit 3d7e530222c9ff128f3db96108da6320987b17bf Subproject commit 64fc28497ffb0cf93ec851f2f2f6cfd72f116c3a

@ -1 +1 @@
Subproject commit 1149d4befcdd8a0f16b90a336d683a27081c59c0 Subproject commit 5dc5219afe2d6f4d32a91ad6017ffc070eaf4eb6