Merge with master branch, commit 3aff3070e7, working state

This commit is contained in:
Lucas Legrand 2018-07-13 10:20:03 +02:00
commit e8f04f3d7c
93 changed files with 18313 additions and 5390 deletions

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry excluding="org/linphone/mediastream/MediastreamerActivity.java" kind="src" path="submodules/linphone/mediastreamer2/java/src"/>
<classpathentry kind="src" path="submodules/linphone/java/j2se"/>
<classpathentry kind="src" path="submodules/linphone/java/common"/>
<classpathentry kind="src" path="submodules/linphone/java/impl"/>
<classpathentry kind="src" path="submodules/linphone/coreapi/help/java"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="lib" path="libs/android-support-v4.jar"/>
<classpathentry exported="true" kind="lib" path="libs/gcm.jar"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

12
.gitignore vendored
View file

@ -14,7 +14,7 @@ default.properties
doc doc
gen gen
liblinphone-junit-report.xml liblinphone-junit-report.xml
liblinphone-sdk liblinphone-sdk/android-*
liblinphonetester_*.zip liblinphonetester_*.zip
libs libs
libs-debug libs-debug
@ -29,7 +29,6 @@ proguard-project.txt
project.properties project.properties
res/.DS_Store res/.DS_Store
res/raw/lpconfig.xsd res/raw/lpconfig.xsd
res/raw/rootca.pem
submodules/externals/build/cunit/CUnit/ submodules/externals/build/cunit/CUnit/
submodules/externals/build/ffmpeg/arm/ submodules/externals/build/ffmpeg/arm/
submodules/externals/build/ffmpeg/x86 submodules/externals/build/ffmpeg/x86
@ -49,7 +48,12 @@ tests/tests.output
WORK WORK
.d .d
google-services.json google-services.json
gradle.properties
.*clang* .*clang*
linphone.iml **/*.iml
src/linphone-wrapper src/linphone-wrapper
liblinphone_tester/res/raw/
**/.classpath
**/.project
**/*.kdev4
liblinphone-sdk/res/
**/.vscode

77
.gitmodules vendored
View file

@ -1,119 +1,122 @@
[submodule "submodules/linphone"] [submodule "submodules/linphone"]
path = submodules/linphone path = submodules/linphone
url = git://git.linphone.org/linphone.git url = https://gitlab.linphone.org/BC/public/linphone.git
[submodule "submodules/externals/gsm"] [submodule "submodules/externals/gsm"]
path = submodules/externals/gsm path = submodules/externals/gsm
url = git://git.linphone.org/gsm.git url = https://gitlab.linphone.org/BC/public/external/gsm.git
[submodule "submodules/externals/speex"] [submodule "submodules/externals/speex"]
path = submodules/externals/speex path = submodules/externals/speex
url = git://git.linphone.org/speex.git url = https://gitlab.linphone.org/BC/public/external/speex.git
[submodule "submodules/externals/ffmpeg"] [submodule "submodules/externals/ffmpeg"]
path = submodules/externals/ffmpeg path = submodules/externals/ffmpeg
url = git://git.linphone.org/ffmpeg.git url = https://gitlab.linphone.org/BC/public/external/ffmpeg.git
ignore = dirty ignore = dirty
[submodule "submodules/externals/x264"] [submodule "submodules/externals/x264"]
path = submodules/externals/x264 path = submodules/externals/x264
url = git://git.linphone.org/x264.git url = https://gitlab.linphone.org/BC/public/external/x264.git
ignore = dirty ignore = dirty
[submodule "submodules/msx264"] [submodule "submodules/msx264"]
path = submodules/msx264 path = submodules/msx264
url = git://git.linphone.org/msx264.git url = https://gitlab.linphone.org/BC/public/msx264.git
[submodule "submodules/externals/opencore-amr"] [submodule "submodules/externals/opencore-amr"]
path = submodules/externals/opencore-amr path = submodules/externals/opencore-amr
url = git://git.linphone.org/opencore-amr.git url = https://gitlab.linphone.org/BC/public/external/opencore-amr.git
ignore = dirty ignore = dirty
[submodule "submodules/msamr"] [submodule "submodules/msamr"]
path = submodules/msamr path = submodules/msamr
url = git://git.linphone.org/msamr.git url = https://gitlab.linphone.org/BC/public/msamr.git
[submodule "submodules/externals/libvpx"] [submodule "submodules/externals/libvpx"]
path = submodules/externals/libvpx path = submodules/externals/libvpx
url = git://git.linphone.org/libvpx.git url = https://gitlab.linphone.org/BC/public/external/libvpx.git
ignore = dirty ignore = dirty
[submodule "submodules/bzrtp"] [submodule "submodules/bzrtp"]
path = submodules/bzrtp path = submodules/bzrtp
url = git://git.linphone.org/bzrtp.git url = https://gitlab.linphone.org/BC/public/bzrtp.git
[submodule "submodules/externals/srtp"] [submodule "submodules/externals/srtp"]
path = submodules/externals/srtp path = submodules/externals/srtp
url = git://git.linphone.org/srtp.git url = https://gitlab.linphone.org/BC/public/external/srtp.git
[submodule "submodules/mssilk"] [submodule "submodules/mssilk"]
path = submodules/mssilk path = submodules/mssilk
url = git://git.linphone.org/mssilk.git url = https://gitlab.linphone.org/BC/public/mssilk.git
[submodule "submodules/bcg729"] [submodule "submodules/bcg729"]
path = submodules/bcg729 path = submodules/bcg729
url = git://git.linphone.org/bcg729.git url = https://gitlab.linphone.org/BC/public/bcg729.git
[submodule "submodules/belle-sip"] [submodule "submodules/belle-sip"]
path = submodules/belle-sip path = submodules/belle-sip
url = git://git.linphone.org/belle-sip.git url = https://gitlab.linphone.org/BC/public/belle-sip.git
[submodule "submodules/externals/libxml2"] [submodule "submodules/externals/libxml2"]
path = submodules/externals/libxml2 path = submodules/externals/libxml2
url = https://github.com/GNOME/libxml2.git url = https://gitlab.linphone.org/BC/public/external/libxml2.git
ignore = dirty ignore = dirty
[submodule "submodules/externals/libupnp"] [submodule "submodules/externals/libupnp"]
path = submodules/externals/libupnp path = submodules/externals/libupnp
url = git://git.linphone.org/libupnp.git url = https://gitlab.linphone.org/BC/public/external/libupnp.git
[submodule "submodules/externals/opus"] [submodule "submodules/externals/opus"]
path = submodules/externals/opus path = submodules/externals/opus
url = git://git.linphone.org/opus.git url = https://gitlab.linphone.org/BC/public/external/opus.git
ignore = dirty ignore = dirty
[submodule "submodules/mswebrtc"] [submodule "submodules/mswebrtc"]
path = submodules/mswebrtc path = submodules/mswebrtc
url = git://git.linphone.org/mswebrtc.git url = https://gitlab.linphone.org/BC/public/mswebrtc.git
[submodule "submodules/msopenh264"] [submodule "submodules/msopenh264"]
path = submodules/msopenh264 path = submodules/msopenh264
url = git://git.linphone.org/msopenh264.git url = https://gitlab.linphone.org/BC/public/msopenh264.git
[submodule "submodules/externals/openh264"] [submodule "submodules/externals/openh264"]
path = submodules/externals/openh264 path = submodules/externals/openh264
url = https://github.com/cisco/openh264 url = https://gitlab.linphone.org/BC/public/external/openh264.git
ignore = dirty ignore = dirty
[submodule "submodules/mscodec2"] [submodule "submodules/mscodec2"]
path = submodules/mscodec2 path = submodules/mscodec2
url = git://git.linphone.org/mscodec2.git url = https://gitlab.linphone.org/BC/public/mscodec2.git
[submodule "submodules/bctoolbox"] [submodule "submodules/bctoolbox"]
path = submodules/bctoolbox path = submodules/bctoolbox
url = git://git.linphone.org/bctoolbox.git url = https://gitlab.linphone.org/BC/public/bctoolbox.git
[submodule "submodules/externals/mbedtls"] [submodule "submodules/externals/mbedtls"]
path = submodules/externals/mbedtls path = submodules/externals/mbedtls
url = git://git.linphone.org/mbedtls.git url = https://gitlab.linphone.org/BC/public/external/mbedtls.git
ignore = dirty ignore = dirty
[submodule "submodules/cmake-builder"] [submodule "submodules/cmake-builder"]
path = submodules/cmake-builder path = submodules/cmake-builder
url = git://git.linphone.org/linphone-cmake-builder.git url = https://gitlab.linphone.org/BC/public/linphone-cmake-builder.git
[submodule "submodules/externals/bv16-floatingpoint"] [submodule "submodules/externals/bv16-floatingpoint"]
path = submodules/externals/bv16-floatingpoint path = submodules/externals/bv16-floatingpoint
url = git://git.linphone.org/bv16-floatingpoint.git url = https://gitlab.linphone.org/BC/public/external/bv16-floatingpoint.git
[submodule "submodules/belr"] [submodule "submodules/belr"]
path = submodules/belr path = submodules/belr
url = git://git.linphone.org/belr.git url = https://gitlab.linphone.org/BC/public/belr.git
[submodule "submodules/belcard"] [submodule "submodules/belcard"]
path = submodules/belcard path = submodules/belcard
url = git://git.linphone.org/belcard.git url = https://gitlab.linphone.org/BC/public/belcard.git
[submodule "submodules/bcunit"] [submodule "submodules/bcunit"]
path = submodules/bcunit path = submodules/bcunit
url = git://git.linphone.org/bcunit.git url = https://gitlab.linphone.org/BC/public/bcunit.git
[submodule "submodules/externals/vo-amrwbenc"] [submodule "submodules/externals/vo-amrwbenc"]
path = submodules/externals/vo-amrwbenc path = submodules/externals/vo-amrwbenc
url = git://git.linphone.org/vo-amrwbenc.git url = https://gitlab.linphone.org/BC/public/external/vo-amrwbenc.git
[submodule "submodules/externals/codec2"] [submodule "submodules/externals/codec2"]
path = submodules/externals/codec2 path = submodules/externals/codec2
url = git://git.linphone.org/codec2 url = https://gitlab.linphone.org/BC/public/external/codec2.git
[submodule "submodules/externals/libjpeg-turbo"] [submodule "submodules/externals/libjpeg-turbo"]
path = submodules/externals/libjpeg-turbo path = submodules/externals/libjpeg-turbo
url = git://git.linphone.org/libjpeg-turbo.git url = https://gitlab.linphone.org/BC/public/external/libjpeg-turbo.git
[submodule "submodules/mediastreamer2"] [submodule "submodules/mediastreamer2"]
path = submodules/mediastreamer2 path = submodules/mediastreamer2
url = git://git.linphone.org/mediastreamer2.git url = https://gitlab.linphone.org/BC/public/mediastreamer2.git
[submodule "submodules/oRTP"] [submodule "submodules/oRTP"]
path = submodules/oRTP path = submodules/oRTP
url = git://git.linphone.org/ortp.git url = https://gitlab.linphone.org/BC/public/ortp.git
[submodule "submodules/bcmatroska2"] [submodule "submodules/bcmatroska2"]
path = submodules/bcmatroska2 path = submodules/bcmatroska2
url = git://git.linphone.org/bcmatroska2.git url = https://gitlab.linphone.org/BC/public/bcmatroska2.git
[submodule "submodules/externals/xerces-c"] [submodule "submodules/externals/xerces-c"]
path = submodules/externals/xerces-c path = submodules/externals/xerces-c
url = git://git.linphone.org/xerces-c.git url = https://gitlab.linphone.org/BC/public/external/xerces-c.git
[submodule "submodules/externals/libxsd"] [submodule "submodules/externals/libxsd"]
path = submodules/externals/libxsd path = submodules/externals/libxsd
url = git://git.linphone.org/libxsd url = https://gitlab.linphone.org/BC/public/external/libxsd.git
[submodule "submodules/externals/soci"] [submodule "submodules/externals/soci"]
path = submodules/externals/soci path = submodules/externals/soci
url = git://git.linphone.org/soci url = https://gitlab.linphone.org/BC/public/external/soci.git
[submodule "submodules/externals/zxing-cpp"]
path = submodules/externals/zxing-cpp
url = https://gitlab.linphone.org/BC/public/external/zxing-cpp.git

View file

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>linphone-android</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -2,12 +2,12 @@
<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="3995" android:versionCode="4002"
android:versionName="3.99.4"> android:versionName="4.0.1">
<uses-sdk <uses-sdk
android:minSdkVersion="16" android:minSdkVersion="16"
android:targetSdkVersion="26"/> android:targetSdkVersion="28"/>
<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"/>

11
AndroidManifestSdk.xml Executable file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.linphone"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
android:versionCode="4001"
android:versionName="4.0.0">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="28"/>
</manifest>

View file

@ -5,12 +5,34 @@ Group changes to describe their impact on the project, as follows:
Added for new features. Added for new features.
Changed for changes in existing functionality. Changed for changes in existing functionality.
Deprecated for once-stable features removed in upcoming releases.é Deprecated for once-stable features removed in upcoming releases.
Removed for deprecated features removed in this release. Removed for deprecated features removed in this release.
Fixed for any bug fixes. Fixed for any bug fixes.
Security to invite users to upgrade in case of vulnerabilities. Security to invite users to upgrade in case of vulnerabilities.
## [Incomming] ## [Incomming]
- feature: support of H265 codec.
## [4.0.1] - 2018-06-26
### Fixed
- fix loading of plugins
- fix issue with video stream, not started when receiving an incoming call just after the app is launched
- fix issue with TURN
## [4.0.0] - 2018-06-15
### Added
- Group chat between linphone.org SIP accounts.
- new JAVA/JNI wrapper. This new wrapper is automatically generated from liblinphone C API. It breaks compatibility with previous, hand-made wrapper.
(more information about new wrapper [here.](https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Linphone%20%28Android%29%20Java%20wrapper/) )
### Deprecated
- hand-made java API in submodules/linphone/java is deprecated. However it is still possible to use it by checking out the 3.4.x branch of linphone-android.
### Fixed
- issue with changing push notification token not passed to library, possibly resulting in a loss of incoming calls.
## [3.3.0] - 2017-10-18 ## [3.3.0] - 2017-10-18

View file

