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
gen
liblinphone-junit-report.xml
liblinphone-sdk
liblinphone-sdk/android-*
liblinphonetester_*.zip
libs
libs-debug
@ -29,7 +29,6 @@ proguard-project.txt
project.properties
res/.DS_Store
res/raw/lpconfig.xsd
res/raw/rootca.pem
submodules/externals/build/cunit/CUnit/
submodules/externals/build/ffmpeg/arm/
submodules/externals/build/ffmpeg/x86
@ -49,7 +48,12 @@ tests/tests.output
WORK
.d
google-services.json
gradle.properties
.*clang*
linphone.iml
**/*.iml
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"]
path = submodules/linphone
url = git://git.linphone.org/linphone.git
url = https://gitlab.linphone.org/BC/public/linphone.git
[submodule "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"]
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"]
path = submodules/externals/ffmpeg
url = git://git.linphone.org/ffmpeg.git
url = https://gitlab.linphone.org/BC/public/external/ffmpeg.git
ignore = dirty
[submodule "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
[submodule "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"]
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
[submodule "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"]
path = submodules/externals/libvpx
url = git://git.linphone.org/libvpx.git
url = https://gitlab.linphone.org/BC/public/external/libvpx.git
ignore = dirty
[submodule "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"]
path = submodules/externals/srtp
url = git://git.linphone.org/srtp.git
url = https://gitlab.linphone.org/BC/public/external/srtp.git
[submodule "submodules/mssilk"]
path = submodules/mssilk
url = git://git.linphone.org/mssilk.git
url = https://gitlab.linphone.org/BC/public/mssilk.git
[submodule "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"]
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"]
path = submodules/externals/libxml2
url = https://github.com/GNOME/libxml2.git
url = https://gitlab.linphone.org/BC/public/external/libxml2.git
ignore = dirty
[submodule "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"]
path = submodules/externals/opus
url = git://git.linphone.org/opus.git
url = https://gitlab.linphone.org/BC/public/external/opus.git
ignore = dirty
[submodule "submodules/mswebrtc"]
path = submodules/mswebrtc
url = git://git.linphone.org/mswebrtc.git
url = https://gitlab.linphone.org/BC/public/mswebrtc.git
[submodule "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"]
path = submodules/externals/openh264
url = https://github.com/cisco/openh264
url = https://gitlab.linphone.org/BC/public/external/openh264.git
ignore = dirty
[submodule "submodules/mscodec2"]
path = submodules/mscodec2
url = git://git.linphone.org/mscodec2.git
url = https://gitlab.linphone.org/BC/public/mscodec2.git
[submodule "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"]
path = submodules/externals/mbedtls
url = git://git.linphone.org/mbedtls.git
url = https://gitlab.linphone.org/BC/public/external/mbedtls.git
ignore = dirty
[submodule "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"]
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"]
path = submodules/belr
url = git://git.linphone.org/belr.git
url = https://gitlab.linphone.org/BC/public/belr.git
[submodule "submodules/belcard"]
path = submodules/belcard
url = git://git.linphone.org/belcard.git
url = https://gitlab.linphone.org/BC/public/belcard.git
[submodule "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"]
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"]
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"]
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"]
path = submodules/mediastreamer2
url = git://git.linphone.org/mediastreamer2.git
url = https://gitlab.linphone.org/BC/public/mediastreamer2.git
[submodule "submodules/oRTP"]
path = submodules/oRTP
url = git://git.linphone.org/ortp.git
url = https://gitlab.linphone.org/BC/public/ortp.git
[submodule "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"]
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"]
path = submodules/externals/libxsd
url = git://git.linphone.org/libxsd
url = https://gitlab.linphone.org/BC/public/external/libxsd.git
[submodule "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"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
android:versionCode="3995"
android:versionName="3.99.4">
android:versionCode="4002"
android:versionName="4.0.1">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="26"/>
android:targetSdkVersion="28"/>
<uses-permission android:name="android.permission.INTERNET"/>
<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.
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.
Fixed for any bug fixes.
Security to invite users to upgrade in case of vulnerabilities.
## [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

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.
# COMPILATION INSTRUCTIONS
## 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.
* With the latest Debian (multiarch), you need this:
* `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'
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
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'
implementation 'org.apache.commons:commons-compress:1.16.1'
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:recyclerview-v7:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
implementation project(':liblinphone-sdk')
}
if (firebaseEnable()) {
apply plugin: 'com.google.gms.google-services'
}
//// Submodule Dir /////
def submoduleDir = ['submodules/mediastreamer2/java/src']
////////////////////////
///// Exclude Files /////
def excludeFiles = []
// Exclude firebase file if not enable
@ -72,7 +68,7 @@ if (!firebaseEnable()) {
excludeFiles.add('**/gcm*')
println '[Push Notification] Firebase enabled'
}
excludeFiles.add('**/mediastream/MediastreamerActivity.java')
excludeFiles.add('src/android/org/linphone/tutorials/*.java')
def excludePackage = []
@ -85,7 +81,8 @@ excludePackage.add('**/LICENSE.txt')
android {
defaultConfig {
compileSdkVersion 26
compileSdkVersion 28
buildToolsVersion "28.0.0"
applicationId getPackageName()
multiDexEnabled true
@ -114,20 +111,19 @@ android {
packaged {
initWith release
signingConfig null
matchingFallbacks = ['debug', 'release']
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
def srcDirs = submoduleDir
srcDirs.addAll(['src/linphone-wrapper', 'src/android'])
def srcDirs = ['src/android']
java.srcDirs = srcDirs
resources.srcDirs = srcDirs
aidl.srcDirs = srcDirs
renderscript.srcDirs = srcDirs
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
java.excludes = excludeFiles
// Exclude some useless files
@ -142,16 +138,13 @@ android {
sourceSets {
androidTest {
manifest.srcFile 'AndroidManifest.xml'
def srcDirs = submoduleDir
srcDirs.addAll(['src/android',
'src/androidTest'])
def srcDirs = ['src/android', 'src/androidTest']
java.srcDirs = srcDirs
resources.srcDirs = srcDirs
aidl.srcDirs = srcDirs
renderscript.srcDirs = srcDirs
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
java.excludes = excludeFiles
// Exclude some useless files
@ -166,7 +159,7 @@ android {
packagingOptions {
pickFirst 'META-INF/NOTICE'
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
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
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"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
android:versionCode="3320"
android:versionName="3.3.2">
android:versionCode="4001"
android:versionName="4.0.0">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="26"/>
android:targetSdkVersion="28"/>
</manifest>

View file

@ -21,18 +21,40 @@ allprojects {
}
}
configurations {
javadocDeps
}
apply plugin: 'com.android.library'
dependencies {
implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
javadocDeps group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
compile 'org.apache.commons:commons-compress: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 = []
@ -42,9 +64,38 @@ excludePackage.add('**/**tester**')
excludePackage.add('**/LICENSE.txt')
android {
buildTypes {
release {}
debug {}
}
defaultConfig {
compileSdkVersion 26
compileSdkVersion 28
buildToolsVersion "28.0.0"
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 {
@ -58,10 +109,11 @@ android {
main {
manifest.srcFile 'AndroidManifestLibrary.xml'
java.srcDirs = srcDir
resources.srcDirs = srcDir
aidl.srcDirs = srcDir
assets.srcDirs = ["${buildDir}/sdk-assets/assets/"]
renderscript.srcDirs = srcDir
jniLibs.srcDirs = ['libs']
jniLibs.srcDirs = ['../libs']
resources.srcDir("res")
java.excludes = ['**/mediastream/MediastreamerActivity.java']
@ -78,7 +130,7 @@ android {
///////////// Task /////////////
task(releaseJavadoc, type: Javadoc, dependsOn: "assembleRelease") {
source = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper']
source = srcDir
excludes = ['**/mediastream/MediastreamerActivity.java',
'**/**.html',
'**/**.aidl']
@ -108,3 +160,26 @@ task sdkZip(type: Zip) {
include '*'
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.MODIFY_AUDIO_SETTINGS" />
<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
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'
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: 'com.jayway.android.robotium', name: 'robotium', version: '+'
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: 'com.jayway.android.robotium', name: 'robotium-solo', version: '+'
compile fileTree(dir: 'libs', include: 'android-junit-report*.jar')
compile project(":libLinphoneAndroidSdk")
compile project(":liblinphone-sdk")
}
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.
MAX_FD="maximum"
warn ( ) {
warn () {
echo "$*"
}
die ( ) {
die () {
echo
echo "$*"
echo
@ -155,7 +155,7 @@ if $cygwin ; then
fi
# Escape application args
save ( ) {
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}

View file

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

View file

@ -23,7 +23,7 @@ public class LogsActivity extends Activity {
@Override
public void run() {
String res_path = mLogsActivity.getFilesDir().getAbsolutePath()+"/config_files";
String res_path = mLogsActivity.getFilesDir().getAbsolutePath();
String write_path = mLogsActivity.getCacheDir().getPath();
tester = new TesterLogger(mLogsActivity);
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.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.Gravity;
import android.view.Menu;
@ -19,6 +20,7 @@ public class SuitesActivity extends Activity {
if (extras != null) {
mSuite = extras.getString("suite");
if(mSuite != null) {
Tester.setApplicationContext(getBaseContext());
this.setTitle(this.getResources().getString(R.string.app_name) + " | " + mSuite);
TesterList suitesTest = new TesterList();
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
public boolean onCreateOptionsMenu(Menu menu) {

View file

@ -26,46 +26,24 @@ public class TestUnit extends AndroidTestCase {
public TestUnit(String name) {
String[] tab = name.split("/");
mSuite = tab[0];
mTest = tab[1];
if (tab.length == 2)
mTest = tab[1];
setName(name);
}
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
protected void setUp() throws Exception {
super.setUp();
if (isAssetCopied ==false) {
Tester.setApplicationContext(getContext());
copyAssetsFromPackage(getContext());
isAssetCopied=true;
}
@ -78,7 +56,7 @@ public class TestUnit extends AndroidTestCase {
@Override
protected void runTest() {
String res_path = getContext().getFilesDir().getPath()+"/config_files";
String res_path = getContext().getFilesDir().getPath();
String write_path = getContext().getCacheDir().getPath();
Tester tester = new Tester();

View file

@ -6,6 +6,7 @@ import org.linphone.core.Factory;
import org.linphone.mediastream.Version;
import android.util.Log;
import android.content.Context;
public class 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 static native void keepAccounts(boolean keep);
public static native void clearAccounts();

View file

@ -1,12 +1,8 @@
// Project information
buildDir = 'bin'
def firebaseEnable() {
File googleFile = new File('google-services.json')
return googleFile.exists()
}
buildscript {
File googleFile = new File('google-services.json')
repositories {
jcenter()
mavenCentral()
@ -15,9 +11,6 @@ buildscript {
}
dependencies {
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'
dependencies {
implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
if (firebaseEnable()) {
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'
compile group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
compile 'com.android.support:support-v4:26.0.2'
}
def srcDirs = ['submodules/mediastreamer2/java/src', 'src/linphone-wrapper', 'src/android']
def excludeFiles = []
// Exclude firebase file if not enable
if (!firebaseEnable()) {
excludeFiles.add('**/Firebase*')
} else {
excludeFiles.add('**/gcm*')
}
excludeFiles.add('**/Firebase*')
excludeFiles.add('**/gcm*')
excludeFiles.add('**/mediastream/MediastreamerActivity.java')
def excludePackage = []
@ -67,6 +49,7 @@ excludePackage.add('**/LICENSE.txt')
android {
defaultConfig {
compileSdkVersion 26
buildToolsVersion "27.0.3"
multiDexEnabled true
}
@ -79,7 +62,7 @@ android {
sourceSets {
main {
manifest.srcFile 'AndroidManifestLibrary.xml'
manifest.srcFile 'AndroidManifestSdk.xml'
java.srcDirs = srcDirs
resources.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):
prepare.Preparator.__init__(self, targets, default_targets=['armv7', 'arm64'], virtual_targets=android_virtual_targets)
self.min_supported_ndk = 16
self.max_supported_ndk = 16
self.max_supported_ndk = 17
self.unsupported_ndk_version = None
self.min_cmake_version = "3.10"
self.release_with_debug_info = True
@ -144,7 +144,7 @@ class AndroidPreparator(prepare.Preparator):
retval = True
ndk_build = find_executable('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')
if os.path.isfile(release_file):
version = open(release_file).read().strip()
@ -241,19 +241,18 @@ install: install-apk run-linphone
install-test:
\t$(MAKE) -C liblinphone_tester copy-libs
\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 installDebug
java-clean:
\t./gradlew clean
$(TOPDIR)/res/raw/rootca.pem:
\tcp liblinphone-sdk/android-{first_arch}/share/linphone/rootca.pem $@
copy-libs:
\trm -rf liblinphone-sdk/res
\trm -rf libs-debug/armeabi
\trm -rf libs/armeabi
\trm -rf src/linphone-wrapper && mkdir -p src/linphone-wrapper/
\tif test -d "liblinphone-sdk/android-arm"; then \\
\t\tmkdir -p 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/gdb.setup libs/armeabi; \\
\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/armeabi-v7a
\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/gdb.setup libs/armeabi-v7a; \\
\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/arm64-v8a
\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/gdb.setup libs/arm64-v8a; \\
\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/x86
\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/gdb.setup libs/x86; \\
\tfi
\tif test -d "liblinphone-sdk/android-arm/share/linphonej"; then \\
\t\tcp -R liblinphone-sdk/android-arm/share/linphonej/java/* src/linphone-wrapper; \\
\tfi
\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/; \\
\tif test -f "liblinphone-sdk/android-x86/lib/wrap.sh"; then \\
\t\tmkdir -p liblinphone-sdk/res/lib/x86 && \\
\t\tcp -f liblinphone-sdk/android-x86/lib/wrap.sh liblinphone-sdk/res/lib/x86; \\
\tfi
copy-libs-mediastreamer:
@ -371,7 +362,7 @@ copy-libs-mediastreamer:
\t\tsh WORK/android-x86/strip.sh submodules/mediastreamer2/java/libs/x86/*.so; \\
\tfi
generate-apk: java-clean build copy-libs $(TOPDIR)/res/raw/rootca.pem
generate-apk: java-clean build copy-libs
\t./gradlew assembleDebug
quick: clean install-apk run-linphone
@ -388,25 +379,32 @@ release: java-clean build copy-libs
unsigned: java-clean build copy-libs
\t./gradlew assemblePackaged
generate-sdk: liblinphone-android-sdk
generate-release-sdk: liblinphone-android-sdk-release
generate-sdk: liblinphone-android-sdk-debug
generate-javadoc:
\t./gradlew -b libLinphoneAndroidSdk.gradle androidJavadocsJar
\t./gradlew -b libLinphoneAndroidSdk.gradle sourcesJar
\t./gradlew -q androidJavadocsJar
\t./gradlew -q sourcesJar
liblinphone-android-sdk: java-clean build copy-libs $(TOPDIR)/res/raw/rootca.pem
\t./gradlew -b libLinphoneAndroidSdk.gradle androidJavadocsJar
\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
debug-sdk: java-clean build copy-libs generate-javadoc generate-apk
\t./gradlew -q 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 sourcesJar
linphone-android-sdk-release: linphone-android-sdk
\t./gradlew -b linphoneAndroidSdk.gradle assembleRelease
\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
\t@cd $(TOPDIR)/submodules/mediastreamer2/java && \\
\t./gradlew -b mediastreamerSdk.gradle assembleRelease

View file

@ -140,7 +140,7 @@
android:text="@string/sent"/>
<ImageView
android:visibility="gone"
android:visibility="invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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>
<!--Common-->
<string name="username">اسم المستخدم</string>
<string name="userid">معرِّف المستخدم (اختياري)</string>
<string name="phone_number">رقم الهاتف</string>
<string name="display_name">الاسم المعروض</string>
<string name="password">كلمة السر</string>
@ -110,6 +111,7 @@
<string name="use_email_for_validation">استخدم عنوان البريد الإلكتروني لتأكيد الحساب</string>
<string name="login_with_username">استعمل اسم المستخدم وكلمة السر عوضا عن رقم هاتفك</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">
\nسيجدك أصدقاؤك بسهولة إن ربطت حسابك برقم هاتفك\\n\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="delivered">سُلِّم</string>
<string name="resend">أعد اﻹرسال</string>
<string name="error_opening_file">حدث خطأ خلال فتح هذا الملف.</string>
<!--Status Bar-->
<string name="status_connected">مُسجَّل</string>
<string name="status_not_connected">غير مُسجَّل</string>
@ -207,9 +210,12 @@
<string name="call_stats_ip">صنف IP :</string>
<string name="call_stats_upload">صبيب الرفع :</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_video_resolution_sent">دقة الفيديو المُرسَل :</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_receiver_loss_rate">معدل ضياع المتلقي :</string>
<string name="call_stats_jitter_buffer">صِوان الارتعاش :</string>
@ -330,7 +336,9 @@
<string name="pref_auto_answer_time">مهلة التشغيل التلقائي (بالميلي-ثواني)</string>
<string name="pref_rfc2833_dtmf">أرسل DTMF مع التدفق (RFC2833)</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_dialer_call">استخدمْ لِنْفُونْ كتطبيق هاتفك الافتراضي</string>
<!--Chat settings-->
<string name="pref_chat_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_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_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_medium">Moyenne</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="displayed">Lu</string>
<string name="delivered">Reçu</string>
<string name="undelivered">Reçu</string>
<string name="sent">Envoyé</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="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_admin">Admin</string>
<string name="chat_room_participants">Participants</string>
<string name="chat_room_leave_group">Quitter le groupe</string>
<string name="chat_room_creation_filter_hint">Filtrer les contacts</string>
<string name="conference_created">groupe créé</string>
<string name="conference_destroyed">groupe détruit</string>
<string name="participant_added">%s a été ajouté</string>
<string name="participant_removed">%s a quitté</string>
<string name="device_added">nouvel appareil pour %s</string>
<string name="device_removed">appareil de %s retiré</string>
<string name="subject_changed">nouveau sujet : %s</string>
<string name="admin_set">%s est admin</string>
<string name="chat_room_creation_filter_hint">Rechercher un contact</string>
<string name="conference_created">Vous avez rejoint le groupe</string>
<string name="conference_destroyed">Vous avez quitté le groupe</string>
<string name="participant_added">%s a rejoint le groupe</string>
<string name="participant_removed">%s a quitté le groupe</string>
<string name="subject_changed">Nouveau sujet : %s</string>
<string name="admin_set">%s est devenu(e) 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_delete_dialog">Voulez-vous supprimer et quitter les discussions sélectionnées ?</string>
<string name="separator">&#160;:&#160;</string>
<string name="chat_room_delete_dialog">Voulez vous vraiment quitter et supprimer les conversations selectionnées ?</string>
<string name="imdn_info">Etat du message</string>
<!--Status Bar-->
<string name="status_connected">Enregistré</string>
<string name="status_not_connected">Non enregistré</string>

View file

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

View file

@ -29,6 +29,7 @@
<string name="retry">Повторить</string>
<string name="cancel">Отменить</string>
<string name="accept">Принять</string>
<string name="open">Открыть</string>
<string name="continue_text">Продолжить</string>
<string name="about">О программе</string>
<string name="deny">Отклонить</string>
@ -67,19 +68,19 @@
<string name="assistant_remote_provisioning_desc">Укажите URL-адрес конфигурации</string>
<string name="transport">Транспорт</string>
<string name="assistant_create_account_phone_number_address">Ваш SIP-адрес</string>
<string name="assistant_login_linphone">Использовать учетную запись Linphone</string>
<string name="assistant_login_generic">Использовать учетную запись SIP</string>
<string name="assistant_remote_provisioning">Выбор удаленной конфигурации</string>
<string name="assistant_login_linphone">Использовать аккаунт Linphone</string>
<string name="assistant_login_generic">Использовать SIP-аккаунт</string>
<string name="assistant_remote_provisioning">Удаленная конфигурация</string>
<string name="assistant_create_account_part_1">Подтвердите код страны и введите свой номер телефона</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_email">Введите имя пользователя, адрес электронной почты и пароль для вашей учетной записи Linphone</string>
<string name="assistant_display_name_optional">Отображаемое имя (необязательно)</string>
<string name="assistant_linphone_account">Использовать учетную запись Linphone</string>
<string name="assistant_generic_account">Использовать учетную запись SIP</string>
<string name="assistant_remote_provisioning_title">Выбор удаленной конфигурации</string>
<string name="assistant_linphone_account">Использовать аккаунт Linphone</string>
<string name="assistant_generic_account">Использовать SIP-аккаунт</string>
<string name="assistant_remote_provisioning_title">Удаленная конфигурация</string>
<string name="assistant_fetch_apply">Получить и применить</string>
<string name="assistant_login">Имя пользователя</string>
<string name="assistant_login">Авторизация</string>
<string name="assistant_ec_calibration">Выполняется калибровка эхоподавления</string>
<string name="assistant_remote_provisioning_login">Введите имя пользователя</string>
<string name="assistant_account_not_validated">Ваша учетная запись еще не проверена.</string>
@ -111,6 +112,7 @@
<string name="use_email_for_validation">Использовать адрес электронной почты для проверки учетной записи</string>
<string name="login_with_username">Вместо номера телефона использовать имя пользователя и пароль</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_already_account">Номер телефона можно использовать только с одной учетной записью Linphone.\n\nЕсли ваш номер уже был связан с другой учетной записью, но вы предпочитаете использовать его, просто свяжите его сейчас, и ваш номер будет автоматически перенесен в эту учетную запись.</string>
<!--Status-->
@ -159,6 +161,8 @@
<string name="delete_conversation">Вы действительно хотите удалить выбранный разговор?</string>
<string name="delete_message">Вы действительно хотите удалить выбранное сообщение?</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_medium">Средний</string>
<string name="share_picture_size_large">Большой</string>
@ -177,7 +181,28 @@
<string name="processing_image">Обработка изображения может занять несколько секунд в зависимости от размера файла</string>
<string name="displayed">Прочитано</string>
<string name="delivered">Доставлено</string>
<string name="undelivered">Не доставлено</string>
<string name="sent">Отправлено</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-->
<string name="status_connected">Зарегистрирован</string>
<string name="status_not_connected">Не зарегистрирован</string>
@ -233,6 +258,7 @@
<!--Errors-->
<string name="skipable_error_service_not_ready">Предупреждение: служба не готова</string>
<string name="error">Ошибка</string>
<string name="file_transfer_error">Ошибка передачи файла</string>
<string name="warning_wrong_destination_address">Невозможно создать адрес назначения из %s</string>
<string name="error_unknown">Неизвестная ошибка</string>
<string name="error_call_declined">Вызов отклонен</string>
@ -245,7 +271,7 @@
<string name="error_unauthorized">Неавторизован</string>
<string name="error_io_error">Ошибка сети</string>
<string name="download_image_failed">Загрузка не удалась. Проверьте сетевое подключение или повторите попытку позже.</string>
<string name="remote_provisioning_failure">Не удалось загрузить или применить профиль удаленного конфигурирования...</string>
<string name="remote_provisioning_failure">Не удалось загрузить или применить профиль удаленной конфигурации...</string>
<string name="remote_provisioning_again_title">Удаленное конфигурирование</string>
<string name="remote_provisioning_again_message">Вы хотите изменить URI конфигурирования?</string>
<!--Account Settings-->
@ -280,6 +306,7 @@
<string name="pref_change_password">Изменить пароль</string>
<string name="pref_default_account">Использовать по умолчанию</string>
<string name="pref_password_changed">Пароль изменен</string>
<string name="pref_proxy_push_notif">Разрешить push-уведомление</string>
<!--Settings-->
<string name="pref_sipaccounts">Учетные записи SIP</string>
<string name="default_account_flag">Учетная запись по умолчанию</string>
@ -335,6 +362,7 @@
<string name="pref_sipinfo_dtmf">Отправить вне потока DTMFs(SIP INFO)</string>
<string name="pref_call_timeout_title">Таймаут вызова(в секундах)</string>
<string name="pref_voice_mail">URI голосовой почты</string>
<string name="pref_dialer_call">Использовать Linphone в качестве приложения для звонков по умолчанию.</string>
<!--Chat settings-->
<string name="pref_chat_title">Чат</string>
<string name="pref_image_sharing_server_title">Сервер обмена</string>
@ -367,6 +395,7 @@
<string name="pref_advanced_title">Дополнительно</string>
<string name="pref_debug_title">Отладка</string>
<string name="pref_debug">Отладка</string>
<string name="pref_java_debug">Использовать Java-регистратор</string>
<string name="pref_friendlist_subscribe">Подписка</string>
<string name="pref_background_mode">Фоновый режим</string>
<string name="pref_animation_enable_title">Включить анимацию</string>
@ -458,4 +487,6 @@
<string name="content_description_exit_conference">Выйти из конференции</string>
<string name="content_title_notification_service">Служба Linphone</string>
<string name="content_title_notification">Уведомление Linphone</string>
<string name="content_description_conversation_subject">Тема группового чата</string>
<string name="content_description_conversation_infos">Информация о групповом чате</string>
</resources>

View file

@ -111,6 +111,7 @@
<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="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_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-->
@ -140,8 +141,8 @@
<!--Dailer-->
<string name="address_bar_hint">Ange ett nummer eller en adress</string>
<!--History-->
<string name="no_call_history">Inget samtal i din historia</string>
<string name="no_missed_call_history">Inget missat samtal i din historia</string>
<string name="no_call_history">Inga samtal i din historik</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="today">Idag</string>
<string name="yesterday">Igår</string>
@ -178,6 +179,7 @@
<string name="displayed">Läs</string>
<string name="delivered">Levererades</string>
<string name="resend">Skicka igen</string>
<string name="error_opening_file">Ett fel uppstår när filen öppnas.</string>
<!--Status Bar-->
<string name="status_connected">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_sipinfo_dtmf">Skicka ut-band DTMF (SIP INFO)</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-->
<string name="pref_chat_title">Chatt</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="cancel">İptal</string>
<string name="accept">Kabul et</string>
<string name="open"></string>
<string name="continue_text">Sürdür</string>
<string name="about">Hakkında</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="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_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_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-->
@ -159,6 +161,8 @@
<string name="delete_conversation">Seçilen görüşmeyi silmek ister misiniz?</string>
<string name="delete_message">Seçilen iletiyi silmek ister misiniz?</string>
<string name="remote_composing">Karşıdan yazılıyor...</string>
<string name="remote_composing_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_medium">Orta</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="displayed">Okundu</string>
<string name="delivered">Ulaştırıldı</string>
<string name="sent">Gönderildi</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-->
<string name="status_connected">Kayıtlı</string>
<string name="status_not_connected">Kayıtsız</string>
@ -233,6 +254,7 @@
<!--Errors-->
<string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</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="error_unknown">Tanımlanmayan hata</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_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_dialer_call">Linphone\'u öntanımlı telefon uygulaması olarak kullan</string>
<!--Chat settings-->
<string name="pref_chat_title">Konuşma</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_title_notification_service">Linphone Hizmeti</string>
<string name="content_title_notification">Linphone Bildirimi</string>
<string name="content_description_conversation_subject">Küme konuşma odası konusu</string>
</resources>

View file

@ -12,7 +12,7 @@
<string name="tunnel_host"></string>
<string name="about_version">Linphone Android %s</string>
<string name="about_liblinphone_version">Linphone Core %s</string>
<string name="about_text">GNU General Public License V2\n © 2010-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="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="conversation_information">Info</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_admin">Admin</string>
<string name="chat_room_participants">Participants</string>
<string name="chat_room_leave_group">Leave the group</string>
<string name="chat_room_creation_filter_hint">Contact filter</string>
<string name="conference_created">group created</string>
<string name="conference_destroyed">group destroyed</string>
<string name="participant_added">%s added</string>
<string name="participant_removed">%s leaved</string>
<string name="chat_room_creation_filter_hint">Search a contact</string>
<string name="conference_created">You have joined the group</string>
<string name="conference_destroyed">You have left the group</string>
<string name="participant_added">%s has joined</string>
<string name="participant_removed">%s has left</string>
<string name="device_added">new device for %s</string>
<string name="device_removed">device for %s removed</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_no_longer_admin">You are no longer admin</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_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="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;
/*
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
modify it under the terms of the GNU General Public License
@ -373,7 +355,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
public void changeStatusToOnThePhone() {
Core lc = getLcIfManagerNotDestroyedOrNull();
if (lc == null) return;
if (isInstanciated() && isPresenceModelActivitySet() && lc.getPresenceModel().getActivity().getType() != PresenceActivity.Type.OnThePhone) {
lc.getPresenceModel().getActivity().setType(PresenceActivity.Type.OnThePhone);
} else if (isInstanciated() && !isPresenceModelActivitySet()) {
@ -584,7 +566,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
BluetoothManagerDestroy();
try {
mTimer.cancel();
mLc = null;
destroyLinphoneCore();
}
catch (RuntimeException e) {
Log.e(e);
@ -623,6 +605,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
}
}
public void restartCore() {
destroyCore();
startLibLinphone(mServiceContext);
@ -687,7 +670,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
Class<?> firebaseClass = Class.forName("com.google.firebase.iid.FirebaseInstanceId");
Object firebaseInstance = firebaseClass.getMethod("getInstance").invoke(null);
final String refreshedToken = (String)firebaseClass.getMethod("getToken").invoke(firebaseInstance);
//final String refreshedToken = com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken();
if (refreshedToken != null) {
Log.i("[Push Notification] current token is: " + refreshedToken);
@ -906,50 +889,15 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void doDestroy() {
ContactsManagerDestroy();
BluetoothManagerDestroy();
try {
mTimer.cancel();
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;
private void destroyLinphoneCore() {
if (LinphonePreferences.instance() != null) {
// We set network reachable at false before destroy LC to not send register with expires at 0
if (LinphonePreferences.instance().isPushNotificationEnabled()
|| LinphonePreferences.instance().isBackgroundModeEnabled()) {
mLc.setNetworkReachable(false);
}
}
mLc = null;
}
public void dozeManager(boolean enable) {
@ -1035,7 +983,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
if (instance == null) return;
getInstance().changeStatusToOffline();
sExited = true;
instance.doDestroy();
instance.destroyCore();
}
private String getString(int key) {
@ -1620,6 +1568,12 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
Log.d("Notify received for event "+eventName);
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
public void onPublishStateChanged(Core lc, Event ev, PublishState state) {
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);
}
}
public void onQrcodeFound(Core lc, String something){
}
}

View file

@ -370,6 +370,13 @@ public class LinphonePreferences {
prxCfg.setQualityReportingCollector(tempQualityReportingCollector);
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){
prxCfg.setDialPrefix(tempPrefix);
}

View file

@ -264,6 +264,9 @@ public final class LinphoneService extends Service {
if (LinphoneManager.isInstanciated())
LinphoneManager.getInstance().subscribeFriendList(false);
}
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().enterBackground();
}
}
protected void onForegroundMode() {
@ -272,6 +275,9 @@ public final class LinphoneService extends Service {
if (LinphoneManager.isInstanciated())
LinphoneManager.getInstance().subscribeFriendList(true);
}
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().enterForeground();
}
}
private void setupActivityMonitor(){

View file

@ -415,7 +415,7 @@ public final class LinphoneUtils {
String extension = LinphoneUtils.getExtensionFromFileName(path);
if(extension != null)
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) {
@ -609,11 +609,7 @@ public final class LinphoneUtils {
if ("com.android.externalstorage.documents".equals(uri.getAuthority())) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
if (split.length >= 1) return Environment.getExternalStorageDirectory() + "/" + split[1];
// TODO handle non-primary volumes
}// Docs storage

View file

@ -240,7 +240,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
@Override
public void onRegistrationStateChanged(Core lc, ProxyConfig proxy, RegistrationState state, String smessage) {
AuthInfo authInfo = lc.findAuthInfo(proxy.getRealm(), proxy.getIdentityAddress().getUsername(), proxy.getDomain());
refreshAccounts();
if(getResources().getBoolean(R.bool.use_phone_number_validation)
@ -371,7 +371,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
}
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;
}
@ -424,6 +425,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
fragment = new ChatListFragment();
break;
case CREATE_CHAT:
checkAndRequestWriteContactsPermission();
fragment = new ChatCreationFragment();
break;
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) {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (message != null)
extras.putString("messageDraft", message);
if (fileUri != null)
@ -694,14 +697,15 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putString("PictureUri", pictureUri);
extras.putString("ThumbnailUri", thumbnailUri);
}
if (sipUri == null && message == null && fileUri == null) {
if (sipUri == null) {
changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras);
} else {
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) {
getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate();
@ -710,23 +714,37 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putSerializable("selectedContacts", selectedContacts);
extras.putString("subject", subject);
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);
}
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()) {
Fragment fragment2 = getFragmentManager().findFragmentById(R.id.fragmentContainer2);
if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.GROUP_CHAT && !emptyFragment) {
GroupChatFragment chatFragment = (GroupChatFragment) fragment2;
chatFragment.changeDisplayedChat(sipUri);
} else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
}
} else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras);
}
@ -734,7 +752,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
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) {
getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate();
@ -744,6 +762,14 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putBoolean("isEditionEnabled", isEditionEnabled);
extras.putSerializable("ContactAddress", contacts);
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);
}
@ -1255,7 +1281,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
int readContactsI = -1;
for (int i = 0; i < permissions.length; i++) {
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;
}
@ -1528,17 +1555,24 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (currentFragment == FragmentsAvailable.DIALER
|| currentFragment == FragmentsAvailable.CONTACTS_LIST
|| currentFragment == FragmentsAvailable.HISTORY_LIST
|| currentFragment == FragmentsAvailable.CHAT_LIST) {
boolean isBackgroundModeActive = LinphonePreferences.instance().isBackgroundModeEnabled();
if (!isBackgroundModeActive) {
stopService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class));
finish();
} else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) {
switch(currentFragment) {
case DIALER :
case CONTACTS_LIST:
case HISTORY_LIST:
case CHAT_LIST:
boolean isBackgroundModeActive = LinphonePreferences.instance().isBackgroundModeEnabled();
if (!isBackgroundModeActive) {
stopService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class));
finish();
} else if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) {
return true;
}
break;
case GROUP_CHAT:
LinphoneActivity.instance().goToChatList();
return true;
}
default:
break;
}
}
return super.onKeyDown(keyCode, event);

View file

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

View file

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

View file

@ -71,6 +71,7 @@ import org.linphone.activities.LinphoneActivity;
import org.linphone.activities.LinphoneGenericActivity;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.CallListenerStub;
import org.linphone.core.Call.State;
import org.linphone.core.CallParams;
import org.linphone.core.CallStats;
@ -138,6 +139,8 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private TimerTask mTask;
private HashMap<String, String> mEncoderTexts;
private HashMap<String, String> mDecoderTexts;
private CallListenerStub mCallListener;
private Call mCallDisplayedInStats;
private boolean oldIsSpeakerEnabled = false;
@ -229,7 +232,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
boolean remoteVideo = call.getRemoteParams().videoEnabled();
boolean localVideo = call.getCurrentParams().videoEnabled();
boolean autoAcceptCameraPolicy = LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests();
if (remoteVideo && !localVideo && !autoAcceptCameraPolicy && !(LinphoneManager.getLc().getConference() != null)) {
if (remoteVideo && !localVideo && !autoAcceptCameraPolicy && !LinphoneManager.getLc().isInConference()) {
showAcceptCallUpdateDialog();
createTimerForDialog(SECONDS_BEFORE_DENYING_CALL_UPDATE);
}
@ -591,7 +594,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void enableAndRefreshInCallActions() {
int confsize = 0;
if( LinphoneManager.getLc().getConference() != null) {
if(LinphoneManager.getLc().isInConference()) {
confsize = LinphoneManager.getLc().getConferenceSize() - (LinphoneManager.getLc().getConference() != null ? 1 : 0);
}
@ -951,7 +954,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
if (currentCall != null) {
lc.terminateCall(currentCall);
} else if (lc.getConference() != null) {
} else if (lc.isInConference()) {
lc.terminateConference();
} else {
lc.terminateAllCalls();
@ -1143,6 +1146,9 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void showAcceptCallUpdateDialog() {
dialog = new Dialog(this);
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));
d.setAlpha(200);
dialog.setContentView(R.layout.dialog);
@ -1409,7 +1415,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
}
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));
//MultiCalls
@ -1486,7 +1492,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
private void exitConference(final Call call){
Core lc = LinphoneManager.getLc();
if (call.getConference() != null) {
if (lc.isInConference()) {
lc.removeFromConference(call);
if (lc.getConferenceSize() <= 1) {
lc.leaveConference();
@ -1503,7 +1509,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
Core lc = LinphoneManager.getLc();
conferenceStatus = (ImageView) findViewById(R.id.conference_pause);
if(conferenceStatus != null) {
if (lc.getConference() != null) {
if (lc.isInConference()) {
conferenceStatus.setImageResource(R.drawable.pause_big_over_selected);
lc.leaveConference();
} else {
@ -1670,9 +1676,16 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
}
public void initCallStatsRefresher(final Call call, final View view) {
if (mCallDisplayedInStats == call) return;
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 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 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();
mTask = new TimerTask() {
@ -1727,7 +1750,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
public void run() {
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() == null) return;
synchronized(LinphoneManager.getLc()) {
if (LinphoneActivity.isInstanciated()) {
if (LinphoneActivity.isInstanciated() && call.getState() != Call.State.Released) {
CallParams params = call.getCurrentParams();
if (params != null) {
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);
}

View file

@ -41,11 +41,13 @@ import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
import org.linphone.contacts.ContactAddress;
import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneNumberOrAddress;
import org.linphone.contacts.SearchContactsListAdapter;
import org.linphone.core.Address;
import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomListenerStub;
import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.ProxyConfig;
import org.linphone.mediastream.Log;
import org.linphone.ui.ContactSelectView;
@ -74,6 +76,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private String mChatRoomSubject, mChatRoomAddress;
private ChatRoom mChatRoom;
private ChatRoomListenerStub mChatRoomCreationListener;
private Bundle mShareInfos;
@Override
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) {
if (newState == ChatRoom.State.Created) {
mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos);
} else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE);
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;
}
@Override
public void onResume() {
ContactsManager.addContactsListener(this);
super.onResume();
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(INPUT_METHOD_SERVICE);
@ -202,6 +222,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
if (mChatRoom != null) {
mChatRoom.removeListener(mChatRoomCreationListener);
}
ContactsManager.removeContactsListener(this);
super.onPause();
}
@ -249,16 +270,30 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private int getIndexOfCa(ContactAddress ca, List<ContactAddress> caList) {
for (int i = 0 ; i < caList.size() ; i++) {
if (caList.get(i).getAddressAsDisplayableString().compareTo(ca.getAddressAsDisplayableString()) == 0)
return i;
if (ca.getAddress() != null && ca.getAddress().getUsername() != null) {
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;
}
private void resetAndResearch() {
ContactsManager.getInstance().getMagicSearch().resetSearchCache();
mSearchAdapter.searchContacts(mSearchField.getText().toString(), mContactsList);
}
private void addSelectedContactAddress(ContactAddress ca) {
View viewContact = LayoutInflater.from(LinphoneActivity.instance()).inflate(R.layout.contact_selected, 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 {
((TextView) viewContact.findViewById(R.id.sipUri)).setText(ca.getAddressAsDisplayableString());
}
@ -323,6 +358,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mLinphoneContactsButton.setEnabled(true);
mLinphoneContactsSelected.setVisibility(View.INVISIBLE);
updateList();
resetAndResearch();
} else if (id == R.id.linphone_contacts) {
mSearchAdapter.setOnlySipContact(true);
mLinphoneContactsSelected.setVisibility(View.VISIBLE);
@ -330,6 +366,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mAllContactsButton.setEnabled(mOnlyDisplayLinphoneContacts = true);
mAllContactsSelected.setVisibility(View.INVISIBLE);
updateList();
resetAndResearch();
} else if (id == R.id.back) {
if (LinphoneActivity.instance().isTablet()) {
LinphoneActivity.instance().goToChatList();
@ -353,17 +390,17 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
mChatRoom.addParticipant(participant);
} else {
chatRoom = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
}
} else {
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
}
} else {
mContactsSelectedLayout.removeAllViews();
LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false);
LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos);
}
} else {
LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true);
LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true, mShareInfos);
}
} else if (id == R.id.clearSearchField) {
mSearchField.setText("");
@ -381,7 +418,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc == null || lpc.getConferenceFactoryUri() == null) {
ChatRoom chatRoom = lc.getChatRoom(ca.getAddress());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos);
} else {
removeContactFromSelection(ca);
}
@ -389,6 +426,6 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
@Override
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() {
@Override
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);
}else{
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();
if (adapter != null && adapter.getItemCount() > 0) {
ChatRoom room = (ChatRoom) adapter.getItem(0);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else {
LinphoneActivity.instance().displayEmptyFragment();
}
@ -403,11 +403,9 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
lc.removeListener(mListener);
}
ContactsManager.removeContactsListener(this);
mChatRoomsAdapter.clear();
super.onPause();
}
@Override

View file

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

View file

@ -69,7 +69,6 @@ import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.ChatRoomListener;
import org.linphone.core.Content;
import org.linphone.core.Core;
import org.linphone.core.Event;
import org.linphone.core.EventLog;
import org.linphone.core.Factory;
import org.linphone.core.LimeState;
@ -160,10 +159,10 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
String displayName = LinphoneUtils.getAddressDisplayName(a);
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);
}
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);
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;
}
@ -290,7 +308,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
if (LinphoneUtils.isExtensionImage(fileToUploadPath)) {
addImageToPendingList(fileToUploadPath);
} else {
if (fileToUploadPath.startsWith("content://")) {
if (fileToUploadPath.startsWith("content://") || fileToUploadPath.startsWith("file://")) {
fileToUploadPath = LinphoneUtils.getFilePath(this.getActivity().getApplicationContext(), Uri.parse(fileToUploadPath));
} else if (fileToUploadPath.contains("com.android.contacts/contacts/")) {
fileToUploadPath = LinphoneUtils.getCVSPathFromLookupUri(fileToUploadPath).toString();
@ -369,28 +387,29 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
ChatMessage message = event.getChatMessage();
String messageId = message.getMessageId();
switch(item.getItemId()) {
case R.id.resend:
mEventsAdapter.removeItem(info.position);
message.resend();
return true;
case R.id.imdn_infos:
LinphoneActivity.instance().goToChatMessageImdnInfos(getRemoteSipUri(), messageId);
return true;
case R.id.copy_text:
if (message.hasTextContent()) {
ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Message", message.getTextContent());
clipboard.setPrimaryClip(clip);
}
return true;
case R.id.delete_message:
mChatRoom.deleteMessage(message);
mEventsAdapter.removeItem(info.position);
return true;
default:
return super.onContextItemSelected(item);
if (item.getItemId() == R.id.resend) {
mEventsAdapter.removeItem(info.position);
message.resend();
return true;
}
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
return;
}
Address proxyConfigContact = core.getDefaultProxyConfig().getContact();
Address proxyConfigContact = (core.getDefaultProxyConfig() != null) ? core.getDefaultProxyConfig().getContact() : null;
if (proxyConfigContact != null) {
mChatRoom = core.findOneToOneChatRoom(proxyConfigContact, mRemoteSipAddress);
}
@ -697,7 +716,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
public void onConferenceAddressGeneration(ChatRoom cr) {
}
@Override
public void onParticipantDeviceFetchRequested(ChatRoom cr, Address addr) {
@ -705,7 +724,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
@Override
public void onParticipantRegistrationSubscriptionRequested(ChatRoom cr, Address participantAddr){
}
@Override
public void onParticipantRegistrationUnsubscriptionRequested(ChatRoom cr, Address participantAddr){
}
@ -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
public void onChatMessageReceived(ChatRoom cr, EventLog event) {
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
public void onParticipantAdminStatusChanged(ChatRoom cr, EventLog 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 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()) {
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 Dialog mAdminStateChangedDialog;
private ChatRoomListenerStub mChatRoomCreationListener;
private Bundle mShareInfos;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -118,18 +119,30 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mParticipantsList.setAdapter(mAdapter);
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.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mIsAlreadyCreatedGroup) {
if (LinphoneActivity.instance().isTablet()) {
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly());
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly(), mShareInfos);
} else {
getFragmentManager().popBackStack();
}
} 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) {
if (mChatRoom != null) {
mChatRoom.leave();
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString());
LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString(), null);
} else {
Log.e("Can't leave, chatRoom for address " + mGroupChatRoomAddress.asString() + " is null...");
}
@ -174,7 +187,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
@Override
public void onClick(View view) {
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() {
@Override
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
getFragmentManager().popBackStack();
getFragmentManager().popBackStack();
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos);
} else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError();
@ -289,7 +302,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
toAdd.toArray(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);
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);
}
@ -382,6 +395,14 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mAdminStateChangedDialog.show();
}
@Override
public void onConferenceJoined(ChatRoom cr, EventLog event_log) {
}
@Override
public void onConferenceLeft(ChatRoom cr, EventLog event_log) {
}
@Override
public void onParticipantAdded(ChatRoom cr, EventLog event_log) {
refreshParticipantsList();
@ -458,16 +479,11 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
}
@Override
public void onAllInformationReceived(ChatRoom cr) {
}
@Override
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
}
@Override
public void onParticipantDeviceFetchRequested(ChatRoom cr, Address addr) {
@ -475,7 +491,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
@Override
public void onParticipantRegistrationSubscriptionRequested(ChatRoom cr, Address participantAddr){
}
@Override
public void onParticipantRegistrationUnsubscriptionRequested(ChatRoom cr, Address participantAddr){
}

View file

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

View file

@ -31,6 +31,7 @@ public class ContactAddress implements Serializable {
private LinphoneContact contact;
private SearchResult result;
private String address;
private String phoneNumber;
private boolean isLinphoneContact;
private boolean isSelect = false;
private boolean isAdmin = false;
@ -69,11 +70,13 @@ public class ContactAddress implements Serializable {
}
public String getAddressAsDisplayableString() {
Address addr = getAddress();
if (addr != null && addr.getUsername() != null) return addr.asStringUriOnly();
return address;
}
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);
// Remove the user=phone URI param if existing, it will break everything otherwise
if (addr.hasUriParam("user")) {
@ -82,6 +85,30 @@ public class ContactAddress implements Serializable {
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) {
isSelect = select;
}
@ -90,16 +117,19 @@ public class ContactAddress implements Serializable {
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.address = a;
this.phoneNumber = pn;
this.isLinphoneContact = isLC;
}
public ContactAddress(LinphoneContact c, String a, boolean isLC, boolean isAdmin){
this.contact = c;
this.address = a;
this.isLinphoneContact = isLC;
public ContactAddress(LinphoneContact c, String a, String pn, boolean isLC) {
init(c, a, pn, isLC);
}
public ContactAddress(LinphoneContact c, String a, String pn, boolean isLC, boolean isAdmin) {
init(c, a, pn, isLC);
this.isAdmin = isAdmin;
}

View file

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

View file

@ -264,11 +264,20 @@ public class ContactsManager extends ContentObserver {
}
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) {
if (sipContacts.isEmpty()) {
if (sipContacts.isEmpty() || sipContacts.size() > c.size()) {
sipContacts = c;
} else {
for (LinphoneContact contact : c) {
@ -277,6 +286,7 @@ public class ContactsManager extends ContentObserver {
}
}
}
Collections.sort(sipContacts);
}
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");
}
Collections.sort(contacts);
Collections.sort(sipContacts);
setContacts(contacts);
setSipContacts(sipContacts);

View file

@ -75,6 +75,13 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
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) {
fullName = name;
}

View file

@ -40,13 +40,20 @@ public class LinphoneNumberOrAddress implements Serializable, Comparable<Linphon
@Override
public int compareTo(LinphoneNumberOrAddress noa) {
if (noa.isSIPAddress() == isSIPAddress()) {
if (noa.isSIPAddress() == isSIPAddress() && noa.getValue() != null) {
return noa.getValue().compareTo(getValue());
} else {
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() {
return isSIPAddress;
}

View file

@ -33,6 +33,8 @@ import org.linphone.LinphoneUtils;
import org.linphone.R;
import org.linphone.activities.LinphoneActivity;
import org.linphone.core.Address;
import org.linphone.core.Factory;
import org.linphone.core.ProxyConfig;
import org.linphone.core.SearchResult;
import java.util.ArrayList;
@ -62,7 +64,6 @@ public class SearchContactsListAdapter extends BaseAdapter {
private ProgressBar progressBar;
private boolean mOnlySipContact = false;
private View.OnClickListener listener;
private int oldSize;
public List<ContactAddress> getContacts() {
return contacts;
@ -81,14 +82,18 @@ public class SearchContactsListAdapter extends BaseAdapter {
progressBar = pB;
setContactsSelectedList(null);
setContactsList(contactsList);
oldSize = 0;
}
private boolean contactIsSelected(ContactAddress ca) {
for (ContactAddress c : contactsSelected) {
Address addr = c.getAddress();
if (addr == null) continue;
if (addr.asStringUriOnly().compareTo(ca.getAddress().asStringUriOnly()) == 0) return true;
if (addr.getUsername() != null && ca.getAddress() != null) {
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;
}
@ -122,11 +127,18 @@ public class SearchContactsListAdapter extends BaseAdapter {
for (LinphoneContact contact : contacts) {
for (LinphoneNumberOrAddress noa : contact.getNumbersOrAddresses()) {
if (!mOnlySipContact || (mOnlySipContact && (noa.isSIPAddress() || contact.getPresenceModelForUriOrTel(noa.getValue()) != null))) {
Address address = LinphoneManager.getLc().interpretUrl(noa.getValue());
if (address != null) {
ContactAddress ca = new ContactAddress(contact, address.asString(), contact.isFriend());
list.add(ca);
ContactAddress ca = null;
if (noa.isSIPAddress()) {
Address address = LinphoneManager.getLc().interpretUrl(noa.getValue());
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) {
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<>();
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) {
boolean found = false;
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(sr.getAddress());
if (contact == null) {
contact = new LinphoneContact();
@ -176,25 +181,26 @@ public class SearchContactsListAdapter extends BaseAdapter {
contact.refresh();
}
}
if (sr.getAddress() != null) {
if (contact.getFullName() == null) {
contact.setFullName(search);
}
boolean found = false;
if (sr.getAddress() != null || sr.getPhoneNumber() != null) {
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;
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;
resultContactsSearch.setAdapter(this);
this.notifyDataSetChanged();
@ -215,7 +221,7 @@ public class SearchContactsListAdapter extends BaseAdapter {
}
ContactAddress contact = getItem(position);
final String a = contact.getAddressAsDisplayableString();
final String a = (contact.getAddressAsDisplayableString().isEmpty()) ? contact.getPhoneNumber() : contact.getAddressAsDisplayableString();
LinphoneContact c = contact.getContact();
holder.avatar.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
@ -223,11 +229,24 @@ public class SearchContactsListAdapter extends BaseAdapter {
LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), holder.avatar, c.getThumbnailUri());
}
String address = null;
String address = contact.getAddressAsDisplayableString();
if (c != null && c.getFullName() != null) {
address = c.getPresenceModelForUriOrTel(a);
if (address == null)
address = c.getPresenceModelForUriOrTel(a);
holder.name.setVisibility(View.VISIBLE);
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 {
holder.name.setVisibility(View.GONE);
}

View file

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

View file

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

View file

@ -109,7 +109,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
if (newState == ChatRoom.State.Created) {
mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), null);
} else if (newState == ChatRoom.State.CreationFailed) {
mWaitLayout.setVisibility(View.GONE);
LinphoneActivity.instance().displayChatRoomError();
@ -199,7 +199,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
Address participant = Factory.instance().createAddress(sipUri);
ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant);
if (room != null) {
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else {
ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
@ -209,7 +209,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
mChatRoom.addParticipant(participant);
} else {
room = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly());
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
}
}
} 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);
String displayName = null;
final String sipUri = address.asString();
final String sipUri = (address != null) ? address.asString() : "";
if (c != null) {
displayName = c.getFullName();
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) {
boolean enable = (Boolean) newValue;
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;
}
});

View file

@ -402,6 +402,9 @@ public class StatusFragment extends Fragment {
ZRTPdialog = new Dialog(getActivity());
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));
d.setAlpha(200);
ZRTPdialog.setContentView(R.layout.dialog);

View file

@ -64,9 +64,11 @@ public class ListSelectionHelper {
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
if (mAdapter.getCount() > 0) {
mAdapter.enableEdition(true);
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*));
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
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_result_pointer sqlite3_api->result_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) */
#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"