@ -1,14 +1,16 @@
[![pipeline status](https://gitlab.linphone.org/BC/public/linphone-android/badges/master/pipeline.svg)](https://gitlab.linphone.org/BC/public/linphone-android/commits/master)
Linphone is a free VoIP and video softphone based on the SIP protocol. Linphone is a free VoIP and video softphone based on the SIP protocol.
# COMPILATION INSTRUCTIONS # COMPILATION INSTRUCTIONS
## To build liblinphone for Android, you must: ## To build liblinphone for Android, you must:
1. Download the Android sdk (API 26.0.1 at max) with platform-tools and tools updated to latest revision, then add both 'tools' and 'platform-tools' folders in your path and the android-sdk folder to ANDROID_HOME environment variable. 1. Download the Android sdk (API 28.0.0 at max) with platform-tools and tools updated to latest revision, then add both 'tools' and 'platform-tools' folders in your path and the android-sdk folder to ANDROID_HOME environment variable.
2. Download the Android ndk (version r11c or 15) from google and add it to your path (no symlink !!!) and ANDROID_NDK environment variable. 2. Download the Android ndk (version 16) from google and add it to your path (no symlink !!!) and ANDROID_NDK environment variable.
3. Install _yasm_, _nasm_ (For OpenH224 support only), _python_, _pkg_config_ and _cmake(>=3.7)_. 3. Install _yasm_, _nasm_ (For OpenH224 support only), _python_, _pkg_config_ and _cmake(>=3.10)_.
* On 64 bits linux systems you'll need the _ia32-libs_ package. * On 64 bits linux systems you'll need the _ia32-libs_ package.
* With the latest Debian (multiarch), you need this: * With the latest Debian (multiarch), you need this:
* `dpkg --add-architecture i386` * `dpkg --add-architecture i386`
@ -65,11 +67,6 @@ You can speed up the compilation by using ccache (compiler cache, see [ccache.sa
To enable firebase in Linphone, just add your 'google-service.json' in project root, add your key at 'push_sender_id' and add 'firebase' at 'push_type' in 'res/values/non_localizable_custom.xml' To enable firebase in Linphone, just add your 'google-service.json' in project root, add your key at 'push_sender_id' and add 'firebase' at 'push_type' in 'res/values/non_localizable_custom.xml'
Be sure to have all services for Firebase in your 'AndroidManifest.xml' Be sure to have all services for Firebase in your 'AndroidManifest.xml'
## Google
To enable google push in Linphone, remove 'google-service.json' file if it exist, add your key at 'push_sender_id' and add 'google' at 'push_type' in 'res/values/non_localizable_custom.xml'
Be sure to have every permissions and services for GCM in your 'AndroidManifest.xml'
# TROUBLESHOOTING # TROUBLESHOOTING
If you encounter the following issue: If you encounter the following issue:

48
bsed.sh
View file

@ -1,48 +0,0 @@
#!/bin/bash
# Script found at http://everydaywithlinux.blogspot.fr/2012/11/patch-strings-in-binary-files-with-sed.html
function patch_strings_in_file() {
local FILE="$1"
local PATTERN="$2"
local REPLACEMENT="$3"
# Find all unique strings in FILE that contain the pattern
STRINGS=$(strings ${FILE} | grep ${PATTERN} | sort -u -r)
if [ "${STRINGS}" != "" ] ; then
echo "File '${FILE}' contain strings with '${PATTERN}' in them:"
for OLD_STRING in ${STRINGS} ; do
# Create the new string with a simple bash-replacement
NEW_STRING=${OLD_STRING//${PATTERN}/${REPLACEMENT}}
# Create null terminated ASCII HEX representations of the strings
OLD_STRING_HEX="$(echo -n ${OLD_STRING} | xxd -g 0 -u -ps -c 256)00"
NEW_STRING_HEX="$(echo -n ${NEW_STRING} | xxd -g 0 -u -ps -c 256)00"
if [ ${#NEW_STRING_HEX} -le ${#OLD_STRING_HEX} ] ; then
# Pad the replacement string with null terminations so the
# length matches the original string
while [ ${#NEW_STRING_HEX} -lt ${#OLD_STRING_HEX} ] ; do
NEW_STRING_HEX="${NEW_STRING_HEX}00"
done
# Now, replace every occurrence of OLD_STRING with NEW_STRING
echo -n "Replacing ${OLD_STRING} with ${NEW_STRING}... "
hexdump -ve '1/1 "%.2X"' ${FILE} | \
sed "s/${OLD_STRING_HEX}/${NEW_STRING_HEX}/g" | \
xxd -r -p > ${FILE}.tmp
chmod --reference ${FILE} ${FILE}.tmp
mv ${FILE}.tmp ${FILE}
echo "Done!"
else
echo "New string '${NEW_STRING}' is longer than old" \
"string '${OLD_STRING}'. Skipping."
fi
done
fi
}
patch_strings_in_file libs/armeabi-v7a/liblinphone-armeabi-v7a.so "./obj/local/armeabi-v7a/libffmpeg-linphone-arm.so" "libffmpeg-linphone-arm.so"
patch_strings_in_file libs/x86/liblinphone-x86.so "./obj/local/x86/libffmpeg-linphone-x86.so" "libffmpeg-linphone-x86.so"

View file

@ -45,23 +45,19 @@ dependencies {
androidTestImplementation 'junit:junit:4.12' androidTestImplementation 'junit:junit:4.12'
implementation 'org.apache.commons:commons-compress:1.16.1' implementation 'org.apache.commons:commons-compress:1.16.1'
if (firebaseEnable()) { if (firebaseEnable()) {
implementation 'com.google.firebase:firebase-messaging:12.0.1' implementation 'com.google.firebase:firebase-messaging:15.0.2'
} }
implementation 'com.android.support:support-v4:27.1.1' implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:design:27.1.1'
implementation project(':liblinphone-sdk')
} }
if (firebaseEnable()) { if (firebaseEnable()) {
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'
} }
//// Submodule Dir /////
def submoduleDir = ['submodules/mediastreamer2/java/src']
////////////////////////
///// Exclude Files ///// ///// Exclude Files /////
def excludeFiles = [] def excludeFiles = []
// Exclude firebase file if not enable // Exclude firebase file if not enable
@ -72,7 +68,7 @@ if (!firebaseEnable()) {
excludeFiles.add('**/gcm*') excludeFiles.add('**/gcm*')
println '[Push Notification] Firebase enabled' println '[Push Notification] Firebase enabled'
} }
excludeFiles.add('**/mediastream/MediastreamerActivity.java')
excludeFiles.add('src/android/org/linphone/tutorials/*.java') excludeFiles.add('src/android/org/linphone/tutorials/*.java')
def excludePackage = [] def excludePackage = []
@ -85,7 +81,8 @@ excludePackage.add('**/LICENSE.txt')
android { android {
defaultConfig { defaultConfig {
compileSdkVersion 26 compileSdkVersion 28
buildToolsVersion "28.0.0"
applicationId getPackageName() applicationId getPackageName()
multiDexEnabled true multiDexEnabled true
@ -114,20 +111,19 @@ android {
packaged { packaged {
initWith release initWith release
signingConfig null signingConfig null
matchingFallbacks = ['debug', 'release']
} }
} }
sourceSets { sourceSets {
main { main {
manifest.srcFile 'AndroidManifest.xml' manifest.srcFile 'AndroidManifest.xml'
def srcDirs = submoduleDir def srcDirs = ['src/android']
srcDirs.addAll(['src/linphone-wrapper', 'src/android'])
java.srcDirs = srcDirs java.srcDirs = srcDirs
resources.srcDirs = srcDirs resources.srcDirs = srcDirs
aidl.srcDirs = srcDirs aidl.srcDirs = srcDirs
renderscript.srcDirs = srcDirs renderscript.srcDirs = srcDirs
res.srcDirs = ['res'] res.srcDirs = ['res']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
java.excludes = excludeFiles java.excludes = excludeFiles
// Exclude some useless files // Exclude some useless files
@ -142,16 +138,13 @@ android {
sourceSets { sourceSets {
androidTest { androidTest {
manifest.srcFile 'AndroidManifest.xml' manifest.srcFile 'AndroidManifest.xml'
def srcDirs = submoduleDir def srcDirs = ['src/android', 'src/androidTest']
srcDirs.addAll(['src/android',
'src/androidTest'])
java.srcDirs = srcDirs java.srcDirs = srcDirs
resources.srcDirs = srcDirs resources.srcDirs = srcDirs
aidl.srcDirs = srcDirs aidl.srcDirs = srcDirs
renderscript.srcDirs = srcDirs renderscript.srcDirs = srcDirs
res.srcDirs = ['res'] res.srcDirs = ['res']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
java.excludes = excludeFiles java.excludes = excludeFiles
// Exclude some useless files // Exclude some useless files
@ -166,7 +159,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' exclude 'META-INF/MANIFEST.MF'
} }
} }

View file

@ -1,55 +0,0 @@
#!/bin/sh
error_on_quit=0
echo_err() {
echo "$@" >&2
error_on_quit=1
}
check_installed() {
if [ -z "$(which $1)" ]; then
echo_err "Could not find $1. Please install $2."
return 1
fi
return 0
}
for prog in automake autoconf pkg-config java ant yasm nasm wget; do
check_installed "$prog" "it"
done
if [ $(uname) = "Darwin" ]; then
check_installed "libtool" "libtool"
else
check_installed "libtoolize" "libtool"
fi
check_installed "ndk-build" "android NDK"
if check_installed "android" "android SDK"; then
check_installed "adb" "android SDK platform tools"
# check that at least one target is installed
if [ -z "$(android list target -c)" ]; then
echo_err "Install at least one android target in the android SDK"
fi
fi
if nasm -f elf32 2>&1 | grep -q "fatal: unrecognised output format"; then
echo_err "Invalid version of nasm: your version does not support elf32 output format. If you have installed nasm, please check that your PATH env variable is set correctly."
fi
if ! (find submodules/linphone/mediastreamer2 -mindepth 1 2>/dev/null | grep -q . \
|| find submodules/linphone/oRTP -mindepth 1 2>/dev/null | grep -q .); then
echo_err "Missing some git submodules. Did you run 'git submodule update --init --recursive'?"
fi
# Android NDK should NOT be simlinked!
if [ -L "$ANDROID_NDK" ] && [ -d "$ANDROID_NDK" ]; then
echo_err "ANDROID_NDK=$ANDROID_NDK must NOT be a symbolic link, please modify it accordingly"
fi
if [ $error_on_quit = 0 ]; then
rm -f check_tools.mk
touch check_tools.mk
echo "JAVA=\"$(which java)\"" >> check_tools.mk
echo "ANTLR=\"$(which java)\" -jar \"submodules/externals/antlr3/antlr-3.2.jar\"" >> check_tools.mk
else
echo "Failed to detect required tools, aborting."
fi
exit $error_on_quit

7
gradle.properties Normal file
View file

@ -0,0 +1,7 @@
// Signing APK Release
RELEASE_STORE_FILE=""
RELEASE_STORE_PASSWORD=
RELEASE_KEY_ALIAS=
RELEASE_KEY_PASSWORD=
source:https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory
org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

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.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip

View file

@ -2,10 +2,10 @@
<manifest package="org.linphone.core" <manifest package="org.linphone.core"
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="3320" android:versionCode="4001"
android:versionName="3.3.2"> android:versionName="4.0.0">
<uses-sdk <uses-sdk
android:minSdkVersion="16" android:minSdkVersion="16"
android:targetSdkVersion="26"/> android:targetSdkVersion="28"/>
</manifest> </manifest>

View file

@ -21,18 +21,40 @@ allprojects {
} }
} }
configurations { configurations {
javadocDeps javadocDeps
} }
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
dependencies { dependencies {
implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1' compile 'org.apache.commons:commons-compress:1.16.1'
javadocDeps group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1' javadocDeps 'org.apache.commons:commons-compress:1.16.1'
} }
def srcDir = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper'] def srcDir = ['../submodules/mediastreamer2/java/src']
def rootSdk
if (file('android-arm64/share/linphonej/java/org/linphone/core/Factory.java').exists() )
rootSdk = 'android-arm64'
else if (file('android-arm/share/linphonej/java/org/linphone/core/Factory.java').exists() )
rootSdk = 'android-arm'
else if (file('android-armv7/share/linphonej/java/org/linphone/core/Factory.java').exists() )
rootSdk = 'android-armv7'
else if (file('android-x86/share/linphonej/java/org/linphone/core/Factory.java').exists() )
rootSdk = 'android-x86'
else {
println ("native sdk not ready yet")
rootSdk = ""
}
srcDir += [rootSdk+'/share/linphonej/java/org/linphone/core/']
srcDir += ['../submodules/linphone/wrappers/java/classes/']
def excludePackage = [] def excludePackage = []
@ -42,9 +64,38 @@ excludePackage.add('**/**tester**')
excludePackage.add('**/LICENSE.txt') excludePackage.add('**/LICENSE.txt')
android { android {
buildTypes {
release {}
debug {}
}
defaultConfig { defaultConfig {
compileSdkVersion 26 compileSdkVersion 28
buildToolsVersion "28.0.0"
multiDexEnabled true multiDexEnabled true
setProperty("archivesBaseName", "liblinphone-sdk")
}
// Signing
signingConfigs {
release {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
packaged {
initWith release
signingConfig null
//matchingFallbacks = ['debug', 'release']
}
} }
lintOptions { lintOptions {
@ -58,10 +109,11 @@ android {
main { main {
manifest.srcFile 'AndroidManifestLibrary.xml' manifest.srcFile 'AndroidManifestLibrary.xml'
java.srcDirs = srcDir java.srcDirs = srcDir
resources.srcDirs = srcDir
aidl.srcDirs = srcDir aidl.srcDirs = srcDir
assets.srcDirs = ["${buildDir}/sdk-assets/assets/"]
renderscript.srcDirs = srcDir renderscript.srcDirs = srcDir
jniLibs.srcDirs = ['libs'] jniLibs.srcDirs = ['../libs']
resources.srcDir("res")
java.excludes = ['**/mediastream/MediastreamerActivity.java'] java.excludes = ['**/mediastream/MediastreamerActivity.java']
@ -78,7 +130,7 @@ android {
///////////// Task ///////////// ///////////// Task /////////////
task(releaseJavadoc, type: Javadoc, dependsOn: "assembleRelease") { task(releaseJavadoc, type: Javadoc, dependsOn: "assembleRelease") {
source = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper'] source = srcDir
excludes = ['**/mediastream/MediastreamerActivity.java', excludes = ['**/mediastream/MediastreamerActivity.java',
'**/**.html', '**/**.html',
'**/**.aidl'] '**/**.aidl']
@ -108,3 +160,26 @@ task sdkZip(type: Zip) {
include '*' include '*'
archiveName newSdkName archiveName newSdkName
} }
task copyAssets(type: Sync) {
from rootSdk
into "${buildDir}/sdk-assets/assets/org.linphone.core"
include '**/*.png'
include '**/*.pem'
include '**/*.mkv'
include '**/*.wav'
include '**/*_grammar'
//rename '(.*)', '$1'.toLowerCase()
eachFile {
path = path.toLowerCase() //to workaround case insensitive fs (macosx)
println("Syncing sdk asset ${sourcePath} to ${path}")
}
doFirst {
println("Syncing sdk assets into root dir ${destinationDir}")
}
// do not copy those
includeEmptyDirs = false
}
project.tasks['preBuild'].dependsOn 'copyAssets'

View file

@ -17,6 +17,9 @@
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application <application
android:allowBackup="true" android:allowBackup="true"

View file

@ -0,0 +1,73 @@
all: copy-files
../gradlew clean
../gradlew uninstallDebug
run-all-tests: copy-files
../gradlew :installDebugAndroidTest && \
../gradlew :installDebug && \
../gradlew :grantDebugPermissions -i && \
../gradlew :connectedAndroidTest -i \
copy-libs:
mkdir -p assets && \
mkdir -p assets/config_files && \
rm -rf libs/arm64-v8a
if test -d "../liblinphone-sdk/android-arm64"; then \
mkdir -p libs/arm64-v8a && \
cp -f ../liblinphone-sdk/android-arm64/lib/*.so libs/arm64-v8a && \
cp -f ../liblinphone-sdk/android-arm64/lib/mediastreamer/plugins/*.so libs/arm64-v8a && \
cp -f ../liblinphone-sdk/android-arm64/share/linphone/rootca.pem assets/config_files; \
fi
if test -f "../liblinphone-sdk/android-arm64/bin/gdbserver"; then \
cp -f ../liblinphone-sdk/android-arm64/bin/gdbserver libs/arm64-v8a && \
cp -f ../liblinphone-sdk/android-arm64/bin/gdb.setup libs/arm64-v8a; \
fi
rm -rf libs/armeabi-v7a
if test -d "../liblinphone-sdk/android-armv7"; then \
mkdir -p libs/armeabi-v7a && \
cp -f ../liblinphone-sdk/android-armv7/lib/*.so libs/armeabi-v7a && \
cp -f ../liblinphone-sdk/android-armv7/lib/mediastreamer/plugins/*.so libs/armeabi-v7a && \
cp -f ../liblinphone-sdk/android-armv7/share/linphone/rootca.pem assets/config_files; \
fi
if test -f "../liblinphone-sdk/android-armv7/bin/gdbserver"; then \
cp -f ../liblinphone-sdk/android-armv7/bin/gdbserver libs/armeabi-v7a && \
cp -f ../liblinphone-sdk/android-armv7/bin/gdb.setup libs/armeabi-v7a; \
fi
rm -rf libs/x86
if test -d "../liblinphone-sdk/android-x86"; then \
mkdir -p libs/x86 && \
cp -f ../liblinphone-sdk/android-x86/lib/*.so libs/x86 && \
cp -f ../liblinphone-sdk/android-x86/lib/mediastreamer/plugins/*.so libs/x86 && \
cp -f ../liblinphone-sdk/android-x86/share/linphone/rootca.pem assets/config_files; \
fi
if test -f "../liblinphone-sdk/android-x86/bin/gdbserver"; then \
cp -f ../liblinphone-sdk/android-x86/bin/gdbserver libs/x86 && \
cp -f ../liblinphone-sdk/android-x86/bin/gdb.setup libs/x86; \
fi
copy-files: ../submodules/linphone/tester/tester_hosts
$(MAKE) copy-libs
rm -rf assets/config_files
mkdir -p assets/config_files
for file in $^; do \
cp -rf $$file assets/config_files/. ; \
done
cp -rf ../submodules/linphone/tester/certificates assets/config_files
cp -rf ../submodules/linphone/tester/images assets/config_files
cp -rf ../submodules/linphone/tester/rcfiles assets/config_files
cp -rf ../submodules/linphone/tester/sounds assets/config_files
cp -rf ../submodules/linphone/tester/vcards assets/config_files
cp -rf ../submodules/linphone/tester/db assets/config_files
mkdir -p res/raw
if test -d "../liblinphone-sdk/android-arm/share/belr/grammars"; then \
cp ../liblinphone-sdk/android-arm/share/belr/grammars/*_grammar res/raw/; \
fi
if test -d "../liblinphone-sdk/android-armv7/share/belr/grammars"; then \
cp ../liblinphone-sdk/android-armv7/share/belr/grammars/*_grammar res/raw/; \
fi
if test -d "../liblinphone-sdk/android-arm64/share/belr/grammars"; then \
cp ../liblinphone-sdk/android-arm64/share/belr/grammars/*_grammar res/raw/; \
fi
if test -d "../liblinphone-sdk/android-x86/share/belr/grammars"; then \
cp ../liblinphone-sdk/android-x86/share/belr/grammars/*_grammar res/raw/; \
fi

View file

@ -29,15 +29,15 @@ 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')
compile project(":libLinphoneAndroidSdk") compile project(":liblinphone-sdk")
} }
android { android {

View file

@ -0,0 +1,7 @@
// Signing APK Release
RELEASE_STORE_FILE=""
RELEASE_STORE_PASSWORD=
RELEASE_KEY_ALIAS=
RELEASE_KEY_PASSWORD=
#source:https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory
org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

View file

@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD="maximum"
warn ( ) { warn () {
echo "$*" echo "$*"
} }
die ( ) { die () {
echo echo
echo "$*" echo "$*"
echo echo
@ -155,7 +155,7 @@ if $cygwin ; then
fi fi
# Escape application args # Escape application args
save ( ) { save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " " echo " "
} }

View file

@ -1,3 +1,2 @@
include ':libLinphoneAndroidSdk' include ':liblinphone-sdk'
project(':libLinphoneAndroidSdk').projectDir = new File(rootProject.projectDir,'..') project(':liblinphone-sdk').projectDir = new File(rootProject.projectDir,'../liblinphone-sdk')
project(':libLinphoneAndroidSdk').buildFileName = "libLinphoneAndroidSdk.gradle"

View file

@ -23,7 +23,7 @@ public class LogsActivity extends Activity {
@Override @Override
public void run() { public void run() {
String res_path = mLogsActivity.getFilesDir().getAbsolutePath()+"/config_files"; String res_path = mLogsActivity.getFilesDir().getAbsolutePath();
String write_path = mLogsActivity.getCacheDir().getPath(); String write_path = mLogsActivity.getCacheDir().getPath();
tester = new TesterLogger(mLogsActivity); tester = new TesterLogger(mLogsActivity);
List<String> list = new LinkedList<String>(Arrays.asList(new String[]{"tester", "--verbose", "--resource-dir", res_path, "--writable-dir", write_path})); List<String> list = new LinkedList<String>(Arrays.asList(new String[]{"tester", "--verbose", "--resource-dir", res_path, "--writable-dir", write_path}));

View file

@ -2,6 +2,7 @@ package org.linphone.tester;
import android.os.Bundle; import android.os.Bundle;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.view.Gravity; import android.view.Gravity;
import android.view.Menu; import android.view.Menu;
@ -19,6 +20,7 @@ public class SuitesActivity extends Activity {
if (extras != null) { if (extras != null) {
mSuite = extras.getString("suite"); mSuite = extras.getString("suite");
if(mSuite != null) { if(mSuite != null) {
Tester.setApplicationContext(getBaseContext());
this.setTitle(this.getResources().getString(R.string.app_name) + " | " + mSuite); this.setTitle(this.getResources().getString(R.string.app_name) + " | " + mSuite);
TesterList suitesTest = new TesterList(); TesterList suitesTest = new TesterList();
suitesTest.run(new String[]{"tester", "--list-tests", mSuite}); suitesTest.run(new String[]{"tester", "--list-tests", mSuite});
@ -59,6 +61,11 @@ public class SuitesActivity extends Activity {
} }
@Override
public void onDestroy() {
Tester.removeApplicationContext();
super.onDestroy();
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {

View file

@ -26,46 +26,24 @@ public class TestUnit extends AndroidTestCase {
public TestUnit(String name) { public TestUnit(String name) {
String[] tab = name.split("/"); String[] tab = name.split("/");
mSuite = tab[0]; mSuite = tab[0];
mTest = tab[1]; if (tab.length == 2)
mTest = tab[1];
setName(name); setName(name);
} }
static public void copyAssetsFromPackage(Context ctx) throws IOException { static public void copyAssetsFromPackage(Context ctx) throws IOException {
copyAssetsFromPackage(ctx,"config_files"); //copy sdk assets
org.linphone.core.tools.AndroidPlatformHelper.copyAssetsFromPackage(ctx,"org.linphone.core",".");
//copy tester assets
org.linphone.core.tools.AndroidPlatformHelper.copyAssetsFromPackage(ctx,"config_files",".");
} }
public static void copyAssetsFromPackage(Context ctx,String fromPath) throws IOException {
new File(ctx.getFilesDir().getPath()+"/"+fromPath).mkdir();
for (String f :ctx.getAssets().list(fromPath)) {
String current_name=fromPath+"/"+f;
InputStream lInputStream;
try {
lInputStream = ctx.getAssets().open(current_name);
} catch (IOException e) {
//probably a dir
new File(ctx.getFilesDir().getPath()+"/"+current_name).mkdir();
copyAssetsFromPackage(ctx,current_name);
continue;
}
FileOutputStream lOutputStream = new FileOutputStream(new File(ctx.getFilesDir().getPath()+"/"+current_name));//ctx.openFileOutput (fromPath+"/"+f, 0);
int readByte;
byte[] buff = new byte[8048];
while (( readByte = lInputStream.read(buff)) != -1) {
lOutputStream.write(buff,0, readByte);
}
lOutputStream.flush();
lOutputStream.close();
lInputStream.close();
}
}
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
if (isAssetCopied ==false) { if (isAssetCopied ==false) {
Tester.setApplicationContext(getContext());
copyAssetsFromPackage(getContext()); copyAssetsFromPackage(getContext());
isAssetCopied=true; isAssetCopied=true;
} }
@ -78,7 +56,7 @@ public class TestUnit extends AndroidTestCase {
@Override @Override
protected void runTest() { protected void runTest() {
String res_path = getContext().getFilesDir().getPath()+"/config_files"; String res_path = getContext().getFilesDir().getPath();
String write_path = getContext().getCacheDir().getPath(); String write_path = getContext().getCacheDir().getPath();
Tester tester = new Tester(); Tester tester = new Tester();

View file

@ -6,6 +6,7 @@ import org.linphone.core.Factory;
import org.linphone.mediastream.Version; import org.linphone.mediastream.Version;
import android.util.Log; import android.util.Log;
import android.content.Context;
public class Tester { public class Tester {
public static String TAG = "liblinphone-tester"; public static String TAG = "liblinphone-tester";
@ -49,6 +50,8 @@ public class Tester {
} }
} }
public static native void setApplicationContext(Context ct);
public static native void removeApplicationContext();
public native int run(String args[]); public native int run(String args[]);
public static native void keepAccounts(boolean keep); public static native void keepAccounts(boolean keep);
public static native void clearAccounts(); public static native void clearAccounts();

View file

@ -1,12 +1,8 @@
// Project information // Project information
buildDir = 'bin' buildDir = 'bin'
def firebaseEnable() {
File googleFile = new File('google-services.json')
return googleFile.exists()
}
buildscript { buildscript {
File googleFile = new File('google-services.json')
repositories { repositories {
jcenter() jcenter()
mavenCentral() mavenCentral()
@ -15,9 +11,6 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.1.0' classpath 'com.android.tools.build:gradle:3.1.0'
if (googleFile.exists()) {
classpath 'com.google.gms:google-services:3.1.0'
}
} }
} }
@ -33,28 +26,17 @@ allprojects {
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
dependencies { dependencies {
implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1' compile group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
if (firebaseEnable()) { compile 'com.android.support:support-v4:26.0.2'
implementation 'com.google.firebase:firebase-messaging:12.0.1'
} else {
implementation 'com.android.support:support-v4:26.0.1'
}
}
if (firebaseEnable()) {
apply plugin: 'com.google.gms.google-services'
} }
def srcDirs = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper', 'src/android'] def srcDirs = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper', 'src/android']
def excludeFiles = [] def excludeFiles = []
// Exclude firebase file if not enable
if (!firebaseEnable()) { excludeFiles.add('**/Firebase*')
excludeFiles.add('**/Firebase*') excludeFiles.add('**/gcm*')
} else {
excludeFiles.add('**/gcm*')
}
excludeFiles.add('**/mediastream/MediastreamerActivity.java') excludeFiles.add('**/mediastream/MediastreamerActivity.java')
def excludePackage = [] def excludePackage = []
@ -67,6 +49,7 @@ excludePackage.add('**/LICENSE.txt')
android { android {
defaultConfig { defaultConfig {
compileSdkVersion 26 compileSdkVersion 26
buildToolsVersion "27.0.3"
multiDexEnabled true multiDexEnabled true
} }
@ -79,7 +62,7 @@ android {
sourceSets { sourceSets {
main { main {
manifest.srcFile 'AndroidManifestLibrary.xml' manifest.srcFile 'AndroidManifestSdk.xml'
java.srcDirs = srcDirs java.srcDirs = srcDirs
resources.srcDirs = srcDirs resources.srcDirs = srcDirs
aidl.srcDirs = srcDirs aidl.srcDirs = srcDirs

View file

@ -1,11 +0,0 @@
--- submodules/externals/ffmpeg/library.mak.orig 2013-09-26 10:58:19.000000000 +0200
+++ submodules/externals/ffmpeg/library.mak 2013-09-26 10:58:13.000000000 +0200
@@ -54,7 +54,7 @@
$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
$(SLIB_CREATE_DEF_CMD)
- $$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
+ $$(LD) $(subst $$(@F),$(SLIBNAME),$(SHFLAGS)) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
$(SLIB_EXTRA_CMD)
ifdef SUBDIR

View file

@ -1,37 +0,0 @@
diff --git a/build/make/configure.sh b/build/make/configure.sh
index c592b63..e4998d7 100644
--- a/build/make/configure.sh
+++ b/build/make/configure.sh
@@ -1132,6 +1132,32 @@ EOF
AS=${AS:-nasm}
add_ldflags -Zhigh-mem
;;
+ android*)
+ SDK_PATH=${sdk_path}
+ COMPILER_LOCATION=`find "${SDK_PATH}" \
+ -name "i686-linux-android-gcc*" -print -quit`
+ TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/i686-linux-android-
+ CC=${TOOLCHAIN_PATH}gcc
+ CXX=${TOOLCHAIN_PATH}g++
+ AR=${TOOLCHAIN_PATH}ar
+ LD=${TOOLCHAIN_PATH}gcc
+ STRIP=${TOOLCHAIN_PATH}strip
+ NM=${TOOLCHAIN_PATH}nm
+
+ if [ -z "${alt_libc}" ]; then
+ alt_libc=`find "${SDK_PATH}" -name arch-x86 -print | \
+ awk '{n = split($0,a,"/"); \
+ split(a[n-1],b,"-"); \
+ print $0 " " b[2]}' | \
+ sort -g -k 2 | \
+ awk '{ print $1 }' | tail -1`
+ fi
+
+ add_cflags "--sysroot=${alt_libc}"
+ add_ldflags "--sysroot=${alt_libc}"
+
+ soft_enable realtime_only
+ ;;
esac
AS="${alt_as:-${AS:-auto}}"

View file

@ -1,40 +0,0 @@
commit 6b3de978d928b6c0baec3305c9803c21a4367d0c
Author: Simon Morlat <simon.morlat@linphone.org>
Date: Tue Apr 15 15:19:37 2014 +0200
permissive mode: allow reference frames to be used even if there were lost slices.
diff --git a/codec/decoder/core/src/manage_dec_ref.cpp b/codec/decoder/core/src/manage_dec_ref.cpp
index dcf61ca..5582ec9 100644
--- a/codec/decoder/core/src/manage_dec_ref.cpp
+++ b/codec/decoder/core/src/manage_dec_ref.cpp
@@ -165,6 +165,7 @@ int32_t WelsReorderRefList (PWelsDecoderContext pCtx) {
&& (pSliceHeader->iSpsId != ppRefList[i]->iSpsId)) { //check;
WelsLog (pCtx, WELS_LOG_WARNING, "WelsReorderRefList()-1::::BASE LAYER::::iSpsId:%d, ref_sps_id:%d\n",
pSliceHeader->iSpsId, ppRefList[i]->iSpsId);
+ return ERR_NONE;
pCtx->iErrorCode = dsNoParamSets; //cross-IDR reference frame selection, SHOULD request IDR.--
return ERR_INFO_REFERENCE_PIC_LOST;
} else {
commit a1f3b95ad18d0788c2c803fac80e78d6365673ce
Author: Simon Morlat <simon.morlat@linphone.org>
Date: Tue Apr 15 17:54:58 2014 +0200
permissive mode (2)
diff --git a/codec/decoder/core/src/decoder_core.cpp b/codec/decoder/core/src/decoder_core.cpp
index a14e971..e742dbf 100644
--- a/codec/decoder/core/src/decoder_core.cpp
+++ b/codec/decoder/core/src/decoder_core.cpp
@@ -1738,8 +1738,8 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, int3
if ((iLastIdD < 0) || //case 1: first layer
(iLastIdD == iCurrIdD)) { //case 2: same uiDId
InitDqLayerInfo (dq_cur, &pLayerInfo, pNalCur, pCtx->pDec);
-
- if (!dq_cur->sLayerInfo.pSps->bGapsInFrameNumValueAllowedFlag) {
+ if (0){
+ //if (!dq_cur->sLayerInfo.pSps->bGapsInFrameNumValueAllowedFlag) {
const bool kbIdrFlag = dq_cur->sLayerInfo.sNalHeaderExt.bIdrFlag
|| (dq_cur->sLayerInfo.sNalHeaderExt.sNalUnitHeader.eNalUnitType == NAL_UNIT_CODED_SLICE_IDR);
// Subclause 8.2.5.2 Decoding process for gaps in frame_num

View file

@ -1,41 +0,0 @@
diff -urN submodules/externals/x264/common/osdep.h.orig submodules/externals/x264/common/osdep.h
--- submodules/externals/x264/common/osdep.h.orig 2014-02-06 13:56:59.243663951 +0100
+++ submodules/externals/x264/common/osdep.h 2014-02-06 13:57:17.215685078 +0100
@@ -35,11 +35,6 @@
#include "config.h"
-#if !HAVE_LOG2F
-#define log2f(x) (logf(x)/0.693147180559945f)
-#define log2(x) (log(x)/0.693147180559945)
-#endif
-
#ifdef _WIN32
#include <io.h> // _setmode()
#include <fcntl.h> // _O_BINARY
@@ -55,6 +60,11 @@
#include <math.h>
#endif
+#if !HAVE_LOG2F
+#define log2f(x) (logf(x)/0.693147180559945f)
+#define log2(x) (log(x)/0.693147180559945)
+#endif
+
#if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && (ARCH_X86 || ARCH_X86_64)
#define HAVE_X86_INLINE_ASM 1
#endif
diff -urN submodules/externals/x264/configure.orig submodules/externals/x264/configure
--- submodules/externals/x264/configure.orig 2014-02-06 13:56:59.231663937 +0100
+++ submodules/externals/x264/configure 2014-02-06 13:57:17.219685083 +0100
@@ -816,10 +816,6 @@
fi
[ "$thread" != "no" ] && define HAVE_THREAD
-if cc_check "math.h" "-Werror" "return log2f(2);" ; then
- define HAVE_LOG2F
-fi
-
if [ "$vis" = "yes" ] ; then
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -I/usr/X11R6/include"

View file

@ -104,7 +104,7 @@ class AndroidPreparator(prepare.Preparator):
def __init__(self, targets=android_targets): def __init__(self, targets=android_targets):
prepare.Preparator.__init__(self, targets, default_targets=['armv7', 'arm64'], virtual_targets=android_virtual_targets) prepare.Preparator.__init__(self, targets, default_targets=['armv7', 'arm64'], virtual_targets=android_virtual_targets)
self.min_supported_ndk = 16 self.min_supported_ndk = 16
self.max_supported_ndk = 16 self.max_supported_ndk = 17
self.unsupported_ndk_version = None self.unsupported_ndk_version = None
self.min_cmake_version = "3.10" self.min_cmake_version = "3.10"
self.release_with_debug_info = True self.release_with_debug_info = True
@ -144,7 +144,7 @@ class AndroidPreparator(prepare.Preparator):
retval = True retval = True
ndk_build = find_executable('ndk-build') ndk_build = find_executable('ndk-build')
ndk_path = os.path.dirname(ndk_build) ndk_path = os.path.dirname(ndk_build)
# NDK prior to r11 had a RELEASE.TXT file holding the version number # NDK prior to r11 had a RELEASE.TXT file holding the version number
release_file = os.path.join(ndk_path, 'RELEASE.TXT') release_file = os.path.join(ndk_path, 'RELEASE.TXT')
if os.path.isfile(release_file): if os.path.isfile(release_file):
version = open(release_file).read().strip() version = open(release_file).read().strip()
@ -241,19 +241,18 @@ install: install-apk run-linphone
install-test: install-test:
\t$(MAKE) -C liblinphone_tester copy-libs \t$(MAKE) -C liblinphone_tester copy-libs
\t$(MAKE) -C liblinphone_tester copy-files \t$(MAKE) -C liblinphone_tester copy-files
\t./gradlew -b liblinphone_tester/build.gradle clean
\t./gradlew -b liblinphone_tester/build.gradle assembleDebug \t./gradlew -b liblinphone_tester/build.gradle assembleDebug
\t./gradlew -b liblinphone_tester/build.gradle installDebug \t./gradlew -b liblinphone_tester/build.gradle installDebug
java-clean: java-clean:
\t./gradlew clean \t./gradlew clean
$(TOPDIR)/res/raw/rootca.pem:
\tcp liblinphone-sdk/android-{first_arch}/share/linphone/rootca.pem $@
copy-libs: copy-libs:
\trm -rf liblinphone-sdk/res
\trm -rf libs-debug/armeabi \trm -rf libs-debug/armeabi
\trm -rf libs/armeabi \trm -rf libs/armeabi
\trm -rf src/linphone-wrapper && mkdir -p src/linphone-wrapper/
\tif test -d "liblinphone-sdk/android-arm"; then \\ \tif test -d "liblinphone-sdk/android-arm"; then \\
\t\tmkdir -p libs-debug/armeabi && \\ \t\tmkdir -p libs-debug/armeabi && \\
\t\tcp -f liblinphone-sdk/android-arm/lib/lib*.so libs-debug/armeabi && \\ \t\tcp -f liblinphone-sdk/android-arm/lib/lib*.so libs-debug/armeabi && \\
@ -269,6 +268,10 @@ copy-libs:
\t\tcp -f liblinphone-sdk/android-arm/bin/gdbserver libs/armeabi && \\ \t\tcp -f liblinphone-sdk/android-arm/bin/gdbserver libs/armeabi && \\
\t\tcp -f liblinphone-sdk/android-arm/bin/gdb.setup libs/armeabi; \\ \t\tcp -f liblinphone-sdk/android-arm/bin/gdb.setup libs/armeabi; \\
\tfi \tfi
\tif test -f "liblinphone-sdk/android-arm/lib/wrap.sh"; then \\
\t\tmkdir -p liblinphone-sdk/res/lib/armeabi && \\
\t\tcp -f liblinphone-sdk/android-arm/lib/wrap.sh liblinphone-sdk/res/lib/armeabi; \\
\tfi
\trm -rf libs-debug/armeabi-v7a \trm -rf libs-debug/armeabi-v7a
\trm -rf libs/armeabi-v7a \trm -rf libs/armeabi-v7a
\tif test -d "liblinphone-sdk/android-armv7"; then \\ \tif test -d "liblinphone-sdk/android-armv7"; then \\
@ -286,6 +289,10 @@ copy-libs:
\t\tcp -f liblinphone-sdk/android-armv7/bin/gdbserver libs/armeabi-v7a && \\ \t\tcp -f liblinphone-sdk/android-armv7/bin/gdbserver libs/armeabi-v7a && \\
\t\tcp -f liblinphone-sdk/android-armv7/bin/gdb.setup libs/armeabi-v7a; \\ \t\tcp -f liblinphone-sdk/android-armv7/bin/gdb.setup libs/armeabi-v7a; \\
\tfi \tfi
\tif test -f "liblinphone-sdk/android-armv7/lib/wrap.sh"; then \\
\t\tmkdir -p liblinphone-sdk/res/lib/armeabi-v7a && \\
\t\tcp -f liblinphone-sdk/android-armv7/lib/wrap.sh liblinphone-sdk/res/lib/armeabi-v7a; \\
\tfi
\trm -rf libs-debug/arm64-v8a \trm -rf libs-debug/arm64-v8a
\trm -rf libs/arm64-v8a \trm -rf libs/arm64-v8a
\tif test -d "liblinphone-sdk/android-arm64"; then \\ \tif test -d "liblinphone-sdk/android-arm64"; then \\
@ -303,6 +310,10 @@ copy-libs:
\t\tcp -f liblinphone-sdk/android-arm64/bin/gdbserver libs/arm64-v8a && \\ \t\tcp -f liblinphone-sdk/android-arm64/bin/gdbserver libs/arm64-v8a && \\
\t\tcp -f liblinphone-sdk/android-arm64/bin/gdb.setup libs/arm64-v8a; \\ \t\tcp -f liblinphone-sdk/android-arm64/bin/gdb.setup libs/arm64-v8a; \\
\tfi \tfi
\tif test -f "liblinphone-sdk/android-arm64/lib/wrap.sh"; then \\
\t\tmkdir -p liblinphone-sdk/res/lib/arm64-v8a && \\
\t\tcp -f liblinphone-sdk/android-arm64/lib/wrap.sh liblinphone-sdk/res/lib/arm64-v8a; \\
\tfi
\trm -rf libs-debug/x86 \trm -rf libs-debug/x86
\trm -rf libs/x86 \trm -rf libs/x86
\tif test -d "liblinphone-sdk/android-x86"; then \\ \tif test -d "liblinphone-sdk/android-x86"; then \\
@ -320,29 +331,9 @@ copy-libs:
\t\tcp -f liblinphone-sdk/android-x86/bin/gdbserver libs/x86 && \\ \t\tcp -f liblinphone-sdk/android-x86/bin/gdbserver libs/x86 && \\
\t\tcp -f liblinphone-sdk/android-x86/bin/gdb.setup libs/x86; \\ \t\tcp -f liblinphone-sdk/android-x86/bin/gdb.setup libs/x86; \\
\tfi \tfi
\tif test -d "liblinphone-sdk/android-arm/share/linphonej"; then \\ \tif test -f "liblinphone-sdk/android-x86/lib/wrap.sh"; then \\
\t\tcp -R liblinphone-sdk/android-arm/share/linphonej/java/* src/linphone-wrapper; \\ \t\tmkdir -p liblinphone-sdk/res/lib/x86 && \\
\tfi \t\tcp -f liblinphone-sdk/android-x86/lib/wrap.sh liblinphone-sdk/res/lib/x86; \\
\tif test -d "liblinphone-sdk/android-armv7/share/linphonej"; then \\
\t\tcp -R liblinphone-sdk/android-armv7/share/linphonej/java/* src/linphone-wrapper; \\
\tfi
\tif test -d "liblinphone-sdk/android-arm64/share/linphonej"; then \\
\t\tcp -R liblinphone-sdk/android-arm64/share/linphonej/java/* src/linphone-wrapper; \\
\tfi
\tif test -d "liblinphone-sdk/android-x86/share/linphonej"; then \\
\t\tcp -R liblinphone-sdk/android-x86/share/linphonej/java/* src/linphone-wrapper; \\
\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 \tfi
copy-libs-mediastreamer: copy-libs-mediastreamer:
@ -371,7 +362,7 @@ copy-libs-mediastreamer:
\t\tsh WORK/android-x86/strip.sh submodules/mediastreamer2/java/libs/x86/*.so; \\ \t\tsh WORK/android-x86/strip.sh submodules/mediastreamer2/java/libs/x86/*.so; \\
\tfi \tfi
generate-apk: java-clean build copy-libs $(TOPDIR)/res/raw/rootca.pem generate-apk: java-clean build copy-libs
\t./gradlew assembleDebug \t./gradlew assembleDebug
quick: clean install-apk run-linphone quick: clean install-apk run-linphone
@ -388,25 +379,32 @@ release: java-clean build copy-libs
unsigned: java-clean build copy-libs unsigned: java-clean build copy-libs
\t./gradlew assemblePackaged \t./gradlew assemblePackaged
generate-sdk: liblinphone-android-sdk generate-release-sdk: liblinphone-android-sdk-release
generate-sdk: liblinphone-android-sdk-debug
generate-javadoc: generate-javadoc:
\t./gradlew -b libLinphoneAndroidSdk.gradle androidJavadocsJar \t./gradlew -q androidJavadocsJar
\t./gradlew -b libLinphoneAndroidSdk.gradle sourcesJar \t./gradlew -q sourcesJar
liblinphone-android-sdk: java-clean build copy-libs $(TOPDIR)/res/raw/rootca.pem debug-sdk: java-clean build copy-libs generate-javadoc generate-apk
\t./gradlew -b libLinphoneAndroidSdk.gradle androidJavadocsJar \t./gradlew -q sdkZip
\t./gradlew -b libLinphoneAndroidSdk.gradle sourcesJar
\t./gradlew -b libLinphoneAndroidSdk.gradle assembleRelease
\t@mv $(TOPDIR)/bin/outputs/aar/*.aar $(TOPDIR)/bin/outputs/aar/liblinphone-sdk.aar
\t./gradlew -b libLinphoneAndroidSdk.gradle sdkZip
linphone-android-sdk: java-clean build copy-libs $(TOPDIR)/res/raw/rootca.pem liblinphone-android-sdk: java-clean build copy-libs generate-javadoc release
\t./gradlew -q sdkZip
linphone-android-sdk: java-clean build copy-libs
\t./gradlew -b linphoneAndroidSdk.gradle androidJavadocsJar \t./gradlew -b linphoneAndroidSdk.gradle androidJavadocsJar
\t./gradlew -b linphoneAndroidSdk.gradle sourcesJar \t./gradlew -b linphoneAndroidSdk.gradle sourcesJar
linphone-android-sdk-release: linphone-android-sdk
\t./gradlew -b linphoneAndroidSdk.gradle assembleRelease \t./gradlew -b linphoneAndroidSdk.gradle assembleRelease
\t./gradlew -b linphoneAndroidSdk.gradle sdkZip \t./gradlew -b linphoneAndroidSdk.gradle sdkZip
linphone-android-sdk-debug: linphone-android-sdk
\t./gradlew -b linphoneAndroidSdk.gradle debugRelease
\t./gradlew -b linphoneAndroidSdk.gradle sdkZip
mediastreamer2-sdk: build copy-libs-mediastreamer mediastreamer2-sdk: build copy-libs-mediastreamer
\t@cd $(TOPDIR)/submodules/mediastreamer2/java && \\ \t@cd $(TOPDIR)/submodules/mediastreamer2/java && \\
\t./gradlew -b mediastreamerSdk.gradle assembleRelease \t./gradlew -b mediastreamerSdk.gradle assembleRelease

View file

@ -140,7 +140,7 @@
android:text="@string/sent"/> android:text="@string/sent"/>
<ImageView <ImageView
android:visibility="gone" android:visibility="invisible"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="5dp" android:padding="5dp"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -16,6 +16,7 @@
<string name="sync_account_name">جهات اتصال لِنْفُونْ</string> <string name="sync_account_name">جهات اتصال لِنْفُونْ</string>
<!--Common--> <!--Common-->
<string name="username">اسم المستخدم</string> <string name="username">اسم المستخدم</string>
<string name="userid">معرِّف المستخدم (اختياري)</string>
<string name="phone_number">رقم الهاتف</string> <string name="phone_number">رقم الهاتف</string>
<string name="display_name">الاسم المعروض</string> <string name="display_name">الاسم المعروض</string>
<string name="password">كلمة السر</string> <string name="password">كلمة السر</string>
@ -110,6 +111,7 @@
<string name="use_email_for_validation">استخدم عنوان البريد الإلكتروني لتأكيد الحساب</string> <string name="use_email_for_validation">استخدم عنوان البريد الإلكتروني لتأكيد الحساب</string>
<string name="login_with_username">استعمل اسم المستخدم وكلمة السر عوضا عن رقم هاتفك</string> <string name="login_with_username">استعمل اسم المستخدم وكلمة السر عوضا عن رقم هاتفك</string>
<string name="phone_number_info_title">لأي غرض سيجري استخدام رقم هاتفي ؟</string> <string name="phone_number_info_title">لأي غرض سيجري استخدام رقم هاتفي ؟</string>
<string name="phone_number_info_content">\nبفضل رقم هاتفك، يستطيع أصدقاؤك العثور عليك بسهولة.\n\nسوف ترى في دفتر عناوينك من يستخدم لِنْفُونْ كما سيتمكن أصدقاؤك كذلك من الوصول إليك عبر لِنْفُونْ.\n</string>
<string name="phone_number_link_info_content"> <string name="phone_number_link_info_content">
\nسيجدك أصدقاؤك بسهولة إن ربطت حسابك برقم هاتفك\\n\nسوف تجد في دفتر عناوينك من يستخدم لِنْفُونْ وسيتمكن أصدقاؤك من الوصول إليك بواسطة لِنْفُونْ كذلك.لِنْفُونْ.\n</string> \nسيجدك أصدقاؤك بسهولة إن ربطت حسابك برقم هاتفك\\n\nسوف تجد في دفتر عناوينك من يستخدم لِنْفُونْ وسيتمكن أصدقاؤك من الوصول إليك بواسطة لِنْفُونْ كذلك.لِنْفُونْ.\n</string>
<string name="phone_number_link_info_content_already_account">يمكنك استخدام رقم هاتفي واحد مع حساب لنفون واحد.\n\nإن ربطت رقم هاتفك مع حساب آخر لكنك تود استخدام هذا الحساب، يمكنك ببساطة ربطه مع رقم هاتفك تلقائيا وسيُنقَل هذا الأخير إلى هذا الحساب.</string> <string name="phone_number_link_info_content_already_account">يمكنك استخدام رقم هاتفي واحد مع حساب لنفون واحد.\n\nإن ربطت رقم هاتفك مع حساب آخر لكنك تود استخدام هذا الحساب، يمكنك ببساطة ربطه مع رقم هاتفك تلقائيا وسيُنقَل هذا الأخير إلى هذا الحساب.</string>
@ -178,6 +180,7 @@
<string name="displayed">قُرِأ</string> <string name="displayed">قُرِأ</string>
<string name="delivered">سُلِّم</string> <string name="delivered">سُلِّم</string>
<string name="resend">أعد اﻹرسال</string> <string name="resend">أعد اﻹرسال</string>
<string name="error_opening_file">حدث خطأ خلال فتح هذا الملف.</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">مُسجَّل</string> <string name="status_connected">مُسجَّل</string>
<string name="status_not_connected">غير مُسجَّل</string> <string name="status_not_connected">غير مُسجَّل</string>
@ -207,9 +210,12 @@
<string name="call_stats_ip">صنف IP :</string> <string name="call_stats_ip">صنف IP :</string>
<string name="call_stats_upload">صبيب الرفع :</string> <string name="call_stats_upload">صبيب الرفع :</string>
<string name="call_stats_download">صبيب التنزيل :</string> <string name="call_stats_download">صبيب التنزيل :</string>
<string name="call_stats_estimated_download">تقدير صبيب التنزيل :</string>
<string name="call_stats_ice">توصيل ICE :</string> <string name="call_stats_ice">توصيل ICE :</string>
<string name="call_stats_video_resolution_sent">دقة الفيديو المُرسَل :</string> <string name="call_stats_video_resolution_sent">دقة الفيديو المُرسَل :</string>
<string name="call_stats_video_resolution_received">دقة الفيديو المُستلَم :</string> <string name="call_stats_video_resolution_received">دقة الفيديو المُستلَم :</string>
<string name="call_stats_video_fps_sent">معدل عرض الفيديو المُرسَل :</string>
<string name="call_stats_video_fps_received">معدل عرض الفيديو المُستلَم : </string>
<string name="call_stats_sender_loss_rate">معدل ضياع المُرسِل :</string> <string name="call_stats_sender_loss_rate">معدل ضياع المُرسِل :</string>
<string name="call_stats_receiver_loss_rate">معدل ضياع المتلقي :</string> <string name="call_stats_receiver_loss_rate">معدل ضياع المتلقي :</string>
<string name="call_stats_jitter_buffer">صِوان الارتعاش :</string> <string name="call_stats_jitter_buffer">صِوان الارتعاش :</string>
@ -330,7 +336,9 @@
<string name="pref_auto_answer_time">مهلة التشغيل التلقائي (بالميلي-ثواني)</string> <string name="pref_auto_answer_time">مهلة التشغيل التلقائي (بالميلي-ثواني)</string>
<string name="pref_rfc2833_dtmf">أرسل DTMF مع التدفق (RFC2833)</string> <string name="pref_rfc2833_dtmf">أرسل DTMF مع التدفق (RFC2833)</string>
<string name="pref_sipinfo_dtmf">أرسل DTMF خارج التدفق (SIP INFO)</string> <string name="pref_sipinfo_dtmf">أرسل DTMF خارج التدفق (SIP INFO)</string>
<string name="pref_call_timeout_title">مهلة المكالمة (بالثواني)</string>
<string name="pref_voice_mail">عنوان العلبة الصوتية</string> <string name="pref_voice_mail">عنوان العلبة الصوتية</string>
<string name="pref_dialer_call">استخدمْ لِنْفُونْ كتطبيق هاتفك الافتراضي</string>
<!--Chat settings--> <!--Chat settings-->
<string name="pref_chat_title">المحادثة</string> <string name="pref_chat_title">المحادثة</string>
<string name="pref_image_sharing_server_title">خادم المشاركة</string> <string name="pref_image_sharing_server_title">خادم المشاركة</string>

View file

@ -158,6 +158,8 @@ Vos amis pourront vous joindre plus facilement si vous associez votre compte à
<string name="delete_conversation">Voulez-vous supprimer la discussion sélectionnée ?</string> <string name="delete_conversation">Voulez-vous supprimer la discussion sélectionnée ?</string>
<string name="delete_message">Voulez-vous supprimer le message sélectionné ?</string> <string name="delete_message">Voulez-vous supprimer le message sélectionné ?</string>
<string name="remote_composing">Votre correspondant est en train de taper...</string> <string name="remote_composing">Votre correspondant est en train de taper...</string>
<string name="remote_composing_single">%s écrit</string>
<string name="remote_composing_multiple">%s écrivent</string>
<string name="share_picture_size_small">Petite</string> <string name="share_picture_size_small">Petite</string>
<string name="share_picture_size_medium">Moyenne</string> <string name="share_picture_size_medium">Moyenne</string>
<string name="share_picture_size_large">Grande</string> <string name="share_picture_size_large">Grande</string>
@ -176,30 +178,29 @@ Vos amis pourront vous joindre plus facilement si vous associez votre compte à
<string name="processing_image">Traitement de l\'image, cela peut prendre quelques secondes selon sa taille</string> <string name="processing_image">Traitement de l\'image, cela peut prendre quelques secondes selon sa taille</string>
<string name="displayed">Lu</string> <string name="displayed">Lu</string>
<string name="delivered">Reçu</string> <string name="delivered">Reçu</string>
<string name="undelivered">Reçu</string>
<string name="sent">Envoyé</string> <string name="sent">Envoyé</string>
<string name="resend">Renvoyer</string> <string name="resend">Renvoyer</string>
<string name="error_opening_file">Une erreur est survenue en tentant d\'ouvrir ce fichier.</string>
<string name="conversation_information">Infos</string> <string name="conversation_information">Infos</string>
<string name="administrator">Admin</string> <string name="administrator">Admin</string>
<string name="conversation_subject_hint">Nommez ce groupe</string> <string name="conversation_subject_hint">Nommer le groupe</string>
<string name="chat_room_infos_title">Infos</string> <string name="chat_room_infos_title">Infos</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">Quitter le groupe</string> <string name="chat_room_leave_group">Quitter le groupe</string>
<string name="chat_room_creation_filter_hint">Filtrer les contacts</string> <string name="chat_room_creation_filter_hint">Rechercher un contact</string>
<string name="conference_created">groupe créé</string> <string name="conference_created">Vous avez rejoint le groupe</string>
<string name="conference_destroyed">groupe détruit</string> <string name="conference_destroyed">Vous avez quitté le groupe</string>
<string name="participant_added">%s a été ajouté</string> <string name="participant_added">%s a rejoint le groupe</string>
<string name="participant_removed">%s a quitté</string> <string name="participant_removed">%s a quitté le groupe</string>
<string name="device_added">nouvel appareil pour %s</string> <string name="subject_changed">Nouveau sujet : %s</string>
<string name="device_removed">appareil de %s retiré</string> <string name="admin_set">%s est devenu(e) admin</string>
<string name="subject_changed">nouveau sujet : %s</string>
<string name="admin_set">%s est admin</string>
<string name="admin_unset">%s n\'est plus admin</string> <string name="admin_unset">%s n\'est plus admin</string>
<string name="chat_room_leave_dialog">Souhaitez-vous vraiment quitter ce groupe ?</string> <string name="chat_room_you_are_now_admin">Vous êtes maintenant admin</string>
<string name="chat_room_leave_dialog">Voulez vous vraiment quitter cette conversation ?</string>
<string name="chat_room_leave_button">Quitter</string> <string name="chat_room_leave_button">Quitter</string>
<string name="chat_room_delete_dialog">Voulez-vous supprimer et quitter les discussions sélectionnées ?</string> <string name="chat_room_delete_dialog">Voulez vous vraiment quitter et supprimer les conversations selectionnées ?</string>
<string name="separator">&#160;:&#160;</string> <string name="imdn_info">Etat du message</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Enregistré</string> <string name="status_connected">Enregistré</string>
<string name="status_not_connected">Non enregistré</string> <string name="status_not_connected">Non enregistré</string>

View file

@ -11,10 +11,12 @@
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string> <string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string> <string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">GNU General Public License V2\n © 2010-2017 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string> <string name="about_link">www.linphone.org</string>
<string name="sync_account_name">linphoneに問い合わせる</string> <string name="sync_account_name">linphoneに問い合わせる</string>
<!--Common--> <!--Common-->
<string name="username">ユーザー名</string> <string name="username">ユーザー名</string>
<string name="userid">ユーザID(オプション)</string>
<string name="phone_number">電話番号</string> <string name="phone_number">電話番号</string>
<string name="display_name">表示名</string> <string name="display_name">表示名</string>
<string name="password">パスワード</string> <string name="password">パスワード</string>
@ -44,6 +46,7 @@
<string name="maybe_later">また今度</string> <string name="maybe_later">また今度</string>
<string name="later">そのうち</string> <string name="later">そのうち</string>
<string name="no">いいえ</string> <string name="no">いいえ</string>
<string name="ok">OK</string>
<string name="yes">はい</string> <string name="yes">はい</string>
<string name="link_account">アカウントをリンクする</string> <string name="link_account">アカウントをリンクする</string>
<!--Launch screen--> <!--Launch screen-->
@ -85,6 +88,8 @@
<string name="assistant_error_bad_credentials">ユーザー名かパスワードが異なります</string> <string name="assistant_error_bad_credentials">ユーザー名かパスワードが異なります</string>
<string name="assistant_codec_down_question">Cisco Systems,Incが提供するOpenH264ビデオコーデックをダウンロードしますか</string> <string name="assistant_codec_down_question">Cisco Systems,Incが提供するOpenH264ビデオコーデックをダウンロードしますか</string>
<string name="assistant_codec_downloading">Cisco Systems,Incが提供するOpenH264ビデオコーデックをダウンロードします。</string> <string name="assistant_codec_downloading">Cisco Systems,Incが提供するOpenH264ビデオコーデックをダウンロードします。</string>
<string name="assistant_openh264_downloading">OpenH264をダウンロードしています。</string>
<string name="assistant_openh264_restart">OpenH264コーデックを使うためには再起動する必要があります%s</string>
<string name="assistant_codec_downloaded">Cisco Systems,Incが提供するOpenH264ビデオコーデックがダウンロードされました。</string> <string name="assistant_codec_downloaded">Cisco Systems,Incが提供するOpenH264ビデオコーデックがダウンロードされました。</string>
<string name="wizard_failed">エラーが発生しました。のちほど再試行してください。</string> <string name="wizard_failed">エラーが発生しました。のちほど再試行してください。</string>
<string name="wizard_server_unavailable">ネットワーク接続を確認してください。</string> <string name="wizard_server_unavailable">ネットワーク接続を確認してください。</string>
@ -164,7 +169,10 @@
<string name="image_saved">保存した画像</string> <string name="image_saved">保存した画像</string>
<string name="image_not_saved">エラー、画像が保存できません。</string> <string name="image_not_saved">エラー、画像が保存できません。</string>
<string name="wait">お待ちください...</string> <string name="wait">お待ちください...</string>
<string name="message_not_encrypted">このメッセージは暗号化されていません。</string>
<string name="message_cant_be_decrypted_notif">このメッセージを復号化することが出来ませんでした。</string>
<string name="processing_image">画像の処理は、ファイルサイズによっては数秒かかることがあります</string> <string name="processing_image">画像の処理は、ファイルサイズによっては数秒かかることがあります</string>
<string name="resend">再送信</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">登録済</string> <string name="status_connected">登録済</string>
<string name="status_not_connected">登録なし</string> <string name="status_not_connected">登録なし</string>
@ -191,6 +199,8 @@
<string name="call_stats_ice">ICE 接続:</string> <string name="call_stats_ice">ICE 接続:</string>
<string name="call_stats_video_resolution_sent">送信ビデオ解像度:</string> <string name="call_stats_video_resolution_sent">送信ビデオ解像度:</string>
<string name="call_stats_video_resolution_received">受信ビデオ解像度:</string> <string name="call_stats_video_resolution_received">受信ビデオ解像度:</string>
<string name="call_stats_video_fps_sent">送信ビデオfps:</string>
<string name="call_stats_video_fps_received">受信ビデオfps:</string>
<string name="call_stats_sender_loss_rate">送信ロス:</string> <string name="call_stats_sender_loss_rate">送信ロス:</string>
<string name="call_stats_receiver_loss_rate">受信ロス:</string> <string name="call_stats_receiver_loss_rate">受信ロス:</string>
<string name="call_stats_encoder_name">エンコーダー:</string> <string name="call_stats_encoder_name">エンコーダー:</string>
@ -216,6 +226,7 @@
<string name="error_user_busy">ビジーです</string> <string name="error_user_busy">ビジーです</string>
<string name="error_user_not_found">ユーザーがおりません</string> <string name="error_user_not_found">ユーザーがおりません</string>
<string name="error_incompatible_media">互換性のないメディアパラメーター</string> <string name="error_incompatible_media">互換性のないメディアパラメーター</string>
<string name="error_low_bandwidth">あなたの相手の通信幅が狭いのでビデオが使えません</string>
<string name="error_network_unreachable">ネットワークに到達できません</string> <string name="error_network_unreachable">ネットワークに到達できません</string>
<string name="error_bad_credentials">不正な証明書です</string> <string name="error_bad_credentials">不正な証明書です</string>
<string name="error_unauthorized">無断</string> <string name="error_unauthorized">無断</string>
@ -309,6 +320,7 @@
<string name="pref_rfc2833_dtmf">DTMFをインバンド(RFC2833)で送信する</string> <string name="pref_rfc2833_dtmf">DTMFをインバンド(RFC2833)で送信する</string>
<string name="pref_sipinfo_dtmf">DTMFをSIP(情報)で送信する</string> <string name="pref_sipinfo_dtmf">DTMFをSIP(情報)で送信する</string>
<string name="pref_voice_mail">音声メールのURI</string> <string name="pref_voice_mail">音声メールのURI</string>
<string name="pref_dialer_call">Linphoneを標準の電話アプリとして使う</string>
<!--Chat settings--> <!--Chat settings-->
<string name="pref_chat_title">チャット</string> <string name="pref_chat_title">チャット</string>
<string name="pref_image_sharing_server_title">共有サーバー</string> <string name="pref_image_sharing_server_title">共有サーバー</string>

View file

@ -29,6 +29,7 @@
<string name="retry">Повторить</string> <string name="retry">Повторить</string>
<string name="cancel">Отменить</string> <string name="cancel">Отменить</string>
<string name="accept">Принять</string> <string name="accept">Принять</string>
<string name="open">Открыть</string>
<string name="continue_text">Продолжить</string> <string name="continue_text">Продолжить</string>
<string name="about">О программе</string> <string name="about">О программе</string>
<string name="deny">Отклонить</string> <string name="deny">Отклонить</string>
@ -67,19 +68,19 @@
<string name="assistant_remote_provisioning_desc">Укажите URL-адрес конфигурации</string> <string name="assistant_remote_provisioning_desc">Укажите URL-адрес конфигурации</string>
<string name="transport">Транспорт</string> <string name="transport">Транспорт</string>
<string name="assistant_create_account_phone_number_address">Ваш SIP-адрес</string> <string name="assistant_create_account_phone_number_address">Ваш SIP-адрес</string>
<string name="assistant_login_linphone">Использовать учетную запись Linphone</string> <string name="assistant_login_linphone">Использовать аккаунт Linphone</string>
<string name="assistant_login_generic">Использовать учетную запись SIP</string> <string name="assistant_login_generic">Использовать SIP-аккаунт</string>
<string name="assistant_remote_provisioning">Выбор удаленной конфигурации</string> <string name="assistant_remote_provisioning">Удаленная конфигурация</string>
<string name="assistant_create_account_part_1">Подтвердите код страны и введите свой номер телефона</string> <string name="assistant_create_account_part_1">Подтвердите код страны и введите свой номер телефона</string>
<string name="assistant_create_account_part_2">Мы отправили SMS-сообщение с кодом подтверждения на ваш номер телефона:</string> <string name="assistant_create_account_part_2">Мы отправили SMS-сообщение с кодом подтверждения на ваш номер телефона:</string>
<string name="assistant_create_account_part_3">Чтобы завершить проверку номера телефона, введите 4-значный код ниже:\n</string> <string name="assistant_create_account_part_3">Чтобы завершить проверку номера телефона, введите 4-значный код ниже:\n</string>
<string name="assistant_create_account_part_email">Введите имя пользователя, адрес электронной почты и пароль для вашей учетной записи Linphone</string> <string name="assistant_create_account_part_email">Введите имя пользователя, адрес электронной почты и пароль для вашей учетной записи Linphone</string>
<string name="assistant_display_name_optional">Отображаемое имя (необязательно)</string> <string name="assistant_display_name_optional">Отображаемое имя (необязательно)</string>
<string name="assistant_linphone_account">Использовать учетную запись Linphone</string> <string name="assistant_linphone_account">Использовать аккаунт Linphone</string>
<string name="assistant_generic_account">Использовать учетную запись SIP</string> <string name="assistant_generic_account">Использовать SIP-аккаунт</string>
<string name="assistant_remote_provisioning_title">Выбор удаленной конфигурации</string> <string name="assistant_remote_provisioning_title">Удаленная конфигурация</string>
<string name="assistant_fetch_apply">Получить и применить</string> <string name="assistant_fetch_apply">Получить и применить</string>
<string name="assistant_login">Имя пользователя</string> <string name="assistant_login">Авторизация</string>
<string name="assistant_ec_calibration">Выполняется калибровка эхоподавления</string> <string name="assistant_ec_calibration">Выполняется калибровка эхоподавления</string>
<string name="assistant_remote_provisioning_login">Введите имя пользователя</string> <string name="assistant_remote_provisioning_login">Введите имя пользователя</string>
<string name="assistant_account_not_validated">Ваша учетная запись еще не проверена.</string> <string name="assistant_account_not_validated">Ваша учетная запись еще не проверена.</string>
@ -111,6 +112,7 @@
<string name="use_email_for_validation">Использовать адрес электронной почты для проверки учетной записи</string> <string name="use_email_for_validation">Использовать адрес электронной почты для проверки учетной записи</string>
<string name="login_with_username">Вместо номера телефона использовать имя пользователя и пароль</string> <string name="login_with_username">Вместо номера телефона использовать имя пользователя и пароль</string>
<string name="phone_number_info_title">Для чего будет использоваться мой номер телефона?</string> <string name="phone_number_info_title">Для чего будет использоваться мой номер телефона?</string>
<string name="phone_number_info_content">\nВашим друзьям будет проще связаться с вами, если вы свяжете свою учетную запись со своим номером телефона.\n\n В вашей адресной книге вы увидите, кто использует Linphone, а ваши друзья смогут узнать, что вы также зарегистрированы в Linphone.\n</string>
<string name="phone_number_link_info_content">\nВашим друзьям будет проще связаться с вами, если вы свяжете свою учетную запись со своим номером телефона.\n\nВ вашей адресной книге вы увидите, кто использует Linphone, а ваши друзья смогут узнать, что вы также зарегистрированы в Linphone.\n</string> <string name="phone_number_link_info_content">\nВашим друзьям будет проще связаться с вами, если вы свяжете свою учетную запись со своим номером телефона.\n\nВ вашей адресной книге вы увидите, кто использует Linphone, а ваши друзья смогут узнать, что вы также зарегистрированы в Linphone.\n</string>
<string name="phone_number_link_info_content_already_account">Номер телефона можно использовать только с одной учетной записью Linphone.\n\nЕсли ваш номер уже был связан с другой учетной записью, но вы предпочитаете использовать его, просто свяжите его сейчас, и ваш номер будет автоматически перенесен в эту учетную запись.</string> <string name="phone_number_link_info_content_already_account">Номер телефона можно использовать только с одной учетной записью Linphone.\n\nЕсли ваш номер уже был связан с другой учетной записью, но вы предпочитаете использовать его, просто свяжите его сейчас, и ваш номер будет автоматически перенесен в эту учетную запись.</string>
<!--Status--> <!--Status-->
@ -159,6 +161,8 @@
<string name="delete_conversation">Вы действительно хотите удалить выбранный разговор?</string> <string name="delete_conversation">Вы действительно хотите удалить выбранный разговор?</string>
<string name="delete_message">Вы действительно хотите удалить выбранное сообщение?</string> <string name="delete_message">Вы действительно хотите удалить выбранное сообщение?</string>
<string name="remote_composing">Собеседник пишет...</string> <string name="remote_composing">Собеседник пишет...</string>
<string name="remote_composing_single">%s печатает...</string>
<string name="remote_composing_multiple">%s печатают...</string>
<string name="share_picture_size_small">Маленький</string> <string name="share_picture_size_small">Маленький</string>
<string name="share_picture_size_medium">Средний</string> <string name="share_picture_size_medium">Средний</string>
<string name="share_picture_size_large">Большой</string> <string name="share_picture_size_large">Большой</string>
@ -177,7 +181,28 @@
<string name="processing_image">Обработка изображения может занять несколько секунд в зависимости от размера файла</string> <string name="processing_image">Обработка изображения может занять несколько секунд в зависимости от размера файла</string>
<string name="displayed">Прочитано</string> <string name="displayed">Прочитано</string>
<string name="delivered">Доставлено</string> <string name="delivered">Доставлено</string>
<string name="undelivered">Не доставлено</string>
<string name="sent">Отправлено</string>
<string name="resend">Переслать</string> <string name="resend">Переслать</string>
<string name="error_opening_file">При открытии этого файла возникает ошибка.</string>
<string name="conversation_information">Информация</string>
<string name="administrator">Администратор</string>
<string name="chat_room_infos_title">Информация</string>
<string name="chat_room_infos_admin">Администратор</string>
<string name="chat_room_participants">Участники</string>
<string name="chat_room_leave_group">Покинуть группу</string>
<string name="device_added">новое устройство для %s</string>
<string name="device_removed">устройство для %s удалено</string>
<string name="subject_changed">новая тема: %s</string>
<string name="admin_set">%s это администратор</string>
<string name="admin_unset">%s больше не администратор</string>
<string name="group_chat_notif" formatted="false">%1: %2</string>
<string name="chat_room_you_are_now_admin">Теперь вы администратор</string>
<string name="chat_room_you_are_no_longer_admin">Вы больше не администратор</string>
<string name="chat_room_creation_failed">Не удалось создать чат-комнату</string>
<string name="chat_room_leave_button">Покинуть</string>
<string name="separator">: </string>
<string name="imdn_info">Статус доставки</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Зарегистрирован</string> <string name="status_connected">Зарегистрирован</string>
<string name="status_not_connected">Не зарегистрирован</string> <string name="status_not_connected">Не зарегистрирован</string>
@ -233,6 +258,7 @@
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">Предупреждение: служба не готова</string> <string name="skipable_error_service_not_ready">Предупреждение: служба не готова</string>
<string name="error">Ошибка</string> <string name="error">Ошибка</string>
<string name="file_transfer_error">Ошибка передачи файла</string>
<string name="warning_wrong_destination_address">Невозможно создать адрес назначения из %s</string> <string name="warning_wrong_destination_address">Невозможно создать адрес назначения из %s</string>
<string name="error_unknown">Неизвестная ошибка</string> <string name="error_unknown">Неизвестная ошибка</string>
<string name="error_call_declined">Вызов отклонен</string> <string name="error_call_declined">Вызов отклонен</string>
@ -245,7 +271,7 @@
<string name="error_unauthorized">Неавторизован</string> <string name="error_unauthorized">Неавторизован</string>
<string name="error_io_error">Ошибка сети</string> <string name="error_io_error">Ошибка сети</string>
<string name="download_image_failed">Загрузка не удалась. Проверьте сетевое подключение или повторите попытку позже.</string> <string name="download_image_failed">Загрузка не удалась. Проверьте сетевое подключение или повторите попытку позже.</string>
<string name="remote_provisioning_failure">Не удалось загрузить или применить профиль удаленного конфигурирования...</string> <string name="remote_provisioning_failure">Не удалось загрузить или применить профиль удаленной конфигурации...</string>
<string name="remote_provisioning_again_title">Удаленное конфигурирование</string> <string name="remote_provisioning_again_title">Удаленное конфигурирование</string>
<string name="remote_provisioning_again_message">Вы хотите изменить URI конфигурирования?</string> <string name="remote_provisioning_again_message">Вы хотите изменить URI конфигурирования?</string>
<!--Account Settings--> <!--Account Settings-->
@ -280,6 +306,7 @@
<string name="pref_change_password">Изменить пароль</string> <string name="pref_change_password">Изменить пароль</string>
<string name="pref_default_account">Использовать по умолчанию</string> <string name="pref_default_account">Использовать по умолчанию</string>
<string name="pref_password_changed">Пароль изменен</string> <string name="pref_password_changed">Пароль изменен</string>
<string name="pref_proxy_push_notif">Разрешить push-уведомление</string>
<!--Settings--> <!--Settings-->
<string name="pref_sipaccounts">Учетные записи SIP</string> <string name="pref_sipaccounts">Учетные записи SIP</string>
<string name="default_account_flag">Учетная запись по умолчанию</string> <string name="default_account_flag">Учетная запись по умолчанию</string>
@ -335,6 +362,7 @@
<string name="pref_sipinfo_dtmf">Отправить вне потока DTMFs(SIP INFO)</string> <string name="pref_sipinfo_dtmf">Отправить вне потока DTMFs(SIP INFO)</string>
<string name="pref_call_timeout_title">Таймаут вызова(в секундах)</string> <string name="pref_call_timeout_title">Таймаут вызова(в секундах)</string>
<string name="pref_voice_mail">URI голосовой почты</string> <string name="pref_voice_mail">URI голосовой почты</string>
<string name="pref_dialer_call">Использовать Linphone в качестве приложения для звонков по умолчанию.</string>
<!--Chat settings--> <!--Chat settings-->
<string name="pref_chat_title">Чат</string> <string name="pref_chat_title">Чат</string>
<string name="pref_image_sharing_server_title">Сервер обмена</string> <string name="pref_image_sharing_server_title">Сервер обмена</string>
@ -367,6 +395,7 @@
<string name="pref_advanced_title">Дополнительно</string> <string name="pref_advanced_title">Дополнительно</string>
<string name="pref_debug_title">Отладка</string> <string name="pref_debug_title">Отладка</string>
<string name="pref_debug">Отладка</string> <string name="pref_debug">Отладка</string>
<string name="pref_java_debug">Использовать Java-регистратор</string>
<string name="pref_friendlist_subscribe">Подписка</string> <string name="pref_friendlist_subscribe">Подписка</string>
<string name="pref_background_mode">Фоновый режим</string> <string name="pref_background_mode">Фоновый режим</string>
<string name="pref_animation_enable_title">Включить анимацию</string> <string name="pref_animation_enable_title">Включить анимацию</string>
@ -458,4 +487,6 @@
<string name="content_description_exit_conference">Выйти из конференции</string> <string name="content_description_exit_conference">Выйти из конференции</string>
<string name="content_title_notification_service">Служба Linphone</string> <string name="content_title_notification_service">Служба Linphone</string>
<string name="content_title_notification">Уведомление Linphone</string> <string name="content_title_notification">Уведомление Linphone</string>
<string name="content_description_conversation_subject">Тема группового чата</string>
<string name="content_description_conversation_infos">Информация о групповом чате</string>
</resources> </resources>

View file

@ -111,6 +111,7 @@
<string name="use_email_for_validation">Använd e-postadress för kontovalidering</string> <string name="use_email_for_validation">Använd e-postadress för kontovalidering</string>
<string name="login_with_username">Använd ditt användarnamn och lösenord istället för ditt telefonnummer</string> <string name="login_with_username">Använd ditt användarnamn och lösenord istället för ditt telefonnummer</string>
<string name="phone_number_info_title">Vad ska mitt telefonnummer användas för?</string> <string name="phone_number_info_title">Vad ska mitt telefonnummer användas för?</string>
<string name="phone_number_info_content">\nTack vare ditt telefonnummer kommer dina vänner att hitta dig lättare.\n\n Du kommer att se i din adressbok vem som använder Linphone och dina vänner kommer veta att de kan nå dig på Linphone också.\n</string>
<string name="phone_number_link_info_content">\nDina vänner hittar dig lättare om du kopplar ditt konto till ditt telefonnummer\n\nDu ser i din adressbok vilka som använder Linphone och dina vänner vet att de når dig på Linphone också.\n</string> <string name="phone_number_link_info_content">\nDina vänner hittar dig lättare om du kopplar ditt konto till ditt telefonnummer\n\nDu ser i din adressbok vilka som använder Linphone och dina vänner vet att de når dig på Linphone också.\n</string>
<string name="phone_number_link_info_content_already_account">Du kan bara använda ditt telefonnummer med ett Linphone-konto.\n\nOm du redan har länkat ditt nummer till ett annat konto, men du föredrar att använda det här, kopplar du bara det nu och ditt nummer flyttas automatiskt till det här kontot.</string> <string name="phone_number_link_info_content_already_account">Du kan bara använda ditt telefonnummer med ett Linphone-konto.\n\nOm du redan har länkat ditt nummer till ett annat konto, men du föredrar att använda det här, kopplar du bara det nu och ditt nummer flyttas automatiskt till det här kontot.</string>
<!--Status--> <!--Status-->
@ -140,8 +141,8 @@
<!--Dailer--> <!--Dailer-->
<string name="address_bar_hint">Ange ett nummer eller en adress</string> <string name="address_bar_hint">Ange ett nummer eller en adress</string>
<!--History--> <!--History-->
<string name="no_call_history">Inget samtal i din historia</string> <string name="no_call_history">Inga samtal i din historik</string>
<string name="no_missed_call_history">Inget missat samtal i din historia</string> <string name="no_missed_call_history">Inga missade samtal i din historik</string>
<string name="delete_history_log">Vill du ta bort vald samtalslog?</string> <string name="delete_history_log">Vill du ta bort vald samtalslog?</string>
<string name="today">Idag</string> <string name="today">Idag</string>
<string name="yesterday">Igår</string> <string name="yesterday">Igår</string>
@ -178,6 +179,7 @@
<string name="displayed">Läs</string> <string name="displayed">Läs</string>
<string name="delivered">Levererades</string> <string name="delivered">Levererades</string>
<string name="resend">Skicka igen</string> <string name="resend">Skicka igen</string>
<string name="error_opening_file">Ett fel uppstår när filen öppnas.</string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Registrerad</string> <string name="status_connected">Registrerad</string>
<string name="status_not_connected">Inte registrerad</string> <string name="status_not_connected">Inte registrerad</string>
@ -334,6 +336,7 @@
<string name="pref_rfc2833_dtmf">Skicka in-band DTMF (RFC2833)</string> <string name="pref_rfc2833_dtmf">Skicka in-band DTMF (RFC2833)</string>
<string name="pref_sipinfo_dtmf">Skicka ut-band DTMF (SIP INFO)</string> <string name="pref_sipinfo_dtmf">Skicka ut-band DTMF (SIP INFO)</string>
<string name="pref_voice_mail">Röstbrevlåda URI</string> <string name="pref_voice_mail">Röstbrevlåda URI</string>
<string name="pref_dialer_call">Använd Linphone som standard telefonapp</string>
<!--Chat settings--> <!--Chat settings-->
<string name="pref_chat_title">Chatt</string> <string name="pref_chat_title">Chatt</string>
<string name="pref_image_sharing_server_title">Delar server</string> <string name="pref_image_sharing_server_title">Delar server</string>

View file

@ -29,6 +29,7 @@
<string name="retry">Yeniden dene</string> <string name="retry">Yeniden dene</string>
<string name="cancel">İptal</string> <string name="cancel">İptal</string>
<string name="accept">Kabul et</string> <string name="accept">Kabul et</string>
<string name="open"></string>
<string name="continue_text">Sürdür</string> <string name="continue_text">Sürdür</string>
<string name="about">Hakkında</string> <string name="about">Hakkında</string>
<string name="deny">Yoksay</string> <string name="deny">Yoksay</string>
@ -111,6 +112,7 @@
<string name="use_email_for_validation">Hesap doğrulama için e-posta adresi kullan</string> <string name="use_email_for_validation">Hesap doğrulama için e-posta adresi kullan</string>
<string name="login_with_username">Telefon numaranız yerine kullanıcı adınızı ve parolanızı kullanın</string> <string name="login_with_username">Telefon numaranız yerine kullanıcı adınızı ve parolanızı kullanın</string>
<string name="phone_number_info_title">Telefon numaram ne için kullanılacak?</string> <string name="phone_number_info_title">Telefon numaram ne için kullanılacak?</string>
<string name="phone_number_info_content">\nTelefon numaranız sayesinde arkadaşlarınız sizi daha kolay bulacak.\n\n Adres defterinizde kimlerin Linphone kullandığını göreceksiniz ve arkadaşlarınız da size Linphone\'dan ulaşabileceklerini bilecek.\n</string>
<string name="phone_number_link_info_content">\nEğer hesabını telefon numarana bağlarsan arkadaşların seni daha kolay bulacak\n\nAdres listende kimlerin Linphone kullandığını göreceksin ve arkadaşların da sana Linphone üzerinden ulaşabileceğini bilecek.\n</string> <string name="phone_number_link_info_content">\nEğer hesabını telefon numarana bağlarsan arkadaşların seni daha kolay bulacak\n\nAdres listende kimlerin Linphone kullandığını göreceksin ve arkadaşların da sana Linphone üzerinden ulaşabileceğini bilecek.\n</string>
<string name="phone_number_link_info_content_already_account">Telefon numaranı yalnızca tek Linphone hesabıyla kullanabilirsin.\n\nEğer hesabını zaten başka bir hesaba bağladıysan ama bunu kullanmak istiyorsan, şimdi bağla ve numaran kendiliğinden bu hesaba taşınsın.</string> <string name="phone_number_link_info_content_already_account">Telefon numaranı yalnızca tek Linphone hesabıyla kullanabilirsin.\n\nEğer hesabını zaten başka bir hesaba bağladıysan ama bunu kullanmak istiyorsan, şimdi bağla ve numaran kendiliğinden bu hesaba taşınsın.</string>
<!--Status--> <!--Status-->
@ -159,6 +161,8 @@
<string name="delete_conversation">Seçilen görüşmeyi silmek ister misiniz?</string> <string name="delete_conversation">Seçilen görüşmeyi silmek ister misiniz?</string>
<string name="delete_message">Seçilen iletiyi silmek ister misiniz?</string> <string name="delete_message">Seçilen iletiyi silmek ister misiniz?</string>
<string name="remote_composing">Karşıdan yazılıyor...</string> <string name="remote_composing">Karşıdan yazılıyor...</string>
<string name="remote_composing_single">%s yazıyor...</string>
<string name="remote_composing_multiple">%s yazıyor...</string>
<string name="share_picture_size_small">Küçük</string> <string name="share_picture_size_small">Küçük</string>
<string name="share_picture_size_medium">Orta</string> <string name="share_picture_size_medium">Orta</string>
<string name="share_picture_size_large">Büyük</string> <string name="share_picture_size_large">Büyük</string>
@ -177,7 +181,24 @@
<string name="processing_image">Görüntü işleniyor, dosyanın boyutuna bağlı olarak bir kaç saniye sürebilir</string> <string name="processing_image">Görüntü işleniyor, dosyanın boyutuna bağlı olarak bir kaç saniye sürebilir</string>
<string name="displayed">Okundu</string> <string name="displayed">Okundu</string>
<string name="delivered">Ulaştırıldı</string> <string name="delivered">Ulaştırıldı</string>
<string name="sent">Gönderildi</string>
<string name="resend">Yeniden gönder</string> <string name="resend">Yeniden gönder</string>
<string name="error_opening_file">Bu dosya açılırken bir hata oluştu.</string>
<string name="administrator">Yönetici</string>
<string name="chat_room_infos_admin">Yönetici</string>
<string name="chat_room_participants">Katılımcılar</string>
<string name="chat_room_leave_group">Kümeden ayrıl</string>
<string name="device_added">%s için yeni aygıt</string>
<string name="device_removed">%s için aygıt kaldırıldı</string>
<string name="subject_changed">yeni konu: %s</string>
<string name="admin_set">%s yöneticidir</string>
<string name="admin_unset">%s artık yönetici değildir</string>
<string name="group_chat_notif" formatted="false">%1: %2</string>
<string name="chat_room_you_are_now_admin">Şimdi yöneticisiniz</string>
<string name="chat_room_you_are_no_longer_admin">Artık yönetici değilsiniz</string>
<string name="chat_room_creation_failed">Konuşma odası oluşturma başarısız</string>
<string name="chat_room_leave_button">Ayrıl</string>
<string name="separator">: </string>
<!--Status Bar--> <!--Status Bar-->
<string name="status_connected">Kayıtlı</string> <string name="status_connected">Kayıtlı</string>
<string name="status_not_connected">Kayıtsız</string> <string name="status_not_connected">Kayıtsız</string>
@ -233,6 +254,7 @@
<!--Errors--> <!--Errors-->
<string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</string> <string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</string>
<string name="error">Hata</string> <string name="error">Hata</string>
<string name="file_transfer_error">Dosya aktarım hatası</string>
<string name="warning_wrong_destination_address">%s dan gidilecek adres inşa edilemiyor</string> <string name="warning_wrong_destination_address">%s dan gidilecek adres inşa edilemiyor</string>
<string name="error_unknown">Tanımlanmayan hata</string> <string name="error_unknown">Tanımlanmayan hata</string>
<string name="error_call_declined">Reddedilen çağrı</string> <string name="error_call_declined">Reddedilen çağrı</string>
@ -335,6 +357,7 @@
<string name="pref_sipinfo_dtmf">Bant dışı DTMF(SIP INFO) gönder</string> <string name="pref_sipinfo_dtmf">Bant dışı DTMF(SIP INFO) gönder</string>
<string name="pref_call_timeout_title">Çağrı zaman aşımı (saniye türünde)</string> <string name="pref_call_timeout_title">Çağrı zaman aşımı (saniye türünde)</string>
<string name="pref_voice_mail">Sesli posta adresi</string> <string name="pref_voice_mail">Sesli posta adresi</string>
<string name="pref_dialer_call">Linphone\'u öntanımlı telefon uygulaması olarak kullan</string>
<!--Chat settings--> <!--Chat settings-->
<string name="pref_chat_title">Konuşma</string> <string name="pref_chat_title">Konuşma</string>
<string name="pref_image_sharing_server_title">Paylaşım sunucusu</string> <string name="pref_image_sharing_server_title">Paylaşım sunucusu</string>
@ -458,4 +481,5 @@
<string name="content_description_exit_conference">Görüşmeden çık</string> <string name="content_description_exit_conference">Görüşmeden çık</string>
<string name="content_title_notification_service">Linphone Hizmeti</string> <string name="content_title_notification_service">Linphone Hizmeti</string>
<string name="content_title_notification">Linphone Bildirimi</string> <string name="content_title_notification">Linphone Bildirimi</string>
<string name="content_description_conversation_subject">Küme konuşma odası konusu</string>
</resources> </resources>

View file

@ -12,7 +12,7 @@
<string name="tunnel_host"></string> <string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string> <string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string> <string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">GNU General Public License V2\n © 2010-2017 Belledonne Communications</string> <string name="about_text">GNU General Public License V2\n © 2010-2018 Belledonne Communications</string>
<string name="about_link">www.linphone.org</string> <string name="about_link">www.linphone.org</string>
<string name="sync_account_name">linphone contacts</string> <string name="sync_account_name">linphone contacts</string>
@ -197,16 +197,16 @@
<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">Info</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 the group</string>
<string name="chat_room_infos_title">Info</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>
<string name="chat_room_creation_filter_hint">Contact filter</string> <string name="chat_room_creation_filter_hint">Search a contact</string>
<string name="conference_created">group created</string> <string name="conference_created">You have joined the group</string>
<string name="conference_destroyed">group destroyed</string> <string name="conference_destroyed">You have left the group</string>
<string name="participant_added">%s added</string> <string name="participant_added">%s has joined</string>
<string name="participant_removed">%s leaved</string> <string name="participant_removed">%s has left</string>
<string name="device_added">new device for %s</string> <string name="device_added">new device for %s</string>
<string name="device_removed">device for %s removed</string> <string name="device_removed">device for %s removed</string>
<string name="subject_changed">new subject: %s</string> <string name="subject_changed">new subject: %s</string>
@ -216,9 +216,9 @@
<string name="chat_room_you_are_now_admin">You are now admin</string> <string name="chat_room_you_are_now_admin">You are now admin</string>
<string name="chat_room_you_are_no_longer_admin">You are no longer admin</string> <string name="chat_room_you_are_no_longer_admin">You are no longer admin</string>
<string name="chat_room_creation_failed">Chat room creation failed</string> <string name="chat_room_creation_failed">Chat room creation failed</string>
<string name="chat_room_leave_dialog">Do you really want to leave this group?</string> <string name="chat_room_leave_dialog">Do you really want to leave this conversation?</string>
<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 really 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> <string name="imdn_info">Delivery status</string>

1
settings.gradle Normal file
View file

@ -0,0 +1 @@
include 'liblinphone-sdk'

View file

@ -1,26 +1,8 @@
/*
LinphoneManager.java
Copyright (C) 2010 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.
*/
package org.linphone; package org.linphone;
/* /*
LinphoneManager.java LinphoneManager.java
Copyright (C) 2017 Belledonne Communications, Grenoble, France Copyright (C) 2018 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License modify it under the terms of the GNU General Public License
@ -584,7 +566,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
BluetoothManagerDestroy(); BluetoothManagerDestroy();
try { try {
mTimer.cancel(); mTimer.cancel();
mLc = null; destroyLinphoneCore();
} }
catch (RuntimeException e) { catch (RuntimeException e) {
Log.e(e); Log.e(e);
@ -623,6 +605,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
} }
} }
public void restartCore() { public void restartCore() {
destroyCore(); destroyCore();
startLibLinphone(mServiceContext); startLibLinphone(mServiceContext);
@ -906,50 +889,15 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
} }
} }
@TargetApi(Build.VERSION_CODES.HONEYCOMB) private void destroyLinphoneCore() {
private void doDestroy() { if (LinphonePreferences.instance() != null) {
ContactsManagerDestroy(); // We set network reachable at false before destroy LC to not send register with expires at 0
BluetoothManagerDestroy(); if (LinphonePreferences.instance().isPushNotificationEnabled()
try { || LinphonePreferences.instance().isBackgroundModeEnabled()) {
mTimer.cancel(); mLc.setNetworkReachable(false);
mLc = null; }
}
catch (RuntimeException e) {
Log.e(e);
}
finally {
try {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
mServiceContext.unregisterReceiver(mNetworkReceiver);
}
} catch (Exception e) {
Log.e(e);
}
try {
mServiceContext.unregisterReceiver(mHookReceiver);
} catch (Exception e) {
Log.e(e);
}
try {
mServiceContext.unregisterReceiver(mKeepAliveReceiver);
} catch (Exception e) {
Log.e(e);
}
try {
mServiceContext.unregisterReceiver(mCallReceiver);
} catch (Exception e) {
Log.e(e);
}
try {
dozeManager(false);
} catch (IllegalArgumentException iae) {
Log.e(iae);
} catch (Exception e) {
Log.e(e);
}
mLc = null;
instance = null;
} }
mLc = null;
} }
public void dozeManager(boolean enable) { public void dozeManager(boolean enable) {
@ -1035,7 +983,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
if (instance == null) return; if (instance == null) return;
getInstance().changeStatusToOffline(); getInstance().changeStatusToOffline();
sExited = true; sExited = true;
instance.doDestroy(); instance.destroyCore();
} }
private String getString(int key) { private String getString(int key) {
@ -1620,6 +1568,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());
@ -1798,4 +1752,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
mUnreadChatsPerRoom.put(key, 1); mUnreadChatsPerRoom.put(key, 1);
} }
} }
public void onQrcodeFound(Core lc, String something){
}
} }

View file

@ -370,6 +370,13 @@ public class LinphonePreferences {
prxCfg.setQualityReportingCollector(tempQualityReportingCollector); prxCfg.setQualityReportingCollector(tempQualityReportingCollector);
prxCfg.setQualityReportingInterval(tempQualityReportingInterval); prxCfg.setQualityReportingInterval(tempQualityReportingInterval);
String regId = LinphonePreferences.instance().getPushNotificationRegistrationID();
String appId = LinphonePreferences.instance().getString(R.string.push_sender_id);
if (regId != null && LinphonePreferences.instance().isPushNotificationEnabled()) {
String contactInfos = "app-id=" + appId + ";pn-type=" + LinphonePreferences.instance().getString(R.string.push_type) + ";pn-tok=" + regId + ";pn-silent=1";
prxCfg.setContactUriParameters(contactInfos);
}
if(tempPrefix != null){ if(tempPrefix != null){
prxCfg.setDialPrefix(tempPrefix); prxCfg.setDialPrefix(tempPrefix);
} }

View file

@ -264,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() {
@ -272,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(){

View file

@ -415,7 +415,7 @@ public final class LinphoneUtils {
String extension = LinphoneUtils.getExtensionFromFileName(path); String extension = LinphoneUtils.getExtensionFromFileName(path);
if(extension != null) if(extension != null)
extension = extension.toLowerCase(); extension = extension.toLowerCase();
return (extension != null && extension.matches(".*(png|jpg|jpeg|bmp|gif).*")); return (extension != null && extension.matches("(png|jpg|jpeg|bmp|gif)"));
} }
public static void recursiveFileRemoval(File root) { public static void recursiveFileRemoval(File root) {
@ -609,11 +609,7 @@ public final class LinphoneUtils {
if ("com.android.externalstorage.documents".equals(uri.getAuthority())) { if ("com.android.externalstorage.documents".equals(uri.getAuthority())) {
final String docId = DocumentsContract.getDocumentId(uri); final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":"); final String[] split = docId.split(":");
final String type = split[0]; if (split.length >= 1) return Environment.getExternalStorageDirectory() + "/" + split[1];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes // TODO handle non-primary volumes
}// Docs storage }// Docs storage

View file

@ -371,7 +371,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
} }
private void changeCurrentFragment(FragmentsAvailable newFragmentType, Bundle extras, boolean withoutAnimation) { private void changeCurrentFragment(FragmentsAvailable newFragmentType, Bundle extras, boolean withoutAnimation) {
if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT) { if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT
&& newFragmentType != FragmentsAvailable.GROUP_CHAT) {
return; return;
} }
@ -424,6 +425,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
fragment = new ChatListFragment(); fragment = new ChatListFragment();
break; break;
case CREATE_CHAT: case CREATE_CHAT:
checkAndRequestWriteContactsPermission();
fragment = new ChatCreationFragment(); fragment = new ChatCreationFragment();
break; break;
case INFO_GROUP_CHAT: case INFO_GROUP_CHAT:
@ -685,6 +687,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
private void displayChat(String sipUri, String message, String fileUri, String pictureUri, String thumbnailUri, String displayName, Address lAddress) { private void displayChat(String sipUri, String message, String fileUri, String pictureUri, String thumbnailUri, String displayName, Address lAddress) {
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putString("SipUri", sipUri); extras.putString("SipUri", sipUri);
if (message != null) if (message != null)
extras.putString("messageDraft", message); extras.putString("messageDraft", message);
if (fileUri != null) if (fileUri != null)
@ -694,14 +697,15 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putString("PictureUri", pictureUri); extras.putString("PictureUri", pictureUri);
extras.putString("ThumbnailUri", thumbnailUri); extras.putString("ThumbnailUri", thumbnailUri);
} }
if (sipUri == null && message == null && fileUri == null) {
if (sipUri == null) {
changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras); changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras);
} else { } else {
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
} }
} }
public void goToChatCreator(String address, ArrayList<ContactAddress> selectedContacts, String subject, boolean isGoBack) { public void goToChatCreator(String address, ArrayList<ContactAddress> selectedContacts, String subject, boolean isGoBack, Bundle shareInfos) {
if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) { if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
@ -710,23 +714,37 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putSerializable("selectedContacts", selectedContacts); extras.putSerializable("selectedContacts", selectedContacts);
extras.putString("subject", subject); extras.putString("subject", subject);
extras.putString("groupChatRoomAddress", address); extras.putString("groupChatRoomAddress", address);
if (shareInfos != null) {
if (shareInfos.getString("fileSharedUri") != null)
extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri"));
if (shareInfos.getString("messageDraft") != null)
extras.putString("messageDraft", shareInfos.getString("messageDraft"));
}
changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras); changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras);
} }
public void goToChat(String sipUri) { public void goToChat(String sipUri, Bundle shareInfos) {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (shareInfos != null) {
if (shareInfos.getString("fileSharedUri") != null)
extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri"));
if (shareInfos.getString("messageDraft") != null)
extras.putString("messageDraft", shareInfos.getString("messageDraft"));
}
if (isTablet()) { if (isTablet()) {
Fragment fragment2 = getFragmentManager().findFragmentById(R.id.fragmentContainer2); Fragment fragment2 = getFragmentManager().findFragmentById(R.id.fragmentContainer2);
if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.GROUP_CHAT && !emptyFragment) { if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.GROUP_CHAT && !emptyFragment) {
GroupChatFragment chatFragment = (GroupChatFragment) fragment2; GroupChatFragment chatFragment = (GroupChatFragment) fragment2;
chatFragment.changeDisplayedChat(sipUri); chatFragment.changeDisplayedChat(sipUri);
} else { } else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
} }
} else { } else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
} }
@ -734,7 +752,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount());
} }
public void goToChatGroupInfos(String address, ArrayList<ContactAddress> contacts, String subject, boolean isEditionEnabled, boolean isGoBack) { public void goToChatGroupInfos(String address, ArrayList<ContactAddress> contacts, String subject, boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos) {
if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) { if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
@ -744,6 +762,14 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putBoolean("isEditionEnabled", isEditionEnabled); extras.putBoolean("isEditionEnabled", isEditionEnabled);
extras.putSerializable("ContactAddress", contacts); extras.putSerializable("ContactAddress", contacts);
extras.putString("subject", subject); extras.putString("subject", subject);
if (shareInfos != null) {
if (shareInfos.getString("fileSharedUri") != null)
extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri"));
if (shareInfos.getString("messageDraft") != null)
extras.putString("messageDraft", shareInfos.getString("messageDraft"));
}
changeCurrentFragment(FragmentsAvailable.INFO_GROUP_CHAT, extras); changeCurrentFragment(FragmentsAvailable.INFO_GROUP_CHAT, extras);
} }
@ -1255,7 +1281,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
int readContactsI = -1; int readContactsI = -1;
for (int i = 0; i < permissions.length; i++) { for (int i = 0; i < permissions.length; i++) {
Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied"));
if (permissions[i].compareTo(Manifest.permission.READ_CONTACTS) == 0) if (permissions[i].compareTo(Manifest.permission.READ_CONTACTS) == 0 ||
permissions[i].compareTo(Manifest.permission.WRITE_CONTACTS) == 0)
readContactsI = i; readContactsI = i;
} }
@ -1528,17 +1555,24 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) { if (keyCode == KeyEvent.KEYCODE_BACK) {
if (currentFragment == FragmentsAvailable.DIALER switch(currentFragment) {
|| currentFragment == FragmentsAvailable.CONTACTS_LIST case DIALER :
|| currentFragment == FragmentsAvailable.HISTORY_LIST case CONTACTS_LIST:
|| currentFragment == FragmentsAvailable.CHAT_LIST) { case HISTORY_LIST:
boolean isBackgroundModeActive = LinphonePreferences.instance().isBackgroundModeEnabled(); case CHAT_LIST:
if (!isBackgroundModeActive) { boolean isBackgroundModeActive = LinphonePreferences.instance().isBackgroundModeEnabled();
stopService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class)); if (!isBackgroundModeActive) {
finish(); stopService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class));
} else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) { finish();
} else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) {
return true;
}
break;
case GROUP_CHAT:
LinphoneActivity.instance().goToChatList();
return true; return true;
} default:
break;
} }
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);

View file

@ -677,7 +677,7 @@ private static AssistantActivity instance;
private void goToLinphoneActivity() { private void goToLinphoneActivity() {
mPrefs.firstLaunchSuccessful(); mPrefs.firstLaunchSuccessful();
setResult(Activity.RESULT_OK, new Intent().putExtra("isNewProxyConfig", true)); startActivity(new Intent().setClass(this, LinphoneActivity.class).putExtra("isNewProxyConfig", true));
finish(); finish();
} }

View file

@ -60,6 +60,7 @@ public class RemoteProvisioningFragment extends Fragment implements OnClickListe
String url = remoteProvisioningUrl.getText().toString(); String url = remoteProvisioningUrl.getText().toString();
AssistantActivity.instance().displayRemoteProvisioningInProgressDialog(); AssistantActivity.instance().displayRemoteProvisioningInProgressDialog();
LinphonePreferences.instance().setRemoteProvisioningUrl(url); LinphonePreferences.instance().setRemoteProvisioningUrl(url);
LinphoneManager.getLc().getConfig().sync();
LinphoneManager.getInstance().restartCore(); LinphoneManager.getInstance().restartCore();
AssistantActivity.instance().setCoreListener(); AssistantActivity.instance().setCoreListener();
} }

View file

@ -71,6 +71,7 @@ import org.linphone.activities.LinphoneActivity;
import org.linphone.activities.LinphoneGenericActivity; import org.linphone.activities.LinphoneGenericActivity;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.Call; import org.linphone.core.Call;
import org.linphone.core.CallListenerStub;
import org.linphone.core.Call.State; import org.linphone.core.Call.State;
import org.linphone.core.CallParams; import org.linphone.core.CallParams;
import org.linphone.core.CallStats; import org.linphone.core.CallStats;
@ -138,6 +139,8 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private TimerTask mTask; private TimerTask mTask;
private HashMap<String, String> mEncoderTexts; private HashMap<String, String> mEncoderTexts;
private HashMap<String, String> mDecoderTexts; private HashMap<String, String> mDecoderTexts;
private CallListenerStub mCallListener;
private Call mCallDisplayedInStats;
private boolean oldIsSpeakerEnabled = false; private boolean oldIsSpeakerEnabled = false;
@ -229,7 +232,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
boolean remoteVideo = call.getRemoteParams().videoEnabled(); boolean remoteVideo = call.getRemoteParams().videoEnabled();
boolean localVideo = call.getCurrentParams().videoEnabled(); boolean localVideo = call.getCurrentParams().videoEnabled();
boolean autoAcceptCameraPolicy = LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests(); boolean autoAcceptCameraPolicy = LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests();
if (remoteVideo && !localVideo && !autoAcceptCameraPolicy && !(LinphoneManager.getLc().getConference() != null)) { if (remoteVideo && !localVideo && !autoAcceptCameraPolicy && !LinphoneManager.getLc().isInConference()) {
showAcceptCallUpdateDialog(); showAcceptCallUpdateDialog();
createTimerForDialog(SECONDS_BEFORE_DENYING_CALL_UPDATE); createTimerForDialog(SECONDS_BEFORE_DENYING_CALL_UPDATE);
} }
@ -591,7 +594,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void enableAndRefreshInCallActions() { private void enableAndRefreshInCallActions() {
int confsize = 0; int confsize = 0;
if( LinphoneManager.getLc().getConference() != null) { if(LinphoneManager.getLc().isInConference()) {
confsize = LinphoneManager.getLc().getConferenceSize() - (LinphoneManager.getLc().getConference() != null ? 1 : 0); confsize = LinphoneManager.getLc().getConferenceSize() - (LinphoneManager.getLc().getConference() != null ? 1 : 0);
} }
@ -951,7 +954,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
if (currentCall != null) { if (currentCall != null) {
lc.terminateCall(currentCall); lc.terminateCall(currentCall);
} else if (lc.getConference() != null) { } else if (lc.isInConference()) {
lc.terminateConference(); lc.terminateConference();
} else { } else {
lc.terminateAllCalls(); lc.terminateAllCalls();
@ -1143,6 +1146,9 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void showAcceptCallUpdateDialog() { private void showAcceptCallUpdateDialog() {
dialog = new Dialog(this); dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(this, R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
dialog.setContentView(R.layout.dialog); dialog.setContentView(R.layout.dialog);
@ -1409,7 +1415,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
} }
public void refreshCallList(Resources resources) { public void refreshCallList(Resources resources) {
isConferenceRunning = LinphoneManager.getLc().getConference() != null; isConferenceRunning = LinphoneManager.getLc().isInConference();
List<Call> pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.PausedByRemote)); List<Call> pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.PausedByRemote));
//MultiCalls //MultiCalls
@ -1486,7 +1492,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void exitConference(final Call call){ private void exitConference(final Call call){
Core lc = LinphoneManager.getLc(); Core lc = LinphoneManager.getLc();
if (call.getConference() != null) { if (lc.isInConference()) {
lc.removeFromConference(call); lc.removeFromConference(call);
if (lc.getConferenceSize() <= 1) { if (lc.getConferenceSize() <= 1) {
lc.leaveConference(); lc.leaveConference();
@ -1503,7 +1509,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
Core lc = LinphoneManager.getLc(); Core lc = LinphoneManager.getLc();
conferenceStatus = (ImageView) findViewById(R.id.conference_pause); conferenceStatus = (ImageView) findViewById(R.id.conference_pause);
if(conferenceStatus != null) { if(conferenceStatus != null) {
if (lc.getConference() != null) { if (lc.isInConference()) {
conferenceStatus.setImageResource(R.drawable.pause_big_over_selected); conferenceStatus.setImageResource(R.drawable.pause_big_over_selected);
lc.leaveConference(); lc.leaveConference();
} else { } else {
@ -1670,9 +1676,16 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
} }
public void initCallStatsRefresher(final Call call, final View view) { public void initCallStatsRefresher(final Call call, final View view) {
if (mCallDisplayedInStats == call) return;
if (mTimer != null && mTask != null) { if (mTimer != null && mTask != null) {
return; mTimer.cancel();
mTimer = null;
mTask = null;
} }
mCallDisplayedInStats = call;
if (call == null) return;
final TextView titleAudio = (TextView) view.findViewById(R.id.call_stats_audio); final TextView titleAudio = (TextView) view.findViewById(R.id.call_stats_audio);
final TextView titleVideo = (TextView) view.findViewById(R.id.call_stats_video); final TextView titleVideo = (TextView) view.findViewById(R.id.call_stats_video);
@ -1703,6 +1716,16 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
final View videoLayout = view.findViewById(R.id.callStatsVideo); final View videoLayout = view.findViewById(R.id.callStatsVideo);
final View audioLayout = view.findViewById(R.id.callStatsAudio); final View audioLayout = view.findViewById(R.id.callStatsAudio);
mCallListener = new CallListenerStub(){
public void onStateChanged(Call call, Call.State cstate, String message){
if (cstate == Call.State.End || cstate == Call.State.Error){
if (mTimer != null) {
Log.i("Call is terminated, stopping timer in charge of stats refreshing.");
mTimer.cancel();
}
}
}
};
mTimer = new Timer(); mTimer = new Timer();
mTask = new TimerTask() { mTask = new TimerTask() {
@ -1727,7 +1750,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
public void run() { public void run() {
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() == null) return; if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() == null) return;
synchronized(LinphoneManager.getLc()) { synchronized(LinphoneManager.getLc()) {
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated() && call.getState() != Call.State.Released) {
CallParams params = call.getCurrentParams(); CallParams params = call.getCurrentParams();
if (params != null) { if (params != null) {
CallStats audioStats = call.getStats(StreamType.Audio); CallStats audioStats = call.getStats(StreamType.Audio);
@ -1759,6 +1782,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
}); });
} }
}; };
call.addListener(mCallListener);
mTimer.scheduleAtFixedRate(mTask, 0, 1000); mTimer.scheduleAtFixedRate(mTask, 0, 1000);
} }

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;
@ -74,6 +76,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private String mChatRoomSubject, mChatRoomAddress; private String mChatRoomSubject, mChatRoomAddress;
private ChatRoom mChatRoom; private ChatRoom mChatRoom;
private ChatRoomListenerStub mChatRoomCreationListener; private ChatRoomListenerStub mChatRoomCreationListener;
private Bundle mShareInfos;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -175,7 +178,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
if (newState == ChatRoom.State.Created) { if (newState == ChatRoom.State.Created) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos);
} else if (newState == ChatRoom.State.CreationFailed) { } else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError(); LinphoneActivity.instance().displayChatRoomError();
@ -184,11 +187,28 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
} }
}; };
if (getArguments() != null) {
String fileSharedUri = getArguments().getString("fileSharedUri");
String messageDraft = getArguments().getString("messageDraft");
if (fileSharedUri != null || messageDraft != null)
mShareInfos = new Bundle();
if (fileSharedUri != null) {
LinphoneActivity.instance().checkAndRequestPermissionsToSendImage();
mShareInfos.putString("fileSharedUri", fileSharedUri);
}
if (messageDraft != null)
mShareInfos.putString("messageDraft", messageDraft);
}
return view; return view;
} }
@Override @Override
public void onResume() { public void onResume() {
ContactsManager.addContactsListener(this);
super.onResume(); super.onResume();
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(INPUT_METHOD_SERVICE); InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(INPUT_METHOD_SERVICE);
@ -202,6 +222,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
if (mChatRoom != null) { if (mChatRoom != null) {
mChatRoom.removeListener(mChatRoomCreationListener); mChatRoom.removeListener(mChatRoomCreationListener);
} }
ContactsManager.removeContactsListener(this);
super.onPause(); super.onPause();
} }
@ -249,16 +270,30 @@ 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 (caList.get(i).getAddressAsDisplayableString().compareTo(ca.getAddressAsDisplayableString()) == 0) if (ca.getAddress() != null && ca.getAddress().getUsername() != null) {
return i; if (caList.get(i).getAddressAsDisplayableString().compareTo(ca.getAddressAsDisplayableString()) == 0)
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) {
((TextView) viewContact.findViewById(R.id.sipUri)).setText(ca.getContact().getFullName()); String name = (ca.getContact().getFullName() != null && !ca.getContact().getFullName().isEmpty()) ?
ca.getContact().getFullName() : (ca.getDisplayName() != null) ?
ca.getDisplayName() : (ca.getUsername() != null) ?
ca.getUsername() : "";
((TextView) viewContact.findViewById(R.id.sipUri)).setText(name);
} else { } else {
((TextView) viewContact.findViewById(R.id.sipUri)).setText(ca.getAddressAsDisplayableString()); ((TextView) viewContact.findViewById(R.id.sipUri)).setText(ca.getAddressAsDisplayableString());
} }
@ -323,6 +358,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);
@ -330,6 +366,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();
@ -353,17 +390,17 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {
chatRoom = lc.getChatRoom(participant); chatRoom = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
} }
} else { } else {
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
} }
} else { } else {
mContactsSelectedLayout.removeAllViews(); mContactsSelectedLayout.removeAllViews();
LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false); LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos);
} }
} else { } else {
LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true); LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true, mShareInfos);
} }
} else if (id == R.id.clearSearchField) { } else if (id == R.id.clearSearchField) {
mSearchField.setText(""); mSearchField.setText("");
@ -381,7 +418,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc == null || lpc.getConferenceFactoryUri() == null) { if (lpc == null || lpc.getConferenceFactoryUri() == null) {
ChatRoom chatRoom = lc.getChatRoom(ca.getAddress()); ChatRoom chatRoom = lc.getChatRoom(ca.getAddress());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
} else { } else {
removeContactFromSelection(ca); removeContactFromSelection(ca);
} }
@ -389,6 +426,6 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
@Override @Override
public void onContactsUpdated() { public void onContactsUpdated() {
mSearchAdapter.searchContacts(mSearchField.getText().toString(), mContactsList); updateList();
} }
} }

View file

@ -156,7 +156,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { mNewDiscussionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LinphoneActivity.instance().goToChatCreator(null, null, null, false); LinphoneActivity.instance().goToChatCreator(null, null, null, false, null);
} }
}); });
@ -211,7 +211,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
toggleSelection(position); toggleSelection(position);
}else{ }else{
ChatRoom room = (ChatRoom) mChatRoomsAdapter.getItem(position); ChatRoom room = (ChatRoom) mChatRoomsAdapter.getItem(position);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asString()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asString(),null);
} }
} }
@ -366,7 +366,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
ChatRoomsAdapter adapter = (ChatRoomsAdapter)mChatRoomsList.getAdapter(); ChatRoomsAdapter adapter = (ChatRoomsAdapter)mChatRoomsList.getAdapter();
if (adapter != null && adapter.getItemCount() > 0) { if (adapter != null && adapter.getItemCount() > 0) {
ChatRoom room = (ChatRoom) adapter.getItem(0); ChatRoom room = (ChatRoom) adapter.getItem(0);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else { } else {
LinphoneActivity.instance().displayEmptyFragment(); LinphoneActivity.instance().displayEmptyFragment();
} }
@ -403,11 +403,9 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
lc.removeListener(mListener); lc.removeListener(mListener);
} }
ContactsManager.removeContactsListener(this); ContactsManager.removeContactsListener(this);
mChatRoomsAdapter.clear(); mChatRoomsAdapter.clear();
super.onPause(); super.onPause();
} }
@Override @Override

View file

@ -320,13 +320,6 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomsAdapter.ChatRoo
* Adapter's methods * Adapter's methods
*/ */
// oldVersion, kept in case of calls from other classes
// @Override
// public int getCount() {
// return mRooms.size();
// }
@Override @Override
public int getItemCount() { public int getItemCount() {
@ -340,5 +333,6 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomsAdapter.ChatRoo
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
return position; return position;
} }
} }

View file

@ -69,7 +69,6 @@ import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.ChatRoomListener; import org.linphone.core.ChatRoomListener;
import org.linphone.core.Content; import org.linphone.core.Content;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.Event;
import org.linphone.core.EventLog; import org.linphone.core.EventLog;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.LimeState; import org.linphone.core.LimeState;
@ -160,10 +159,10 @@ 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, null);
} }
}); });
@ -216,6 +215,25 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mChatEventsList = view.findViewById(R.id.chat_message_list); mChatEventsList = view.findViewById(R.id.chat_message_list);
registerForContextMenu(mChatEventsList); registerForContextMenu(mChatEventsList);
if (getArguments() != null) {
String fileSharedUri = getArguments().getString("fileSharedUri");
if (fileSharedUri != null) {
if (LinphoneUtils.isExtensionImage(fileSharedUri)) {
addImageToPendingList(fileSharedUri);
} else {
if (fileSharedUri.startsWith("content://") || fileSharedUri.startsWith("file://")) {
fileSharedUri = LinphoneUtils.getFilePath(this.getActivity().getApplicationContext(), Uri.parse(fileSharedUri));
} else if (fileSharedUri.contains("com.android.contacts/contacts/")) {
fileSharedUri = LinphoneUtils.getCVSPathFromLookupUri(fileSharedUri).toString();
}
addFileToPendingList(fileSharedUri);
}
}
if (getArguments().getString("messageDraft") != null)
mMessageTextToSend.setText(getArguments().getString("messageDraft"));
}
return view; return view;
} }
@ -290,7 +308,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
if (LinphoneUtils.isExtensionImage(fileToUploadPath)) { if (LinphoneUtils.isExtensionImage(fileToUploadPath)) {
addImageToPendingList(fileToUploadPath); addImageToPendingList(fileToUploadPath);
} else { } else {
if (fileToUploadPath.startsWith("content://")) { if (fileToUploadPath.startsWith("content://") || fileToUploadPath.startsWith("file://")) {
fileToUploadPath = LinphoneUtils.getFilePath(this.getActivity().getApplicationContext(), Uri.parse(fileToUploadPath)); fileToUploadPath = LinphoneUtils.getFilePath(this.getActivity().getApplicationContext(), Uri.parse(fileToUploadPath));
} else if (fileToUploadPath.contains("com.android.contacts/contacts/")) { } else if (fileToUploadPath.contains("com.android.contacts/contacts/")) {
fileToUploadPath = LinphoneUtils.getCVSPathFromLookupUri(fileToUploadPath).toString(); fileToUploadPath = LinphoneUtils.getCVSPathFromLookupUri(fileToUploadPath).toString();
@ -369,28 +387,29 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
ChatMessage message = event.getChatMessage(); ChatMessage message = event.getChatMessage();
String messageId = message.getMessageId(); String messageId = message.getMessageId();
switch(item.getItemId()) { if (item.getItemId() == R.id.resend) {
case R.id.resend: mEventsAdapter.removeItem(info.position);
mEventsAdapter.removeItem(info.position); message.resend();
message.resend(); return true;
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);
} }
if (item.getItemId() == R.id.imdn_infos) {
LinphoneActivity.instance().goToChatMessageImdnInfos(getRemoteSipUri(), messageId);
return true;
}
if (item.getItemId() == 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;
}
if (item.getItemId() == R.id.delete_message) {
mChatRoom.deleteMessage(message);
mEventsAdapter.removeItem(info.position);
return true;
}
return super.onContextItemSelected(item);
} }
/** /**
@ -473,7 +492,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
//TODO error //TODO error
return; return;
} }
Address proxyConfigContact = core.getDefaultProxyConfig().getContact(); Address proxyConfigContact = (core.getDefaultProxyConfig() != null) ? core.getDefaultProxyConfig().getContact() : null;
if (proxyConfigContact != null) { if (proxyConfigContact != null) {
mChatRoom = core.findOneToOneChatRoom(proxyConfigContact, mRemoteSipAddress); mChatRoom = core.findOneToOneChatRoom(proxyConfigContact, mRemoteSipAddress);
} }
@ -752,19 +771,6 @@ 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();
@ -843,6 +849,26 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
@Override
public void onConferenceJoined(ChatRoom cr, EventLog event) {
// 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();
mEventsAdapter.addToHistory(event);
}
@Override
public void onConferenceLeft(ChatRoom cr, EventLog event) {
mEventsAdapter.addToHistory(event);
}
@Override @Override
public void onParticipantAdminStatusChanged(ChatRoom cr, EventLog event) { public void onParticipantAdminStatusChanged(ChatRoom cr, EventLog event) {
mEventsAdapter.addToHistory(event); mEventsAdapter.addToHistory(event);

View file

@ -85,7 +85,8 @@ public class GroupInfoAdapter extends BaseAdapter {
final LinearLayout isAdmin = view.findViewById(R.id.isAdminLayout); final LinearLayout isAdmin = view.findViewById(R.id.isAdminLayout);
final LinearLayout isNotAdmin = view.findViewById(R.id.isNotAdminLayout); final LinearLayout isNotAdmin = view.findViewById(R.id.isNotAdminLayout);
name.setText(c.getFullName()); name.setText((c.getFullName() != null) ? c.getFullName() :
(ca.getDisplayName() != null) ? ca.getDisplayName() : ca.getUsername());
if (c.hasPhoto()) { if (c.hasPhoto()) {
LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), avatar, c.getThumbnailUri()); LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), avatar, c.getThumbnailUri());
} }

View file

@ -72,6 +72,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
private ChatRoom mChatRoom, mTempChatRoom; private ChatRoom mChatRoom, mTempChatRoom;
private Dialog mAdminStateChangedDialog; private Dialog mAdminStateChangedDialog;
private ChatRoomListenerStub mChatRoomCreationListener; private ChatRoomListenerStub mChatRoomCreationListener;
private Bundle mShareInfos;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -118,18 +119,30 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mParticipantsList.setAdapter(mAdapter); mParticipantsList.setAdapter(mAdapter);
mAdapter.setChatRoom(mChatRoom); mAdapter.setChatRoom(mChatRoom);
String fileSharedUri = getArguments().getString("fileSharedUri");
String messageDraft = getArguments().getString("messageDraft");
if (fileSharedUri != null || messageDraft != null)
mShareInfos = new Bundle();
if (fileSharedUri != null)
mShareInfos.putString("fileSharedUri", fileSharedUri);
if (messageDraft != null)
mShareInfos.putString("messageDraft", messageDraft);
mBackButton = view.findViewById(R.id.back); mBackButton = view.findViewById(R.id.back);
mBackButton.setOnClickListener(new View.OnClickListener() { mBackButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (mIsAlreadyCreatedGroup) { if (mIsAlreadyCreatedGroup) {
if (LinphoneActivity.instance().isTablet()) { if (LinphoneActivity.instance().isTablet()) {
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly()); LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly(), mShareInfos);
} else { } else {
getFragmentManager().popBackStack(); getFragmentManager().popBackStack();
} }
} else { } else {
LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true); LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true, mShareInfos);
} }
} }
}); });
@ -150,7 +163,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
public void onClick(View view) { public void onClick(View view) {
if (mChatRoom != null) { if (mChatRoom != null) {
mChatRoom.leave(); mChatRoom.leave();
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString()); LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString(), null);
} else { } else {
Log.e("Can't leave, chatRoom for address " + mGroupChatRoomAddress.asString() + " is null..."); Log.e("Can't leave, chatRoom for address " + mGroupChatRoomAddress.asString() + " is null...");
} }
@ -174,7 +187,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (mIsEditionEnabled) { if (mIsEditionEnabled) {
LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup); LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null);
} }
} }
}); });
@ -182,7 +195,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mAddParticipantsButton.setOnClickListener(new View.OnClickListener() { mAddParticipantsButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup); LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null);
} }
}); });
@ -213,7 +226,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
// This will remove both the creation fragment and the group info fragment from the back stack // This will remove both the creation fragment and the group info fragment from the back stack
getFragmentManager().popBackStack(); getFragmentManager().popBackStack();
getFragmentManager().popBackStack(); getFragmentManager().popBackStack();
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos);
} else if (newState == ChatRoom.State.CreationFailed) { } else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError(); LinphoneActivity.instance().displayChatRoomError();
@ -289,7 +302,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
toAdd.toArray(participantsToAdd); toAdd.toArray(participantsToAdd);
mChatRoom.addParticipants(participantsToAdd); mChatRoom.addParticipants(participantsToAdd);
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString()); LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString(), null);
} }
} }
}); });
@ -348,7 +361,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);
} }
@ -382,6 +395,14 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mAdminStateChangedDialog.show(); mAdminStateChangedDialog.show();
} }
@Override
public void onConferenceJoined(ChatRoom cr, EventLog event_log) {
}
@Override
public void onConferenceLeft(ChatRoom cr, EventLog event_log) {
}
@Override @Override
public void onParticipantAdded(ChatRoom cr, EventLog event_log) { public void onParticipantAdded(ChatRoom cr, EventLog event_log) {
refreshParticipantsList(); refreshParticipantsList();
@ -458,11 +479,6 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
} }
@Override
public void onAllInformationReceived(ChatRoom cr) {
}
@Override @Override
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {

View file

@ -88,7 +88,7 @@ public class ImdnFragment extends Fragment {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (LinphoneActivity.instance().isTablet()) { if (LinphoneActivity.instance().isTablet()) {
LinphoneActivity.instance().goToChat(mRoomUri); LinphoneActivity.instance().goToChat(mRoomUri, null);
} else { } else {
LinphoneActivity.instance().onBackPressed(); LinphoneActivity.instance().onBackPressed();
} }

View file

@ -31,6 +31,7 @@ public class ContactAddress implements Serializable {
private LinphoneContact contact; private LinphoneContact contact;
private SearchResult result; 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;
@ -69,11 +70,13 @@ public class ContactAddress implements Serializable {
} }
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);
Address addr = 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 // Remove the user=phone URI param if existing, it will break everything otherwise
if (addr.hasUriParam("user")) { if (addr.hasUriParam("user")) {
@ -82,6 +85,30 @@ public class ContactAddress implements Serializable {
return addr; return addr;
} }
public String getDisplayName() {
if (address != null) {
Address addr = Factory.instance().createAddress(address);
if (addr != null) {
return addr.getDisplayName();
}
}
return null;
}
public String getUsername() {
if (address != null) {
Address addr = Factory.instance().createAddress(address);
if (addr != null) {
return addr.getUsername();
}
}
return null;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setSelect(boolean select) { public void setSelect(boolean select) {
isSelect = select; isSelect = select;
} }
@ -90,16 +117,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

@ -77,7 +77,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
Address participant = Factory.instance().createAddress(tag); Address participant = Factory.instance().createAddress(tag);
ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant); ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant);
if (room != null) { if (room != null) {
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else { } else {
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()) {
@ -87,7 +87,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {
room = lc.getChatRoom(participant); room = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} }
} }
} }
@ -134,7 +134,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
if (newState == ChatRoom.State.Created) { if (newState == ChatRoom.State.Created) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), null);
} else if (newState == ChatRoom.State.CreationFailed) { } else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError(); LinphoneActivity.instance().displayChatRoomError();

View file

@ -264,11 +264,20 @@ public class ContactsManager extends ContentObserver {
} }
public synchronized void setContacts(List<LinphoneContact> c) { public synchronized void setContacts(List<LinphoneContact> c) {
contacts = c; if (contacts.isEmpty() || contacts.size() > c.size()) {
contacts = c;
} else {
for (LinphoneContact contact : c) {
if (!contacts.contains(contact)) {
contacts.add(contact);
}
}
}
Collections.sort(contacts);
} }
public synchronized void setSipContacts(List<LinphoneContact> c) { public synchronized void setSipContacts(List<LinphoneContact> c) {
if (sipContacts.isEmpty()) { if (sipContacts.isEmpty() || sipContacts.size() > c.size()) {
sipContacts = c; sipContacts = c;
} else { } else {
for (LinphoneContact contact : c) { for (LinphoneContact contact : c) {
@ -277,6 +286,7 @@ public class ContactsManager extends ContentObserver {
} }
} }
} }
Collections.sort(sipContacts);
} }
public synchronized void refreshSipContact(Friend lf) { public synchronized void refreshSipContact(Friend lf) {
@ -458,8 +468,6 @@ public class ContactsManager extends ContentObserver {
Log.w("[Permission] Read contacts permission wasn't granted, only fetch Friends"); Log.w("[Permission] Read contacts permission wasn't granted, only fetch Friends");
} }
Collections.sort(contacts);
Collections.sort(sipContacts);
setContacts(contacts); setContacts(contacts);
setSipContacts(sipContacts); setSipContacts(sipContacts);

View file

@ -75,6 +75,13 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return fullName.compareTo(contactFullName); return fullName.compareTo(contactFullName);
} }
@Override
public boolean equals(Object obj) {
if (obj.getClass() != LinphoneContact.class) return false;
LinphoneContact contact = (LinphoneContact) obj;
return (this.compareTo(contact) == 0);
}
public void setFullName(String name) { public void setFullName(String name) {
fullName = name; fullName = name;
} }

View file

@ -40,13 +40,20 @@ public class LinphoneNumberOrAddress implements Serializable, Comparable<Linphon
@Override @Override
public int compareTo(LinphoneNumberOrAddress noa) { public int compareTo(LinphoneNumberOrAddress noa) {
if (noa.isSIPAddress() == isSIPAddress()) { if (noa.isSIPAddress() == isSIPAddress() && noa.getValue() != null) {
return noa.getValue().compareTo(getValue()); return noa.getValue().compareTo(getValue());
} else { } else {
return isSIPAddress() ? -1 : 1; return isSIPAddress() ? -1 : 1;
} }
} }
@Override
public boolean equals(Object obj) {
if (obj.getClass() != LinphoneNumberOrAddress.class) return false;
LinphoneNumberOrAddress noa = (LinphoneNumberOrAddress) obj;
return (this != null && this.compareTo(noa) == 0);
}
public boolean isSIPAddress() { public boolean isSIPAddress() {
return isSIPAddress; return isSIPAddress;
} }

View file

@ -33,6 +33,8 @@ 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.Factory;
import org.linphone.core.ProxyConfig;
import org.linphone.core.SearchResult; import org.linphone.core.SearchResult;
import java.util.ArrayList; import java.util.ArrayList;
@ -62,7 +64,6 @@ public class SearchContactsListAdapter extends BaseAdapter {
private ProgressBar progressBar; private ProgressBar progressBar;
private boolean mOnlySipContact = false; private boolean mOnlySipContact = false;
private View.OnClickListener listener; private View.OnClickListener listener;
private int oldSize;
public List<ContactAddress> getContacts() { public List<ContactAddress> getContacts() {
return contacts; return contacts;
@ -81,14 +82,18 @@ public class SearchContactsListAdapter extends BaseAdapter {
progressBar = pB; progressBar = pB;
setContactsSelectedList(null); setContactsSelectedList(null);
setContactsList(contactsList); setContactsList(contactsList);
oldSize = 0;
} }
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 +127,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))) {
Address address = LinphoneManager.getLc().interpretUrl(noa.getValue()); ContactAddress ca = null;
if (address != null) { if (noa.isSIPAddress()) {
ContactAddress ca = new ContactAddress(contact, address.asString(), contact.isFriend()); Address address = LinphoneManager.getLc().interpretUrl(noa.getValue());
list.add(ca); if (address != null) {
ca = new ContactAddress(contact, address.asString(), "", contact.isFriend());
}
} 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);
} }
} }
} }
@ -153,21 +165,14 @@ public class SearchContactsListAdapter extends BaseAdapter {
} }
public void searchContacts(String search, ListView resultContactsSearch) { public void searchContacts(String search, ListView resultContactsSearch) {
if (search == null || search.length() == 0 || search.trim().length() == 0) {
contacts = getContactsList();
resultContactsSearch.setAdapter(this);
if (ContactsManager.getInstance() != null) {
ContactsManager.getInstance().getMagicSearch().resetSearchCache();
}
oldSize = 0;
return;
}
search = search.trim();
List<ContactAddress> result = new ArrayList<>(); List<ContactAddress> result = new ArrayList<>();
SearchResult[] results = ContactsManager.getInstance().getMagicSearch().getContactListFromFilter(search, ""); String domain = "";
ProxyConfig prx = LinphoneManager.getLc().getDefaultProxyConfig();
if (prx != null) domain = prx.getDomain();
SearchResult[] results = ContactsManager.getInstance().getMagicSearch().getContactListFromFilter(search, mOnlySipContact ? domain :"");
for (SearchResult sr : results) { for (SearchResult sr : results) {
boolean found = false;
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(sr.getAddress()); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(sr.getAddress());
if (contact == null) { if (contact == null) {
contact = new LinphoneContact(); contact = new LinphoneContact();
@ -176,25 +181,26 @@ public class SearchContactsListAdapter extends BaseAdapter {
contact.refresh(); contact.refresh();
} }
} }
if (sr.getAddress() != null) { if (sr.getAddress() != null || sr.getPhoneNumber() != null) {
if (contact.getFullName() == null) {
contact.setFullName(search);
}
boolean found = false;
for (ContactAddress ca : result) { for (ContactAddress ca : result) {
if (ca.getAddress().asStringUriOnly().equals(sr.getAddress().asStringUriOnly())) { String normalizedPhoneNumber = (ca.getPhoneNumber() != null) ? prx.normalizePhoneNumber(ca.getPhoneNumber()) : null;
if ((sr.getAddress() != null && ca.getAddress() != null
&& ca.getAddress().asStringUriOnly().equals(sr.getAddress().asStringUriOnly()))
|| (sr.getPhoneNumber() != null && normalizedPhoneNumber != null
&& sr.getPhoneNumber().equals(normalizedPhoneNumber))) {
found = true; found = true;
break; break;
} }
} }
if (!found) { }
result.add(new ContactAddress(contact, sr.getAddress().asStringUriOnly(), contact.isFriend())); if (!found) {
} result.add(new ContactAddress(contact,
(sr.getAddress() != null) ? sr.getAddress().asStringUriOnly() : "",
sr.getPhoneNumber(),
contact.isFriend()));
} }
} }
oldSize = search.length();
contacts = result; contacts = result;
resultContactsSearch.setAdapter(this); resultContactsSearch.setAdapter(this);
this.notifyDataSetChanged(); this.notifyDataSetChanged();
@ -215,7 +221,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());
@ -223,11 +229,24 @@ 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 && c.getFullName() != null) { if (c != null && c.getFullName() != null) {
address = c.getPresenceModelForUriOrTel(a); if (address == null)
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 if (address != null) {
Address tmpAddr = Factory.instance().createAddress(address);
holder.name.setVisibility(View.VISIBLE);
holder.name.setText((tmpAddr.getDisplayName() != null) ? tmpAddr.getDisplayName() : tmpAddr.getUsername()) ;
} else { } else {
holder.name.setVisibility(View.GONE); holder.name.setVisibility(View.GONE);
} }

View file

@ -39,6 +39,7 @@ public class FirebaseMessaging extends FirebaseMessagingService {
android.util.Log.i("FirebaseMessaging","[Push Notification] Received"); android.util.Log.i("FirebaseMessaging","[Push Notification] Received");
if (!LinphoneService.isReady()) { if (!LinphoneService.isReady()) {
android.util.Log.i("FirebaseMessaging","[Push Notification] Starting Service");
startService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class)); startService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class));
} else if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() == 0) { } else if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() == 0) {
LinphoneUtils.dispatchOnUIThread(new Runnable(){ LinphoneUtils.dispatchOnUIThread(new Runnable(){

View file

@ -40,6 +40,8 @@ import android.app.AlertDialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
@ -49,6 +51,7 @@ import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory; import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
@ -350,7 +353,7 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
accountCreator = LinphoneManager.getLc().createAccountCreator(LinphonePreferences.instance().getXmlrpcUrl()); accountCreator = LinphoneManager.getLc().createAccountCreator(LinphonePreferences.instance().getXmlrpcUrl());
accountCreator.setListener(this); accountCreator.setListener(this);
PreferenceCategory account = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_sipaccount_key)); final PreferenceCategory account = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_sipaccount_key));
EditTextPreference username = (EditTextPreference) account.getPreference(0); EditTextPreference username = (EditTextPreference) account.getPreference(0);
username.setOnPreferenceChangeListener(usernameChangedListener); username.setOnPreferenceChangeListener(usernameChangedListener);
if (!isNewAccount){ if (!isNewAccount){
@ -485,8 +488,10 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
mainAccount.setEnabled(!mainAccount.isChecked()); mainAccount.setEnabled(!mainAccount.isChecked());
} }
//final AccountCreatorListener fragment = this;
final Preference changePassword = manage.getPreference(2); final Preference changePassword = manage.getPreference(2);
if (mPrefs.getAccountDomain(n).compareTo(getString(R.string.default_domain)) == 0) { /*if (mPrefs.getAccountDomain(n).compareTo(getString(R.string.default_domain)) == 0) {
changePassword.setEnabled(!isNewAccount); changePassword.setEnabled(!isNewAccount);
changePassword.setOnPreferenceClickListener(new OnPreferenceClickListener() { changePassword.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
@ -501,15 +506,19 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
dialog.dismiss(); dialog.dismiss();
} }
}); });
/*alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
AccountCreator.PasswordStatus status = accountCreator.setPassword(pass1.getText().toString()); AccountCreator.PasswordStatus status = accountCreator.setPassword(pass1.getText().toString());
if (status.equals(AccountCreator.PasswordStatus.Ok)) { if (status.equals(AccountCreator.PasswordStatus.Ok)) {
if (pass1.getText().toString().compareTo(pass2.getText().toString()) == 0) { if (pass1.getText().toString().compareTo(pass2.getText().toString()) == 0) {
accountCreator.setUsername(mPrefs.getAccountUsername(n)); accountCreator.setUsername(mPrefs.getAccountUsername(n));
accountCreator.setDomain(mPrefs.getAccountDomain(n));
accountCreator.setHa1(mPrefs.getAccountHa1(n)); accountCreator.setHa1(mPrefs.getAccountHa1(n));
AccountCreator.Status req_status = accountCreator.updatePassword(pass1.getText().toString()); accountCreator.setListener(fragment);
accountCreator.setPassword(pass1.getText().toString());
AccountCreator.Status req_status = accountCreator.updateAccount();
if (!req_status.equals(AccountCreator.Status.RequestOk)) { if (!req_status.equals(AccountCreator.Status.RequestOk)) {
LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForStatus(req_status) LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForStatus(req_status)
, LinphoneActivity.instance()); , LinphoneActivity.instance());
@ -532,14 +541,14 @@ public class AccountPreferencesFragment extends PreferencesListFragment implemen
} }
});*/ // TODO FIXME });*/ // TODO FIXME
alert.setView(layout); /*alert.setView(layout);
alert.show(); alert.show();
return true; return true;
} }
}); });
} else { } else {*/
changePassword.setEnabled(false); changePassword.setEnabled(false);
} //}
final Preference delete = manage.getPreference(3); final Preference delete = manage.getPreference(3);
delete.setEnabled(!isNewAccount); delete.setEnabled(!isNewAccount);

View file

@ -109,7 +109,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
if (newState == ChatRoom.State.Created) { if (newState == ChatRoom.State.Created) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), null);
} else if (newState == ChatRoom.State.CreationFailed) { } else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError(); LinphoneActivity.instance().displayChatRoomError();
@ -199,7 +199,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
Address participant = Factory.instance().createAddress(sipUri); Address participant = Factory.instance().createAddress(sipUri);
ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant); ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant);
if (room != null) { if (room != null) {
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else { } else {
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()) {
@ -209,7 +209,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {
room = lc.getChatRoom(participant); room = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} }
} }
} else if (id == R.id.add_contact) { } else if (id == R.id.add_contact) {

View file

@ -476,7 +476,7 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(address); LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(address);
String displayName = null; String displayName = null;
final String sipUri = address.asString(); final String sipUri = (address != null) ? address.asString() : "";
if (c != null) { if (c != null) {
displayName = c.getFullName(); displayName = c.getFullName();
LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), holder.contactPicture, c.getThumbnailUri()); LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), holder.contactPicture, c.getThumbnailUri());

View file

@ -840,6 +840,12 @@ public class SettingsFragment extends PreferencesListFragment {
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean enable = (Boolean) newValue; boolean enable = (Boolean) newValue;
mPrefs.enableVideo(enable); mPrefs.enableVideo(enable);
if (!enable) {
mPrefs.setInitiateVideoCall(false);
mPrefs.setAutomaticallyAcceptVideoRequests(false);
((CheckBoxPreference) findPreference(getString(R.string.pref_video_initiate_call_with_video_key))).setChecked(mPrefs.shouldInitiateVideoCall());
((CheckBoxPreference) findPreference(getString(R.string.pref_video_automatically_accept_video_key))).setChecked(mPrefs.shouldAutomaticallyAcceptVideoRequests());
}
return true; return true;
} }
}); });

View file

@ -402,6 +402,9 @@ public class StatusFragment extends Fragment {
ZRTPdialog = new Dialog(getActivity()); ZRTPdialog = new Dialog(getActivity());
ZRTPdialog.requestWindowFeature(Window.FEATURE_NO_TITLE); ZRTPdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
ZRTPdialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
ZRTPdialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ZRTPdialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Drawable d = new ColorDrawable(ContextCompat.getColor(getActivity(), R.color.colorC)); Drawable d = new ColorDrawable(ContextCompat.getColor(getActivity(), R.color.colorC));
d.setAlpha(200); d.setAlpha(200);
ZRTPdialog.setContentView(R.layout.dialog); ZRTPdialog.setContentView(R.layout.dialog);

View file

@ -64,9 +64,11 @@ public class ListSelectionHelper {
mEditButton.setOnClickListener(new View.OnClickListener() { mEditButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
mAdapter.enableEdition(true); if (mAdapter.getCount() > 0) {
mTopBar.setVisibility(View.GONE); mAdapter.enableEdition(true);
mEditTopBar.setVisibility(View.VISIBLE); mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
}
} }
}); });

@ -1 +1 @@
Subproject commit f4b87c521a513b540f34a72ef82a52364929d0be Subproject commit ca4a89930dd8db94a60ae4a1dbf44a3710497429

@ -1 +1 @@
Subproject commit acf7727002fa4837a25582b5c798516b6b288fac Subproject commit ed53ae3c9da4fb15c13454153383014b3257939a

@ -1 +1 @@
Subproject commit 7376c8ba975617c8b2a7232c3acc428513a4ae8f Subproject commit ab5416d66620f32ff6882b6e29dec63203dbca41

@ -1 +1 @@
Subproject commit cbb4ab4c2a58e4fa1954043f6b17266e1685c887 Subproject commit 0f999ecc3d304923b6338d3f48d44ac8ddfd9be8

@ -1 +1 @@
Subproject commit 8e841b047641b1812a83880a90e89d702747ca5b Subproject commit cfad8fcc28c7cdba69684c8e35846711aaa16775

@ -1 +1 @@
Subproject commit d389b30b6c417d8bc7a79f561075a5c58871e3bc Subproject commit 456993eddd5f4724ff2b59487fb57aa5a85d782a

@ -1 +1 @@
Subproject commit d9385339a5c2979786cfc844c0527593c14662c5 Subproject commit 83d21d543c26a31943b2bd08c66b029f2ef742be

@ -1 +1 @@
Subproject commit 9e75838c8638c48a32b15c73c9da7b1fe942fd5f Subproject commit 852d23c72acd537b75e4b95af93b866925d31bda

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -292,6 +292,9 @@ struct sqlite3_api_routines {
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
void *(*value_pointer)(sqlite3_value*,const char*); void *(*value_pointer)(sqlite3_value*,const char*);
int (*vtab_nochange)(sqlite3_context*);
int (*value_nochange)(sqlite3_value*);
const char *(*vtab_collation)(sqlite3_index_info*,int);
}; };
/* /*
@ -558,6 +561,10 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_bind_pointer sqlite3_api->bind_pointer #define sqlite3_bind_pointer sqlite3_api->bind_pointer
#define sqlite3_result_pointer sqlite3_api->result_pointer #define sqlite3_result_pointer sqlite3_api->result_pointer
#define sqlite3_value_pointer sqlite3_api->value_pointer #define sqlite3_value_pointer sqlite3_api->value_pointer
/* Version 3.22.0 and later */
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
#define sqlite3_value_nochange sqlite3_api->value_nochange
#define sqlite3_vtab_collation sqlite3_api->vtab_collation
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)

@ -1 +1 @@
Subproject commit 4a5ea6a64043038f4a4ac0f18d54db02a08d9b92 Subproject commit a1e31c958811b2a03571f5d824913be940288e93

1
submodules/externals/zxing-cpp vendored Submodule

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

@ -1 +1 @@
Subproject commit 1f5c297c224816abf90e621b909f4cb7ab60ac09 Subproject commit d1a8d275b553c82b56a21ebb32d34024b0adbb99

@ -1 +1 @@
Subproject commit ad4cdb240e553654f87438fb4519754e90d1773d Subproject commit 75a86196030bb6efd9d67d42c0b25f17b4ec4e25

@ -1 +1 @@
Subproject commit 1fcd6fd1558f26255ae9dac687191ddf988bfd5b Subproject commit a88be02b93e2274ae3fcf80e1e0032adc43c0448

View file

@ -1,23 +0,0 @@
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9ee95b62..bb763a24 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -287,15 +287,15 @@
</intent-filter>
</service>
- <provider
+ <!--<provider
android:name="android.support.v4.content.FileProvider"
- android:authorities="org.linphone.provider"
+ android:authorities="org.linphone.provider${linphone_app_id}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
- </provider>
+ </provider>-->
<activity
android:name=".tutorials.TutorialLauncherActivity"