87 Commits

Author SHA1 Message Date
Jehan Monnier
2a1b1aaa56 premier commentaires 2021-08-18 15:12:23 +02:00
QuentinArguillere
3f09bddbf5 Add RemoteNotification tutorial 2021-07-29 11:42:54 +02:00
QuentinArguillere
d064fb5712 Ignore build files in git 2021-07-29 11:42:43 +02:00
QuentinArguillere
b2bc5b1b12 Update createAndInitializeAccount common function for easier push settings understanding 2021-07-29 11:28:46 +02:00
QuentinArguillere
a63960ab0b Delegate refactoring, and enable audio route selection in CallTutorial 2021-05-28 16:09:56 +02:00
QuentinArguillere
f543236284 Update tutorials to sdk 5.0 2021-05-27 15:03:06 +02:00
QuentinArguillere
1ad34aaaf0 Add separate view once the chatroom is instantiated. If in a group chatroom, allow to add or remove participants. 2020-10-19 17:32:24 +02:00
QuentinArguillere
8de8c30812 Add animation and wait for callback to confirm download 2020-10-16 15:59:15 +02:00
QuentinArguillere
a625d12c10 Chatroom tutorial rework : add encryption, sending and receiving of files 2020-10-15 16:10:41 +02:00
QuentinArguillere
6f2684a0c1 Expose audio output selection 2020-10-08 17:24:47 +02:00
QuentinArguillere
def8aefef6 Allow to reset the chatroom, and add delegates even to basic chatroom messages 2020-10-08 17:23:57 +02:00
QuentinArguillere
095492356c Generic default values 2020-10-07 15:50:08 +02:00
QuentinArguillere
ae825689a2 Completely rework the chatroom tutorial to make it more intuitive : you now interact with an existing Linphone on a second phone 2020-10-07 15:49:17 +02:00
QuentinArguillere
3db5eb4912 Update delegates, remove settings not really relevant to CallKit 2020-10-07 14:18:14 +02:00
QuentinArguillere
c0a5b0fb17 Update videocall delegates, remove audio device selection 2020-10-07 11:49:25 +02:00
QuentinArguillere
56f49244f9 Fix registration delegate 2020-10-07 11:38:30 +02:00
QuentinArguillere
dfbe6e2d55 Put all callbacks in a single delegate, fix registration callback, reset call state when an error occurs (such as, call is not answered) 2020-10-07 11:35:14 +02:00
QuentinArguillere
d2f9cf7557 Fix build 2020-09-29 13:38:35 +02:00
QuentinArguillere
6acd6f25dc Push for some testing on audio routes 2020-09-29 13:37:29 +02:00
QuentinArguillere
964e1d87a1 Remove typo 2020-09-24 15:00:33 +02:00
QuentinArguillere
68bd403073 Fix build, use new variable for SwiftUI view display of videos 2020-09-01 12:09:55 +02:00
QuentinArguillere
cc14ab9a00 New, cleaner GUI. Refactor the implementation to limit the code duplication between basic and flexisip chatrooms 2020-08-31 16:03:33 +02:00
QuentinArguillere
db4fb58bbb Remove old HelloLinphone tutorial 2020-08-28 17:00:33 +02:00
QuentinArguillere
8b4eda1eed Pointer management is now done inside the Core’s WindowID variables 2020-08-28 12:11:50 +02:00
QuentinArguillere
263a245a69 Use TutorialCommons, and host data in the AppDelegate 2020-08-27 17:29:10 +02:00
QuentinArguillere
637353467c Move data hosting from the view to the AppDelegate 2020-08-27 14:06:10 +02:00
QuentinArguillere
94754575cd Use the new LinphoneVideoViewHolder to display call video & call preview 2020-08-27 14:00:00 +02:00
QuentinArguillere
f10d7065b0 Add video preview. Move all video display intelligence to the GUI part 2020-08-26 11:10:48 +02:00
QuentinArguillere
8d234d6634 Remove video-related parts of the CallTutorial 2020-08-25 15:37:59 +02:00
QuentinArguillere
69fd064dd4 Slightly cleaner video GUI 2020-08-25 15:18:01 +02:00
QuentinArguillere
46f60df8f7 Delete unwanted file 2020-08-25 15:17:51 +02:00
QuentinArguillere
76444d3442 Remove unused variables from VideoCall example 2020-08-25 15:05:07 +02:00
QuentinArguillere
0ab2f9db7a Switch spaces for tabs in indentation 2020-08-25 15:03:41 +02:00
QuentinArguillere
50560956d7 Create VideoCallTutorial project 2020-08-25 14:47:07 +02:00
QuentinArguillere
b77e35c7fc Use TutorialCommons 2020-08-17 12:09:21 +02:00
QuentinArguillere
9a35475c3c Use TutorialCommons in CallTutorial 2020-08-17 11:59:37 +02:00
QuentinArguillere
ffb3647975 Delete empty file 2020-08-17 11:59:18 +02:00
QuentinArguillere
a562f6b37c Add mute microphone toggle 2020-08-17 11:31:38 +02:00
QuentinArguillere
e5ec19d1ae Update delegates to match new signature 2020-08-17 11:30:39 +02:00
QuentinArguillere
d76ef9ea16 Refactoring : use TutorialCommons tools 2020-08-17 10:57:44 +02:00
QuentinArguillere
6d386756a1 Added TutorialCommons folder, containing tools that will be used in all other tutorials 2020-08-17 10:57:29 +02:00
QuentinArguillere
cc895c57b0 Add configuration file to the push tutorial, in order to have have the incoming calls work even if the app was terminated and is launch by the push notification 2020-08-13 11:22:56 +02:00
QuentinArguillere
0f086498e4 Move CallExampleContext ownership to the AppDelegate. When receiving a PushIncoming call, register (else call won’t work) 2020-08-12 16:43:26 +02:00
QuentinArguillere
2c9ab954e1 Update push tutorial to work with the incoming push_notification_branch of the Linphone-sdk. Most of the push-intelligence implementation is now done in the core, and there are less things the user has to do to configure it 2020-08-12 15:22:11 +02:00
QuentinArguillere
f9530878d6 Explicit the use of the app bundle ID in the push credentials 2020-08-11 09:26:42 +02:00
QuentinArguillere
469894d944 fix bug where “update call” button wouldn’t work when answering an incoming call 2020-08-10 18:12:08 +02:00
QuentinArguillere
375337498b Move outgoing call intelligence to CallKit delegate 2020-08-10 18:12:00 +02:00
QuentinArguillere
6704c0fdcb Use appropriate certificate 2020-08-10 17:56:45 +02:00
QuentinArguillere
fac345747d Properly setup new CallKitTutorial directory, rename/remove old CallTutorial related files 2020-08-10 17:06:27 +02:00
QuentinArguillere
62e6bcd40c Remove all CallKit // PushKit related code from CallTutorial 2020-08-10 16:49:45 +02:00
QuentinArguillere
55e93d7053 Duplicate CallTutorial in order to have one specifically for CallKit / PushKit integration 2020-08-10 16:44:52 +02:00
QuentinArguillere
9974108511 Change incoming call detection, use push notification instead. TODO : use appropriate certificate (currently recycling the one from linphone-swift-tutorial app) 2020-08-10 16:40:24 +02:00
QuentinArguillere
b0b6f29e99 Added example of how to log out, and log back in, in login tutorial 2020-08-07 10:10:51 +02:00
QuentinArguillere
106d89acb1 Update call kit provider configuration to support only 1 call 2020-08-06 16:20:43 +02:00
QuentinArguillere
ee36a24700 Move the all the call-related flag (isRunning, isCallIncoming) to be done in CallState delegate 2020-08-06 15:51:21 +02:00
QuentinArguillere
59b3f0d688 Remove useless line pasted by mistake, added extra comments 2020-08-06 15:32:06 +02:00
QuentinArguillere
69b7a7f447 Properly handle CallKit termination when calls end 2020-08-06 15:14:49 +02:00
QuentinArguillere
f723655265 Add CallKit basic integration for outgoing/incoming calls 2020-08-06 13:58:26 +02:00
QuentinArguillere
4830d38167 Added registration code for incoming calls, add incoming call actions to the UI 2020-08-04 17:54:59 +02:00
QuentinArguillere
24e23aaf59 Update login tutorial to use delegates rather than hard-coded flag 2020-08-04 17:37:43 +02:00
QuentinArguillere
3c1f685690 Remove unused function 2020-08-04 17:28:46 +02:00
QuentinArguillere
99d4325888 Add registration code on start, start working to accept incoming calls in this example 2020-08-04 14:49:35 +02:00
QuentinArguillere
b15a87f24b Copied ChatRoom tutorial code from HelloLinphone to a separate stand alone project 2020-08-04 10:51:22 +02:00
QuentinArguillere
a9db9356ab Copied registration code from HelloLinphone to standalone tutorial 2020-07-31 16:52:07 +02:00
QuentinArguillere
4fabbb1ab6 Remove accidental double initialisation of mVideoDevice 2020-07-31 16:45:09 +02:00
QuentinArguillere
4a51bee890 Copied from HelloLinphone all code related to the Call tutorials 2020-07-31 16:10:06 +02:00
QuentinArguillere
f880ce85e9 Added audioEnabled toggle 2020-07-31 16:09:29 +02:00
QuentinArguillere
5154a3f916 Add option to change which camera is used to capture the video in chat 2020-07-31 14:18:03 +02:00
QuentinArguillere
ed9241b22d Added option to make a video call, and to redirect sound output to speaker 2020-07-31 13:52:47 +02:00
QuentinArguillere
f6eaaeb726 Add reply chat action 2020-07-30 15:51:57 +02:00
QuentinArguillere
715d00f08f Add logs control to the GUI 2020-07-30 15:32:00 +02:00
QuentinArguillere
f35d3d4f2e Light refactoring for clarity. Added option to create a Basic chatroom as well as a Flexisip one 2020-07-30 15:17:09 +02:00
QuentinArguillere
2fb5d14ea8 Added simple text exchange through FlexiSIP chatroom 2020-07-29 18:01:11 +02:00
QuentinArguillere
3a3fc41250 Tidying up for visibility, extra comments 2020-07-29 17:06:09 +02:00
QuentinArguillere
9f147836a8 Light Refactor : move some example values to new LinphoneTutorialContext variables 2020-07-29 16:58:56 +02:00
QuentinArguillere
6bdfe1c70e Send a test message when the chatroom is fully created 2020-07-29 16:18:00 +02:00
QuentinArguillere
00dcfd490f Renamed LinphoneCoreHolder to LinphoneTutorialContext. Instead of using a singleton, pass the context to delegate when required. 2020-07-29 16:17:18 +02:00
QuentinArguillere
d1a7ccc4a5 Added flexisip chatroom creation 2020-07-29 13:11:36 +02:00
QuentinArguillere
91436a9981 LinphoneCoreHolder is now a singleton in order to have a more convenient access to flags from delegates. Also, light improvement to GUI and registration method. 2020-07-29 13:06:43 +02:00
QuentinArguillere
6385741ad9 Add clearer instructions to disable/enable logs 2020-07-28 11:01:00 +02:00
QuentinArguillere
147a9c0697 Rework GUI in order to have more feedback, and use ObservableObjects to bind on some state variables 2020-07-28 10:55:37 +02:00
QuentinArguillere
2c9a5ea18d Add simple outgoing call code and GUI 2020-07-27 18:18:07 +02:00
QuentinArguillere
0177553d4f Move registration example from SceneDelegate to ContentView, add a simple GUI 2020-07-27 18:16:52 +02:00
QuentinArguillere
d88f43c47c Add access to microphone to info.plist 2020-07-27 18:16:04 +02:00
QuentinArguillere
982d165518 Added registration example, directly inspired by linphone-swift-tutorial repository 2020-07-24 16:03:12 +02:00
QuentinArguillere
2232c85380 Use linphone-sdk version 4.5.0-alpha 2020-07-24 15:55:28 +02:00
Danmei Chen
b5769d5ee4 init HelloLinphone 2020-06-23 15:16:00 +02:00
753 changed files with 2975 additions and 29112 deletions

28
.gitignore vendored
View File

@@ -12,25 +12,9 @@ java/build
java/captures
java/.externalNativeBuild
java/.cxx
# C# / UWP Files / VS Specifiq files
.vs/
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*UpgradeLog*.htm
AppPackages
[Oo]bj/
[Bb]in/
ios/swift/*/Podfile.lock
ios/swift/*/Pods/
ios/swift/*/*.xcodeproj/project.xcworkspace/xcuserdata/
ios/swift/*/*.xcodeproj/xcuserdata/
ios/swift/*/*.xcworkspace/xcuserdata/
ios/swift/*/build
ios/swift/*/*.xcworkspace
swift/*/Podfile.lock
swift/*/Pods/
swift/*/*.xcodeproj/project.xcworkspace/xcuserdata/
swift/*/*.xcodeproj/xcuserdata/
swift/*/*.xcworkspace/xcuserdata/
swift/*/build

View File

@@ -1,53 +0,0 @@
.job-android:
stage: build
tags: [ "docker-android" ]
image: gitlab.linphone.org:4567/bc/public/linphone-android/bc-dev-android:30
job-android-hello-world:
extends: .job-android
script:
- cd android/kotlin/0-HelloWorld/
- ./gradlew assembleRelease
job-android-account:
extends: .job-android
script:
- cd android/kotlin/1-AccountLogin/
- ./gradlew assembleRelease
job-android-push-notifications:
extends: .job-android
script:
- cd android/kotlin/2-PushNotifications/
- ./gradlew assembleRelease
job-android-basic-chat:
extends: .job-android
script:
- cd android/kotlin/5-BasicChat/
- ./gradlew assembleRelease
job-android-advanced-chat:
extends: .job-android
script:
- cd android/kotlin/6-AdvancedChat/
- ./gradlew assembleRelease
job-android-group-chat:
extends: .job-android
script:
- cd android/kotlin/7-GroupChat/
- ./gradlew assembleRelease
job-android-incoming-call:
extends: .job-android
script:
- cd android/kotlin/3-IncomingCall/
- ./gradlew assembleRelease
job-android-outgoing-call:
extends: .job-android
script:
- cd android/kotlin/4-OutgoingCall/
- ./gradlew assembleRelease

View File

@@ -1,13 +0,0 @@
job-windows:
stage: build
tags: [ "windows" ]
script:
# Build VS project
#Remove MinGW of MSYS from PATH and add MINGW_TYPE for MSYS2
- echo %PATH%
- cd uwp\cs
- |
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" -t:restore -verbosity:minimal
- |
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" TutorialsCS.sln /m /property:Configuration=Release /property:Platform=x64 -verbosity:quiet

View File

@@ -1,17 +0,0 @@
#################################################
# Base configuration
#################################################
#################################################
# Platforms to test
#################################################
include:
- '.gitlab-ci-files/job-android.yml'
- '.gitlab-ci-files/job-windows.yml'
stages:
- build

0
README Normal file
View File

View File

@@ -1,43 +0,0 @@
Linphone SDK tutorials
====================
This repository holds tutorials explaining how to set up [Linphone-SDK](https://gitlab.linphone.org/BC/public/linphone-sdk/)
in a Android / iOS / desktop projects and use it to implement some simple features.
## License
Copyright © Belledonne Communications
Tutorials are published under [GNU/GPLv3 license](https://www.gnu.org/licenses/gpl-3.0.en.html), for free (open source).
Please make sure that you understand and agree with the terms of this license before using it (see LICENSE.txt file for details).
## Android
Even though Linphone's APIs are available in Java, Android tutorials have been created in Kotlin as it is the current standard for Android apps.
Linphone-SDK will be downloaded automatically by gradle from our [Maven repository](https://linphone.org/maven_repository/org/linphone/linphone-sdk-android/).
## iOS
In the same way, iOS tutorials are written in Swift but the same can be achieved through Objective-C.
Linphone-SDK binaries are fetched from our [Cocoapods repository](https://gitlab.linphone.org/BC/public/podspec.git) for iOS.
## Desktop
Desktop tutorials are in C#, leveraging on our Nuget packaging.
## Additional resources
All tutorials require a SIP account to function, and if you don't have one you can create as many as you want and for free using our [free SIP service](https://subscribe.linphone.org/).
You can check our [website](https://linphone.org/) for news, supported RFCs, licensing services, etc...
Full API documentation is available for all of our supported languages:
* [C++](http://linphone.org/snapshots/docs/liblinphone/latest/c++)
* [C#](http://linphone.org/snapshots/docs/liblinphone/latest/cs)
* [Java](http://linphone.org/snapshots/docs/liblinphone/latest/java)
* [Swift](http://linphone.org/snapshots/docs/liblinphone/latest/swift)
* [C](http://linphone.org/snapshots/docs/liblinphone/latest/c)
Finally we also have a [wiki](https://wiki.linphone.org/xwiki/wiki/public/view/Main/) with articles on various subjects.

View File

@@ -1,13 +0,0 @@
Android tutorials
====================
Tutorials are written in Kotlin, but the same features can be achieved in Java.
Tutorials are numbered 0 to 6, and we recommend you to read them in that order as features from previous tutorials are used in the next ones, such as account login.
Each tutorial is a full project, so you can import it in Android Studio, build it and deploy it on a real device or an emulator.
Code is being kept as short and simple as possible, and comments explain how and why things are being done.
You can focus on the Activity and build.gradle files, the rest being projects / UI files.
Full Java API is available [here](http://linphone.org/snapshots/docs/liblinphone/latest/java).

View File

@@ -1,15 +0,0 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State />
<State>
<id>Android</id>
</State>
<State>
<id>CorrectnessLintAndroid</id>
</State>
<State>
<id>Gradle</id>
</State>
<State>
<id>LintAndroid</id>
</State>
<State>
<id>Probable bugsGradle</id>
</State>
</expanded-state>
</profile-state>
</entry>
</component>
</project>

View File

@@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@@ -1 +0,0 @@
Hello World

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
</component>
</project>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<targetSelectedWithDropDown>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_2_API_29.avd" />
</Key>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2021-08-25T15:48:59.707583Z" />
</component>
</project>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="JDK" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://linphone.org/maven_repository" />
</remote-repository>
</component>
</project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

View File

@@ -1,8 +0,0 @@
Hello World tutorial
====================
The purpose of this tutorial is to explain how to add our SDK as a dependency of an Android project and how to create the `Core` object that all our APIs depends on.
Start by taking a look at the `app/build.gradle` file to see how our Maven repository is being set up and how to add the gradle dependency on our SDK.
The user interface will only display the `Core`'s version, but in the next tutorial you will learn how to use it to login your SIP account.

View File

@@ -1,48 +0,0 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "org.linphone.helloworld"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
// We need to declare this repository to be able to use Liblinphone SDK
repositories {
maven {
url "https://linphone.org/maven_repository"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
// Latest version is 5.0.x, using + to get the latest available
implementation 'org.linphone:linphone-sdk-android:5.0+'
}

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.linphone.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HelloWorld">
<activity
android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -1,51 +0,0 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.helloworld
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.linphone.core.Factory
class HelloWorldActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Check the app/build.gradle to see how to import the LibLinphone SDK !!!
setContentView(R.layout.hello_world_activity)
val coreVersion = findViewById<TextView>(R.id.core_version)
// Core is the main object of the SDK. You can't do much without it.
// To create a Core, we need the instance of the Factory.
val factory = Factory.instance()
// Some configuration can be done before the Core is created, for example enable debug logs.
factory.setDebugMode(true, "Hello Linphone")
// Your Core can use up to 2 configuration files, but that isn't mandatory.
// On Android the Core needs to have the application context to work.
// If you don't, the following method call will crash.
val core = factory.createCore(null, null, this)
// Now we can start using the Core object
coreVersion.text = core.version
}
}

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/core_version"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,16 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.HelloWorld" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@@ -1,3 +0,0 @@
<resources>
<string name="app_name">Hello World</string>
</resources>

View File

@@ -1,16 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.HelloWorld" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -1,2 +0,0 @@
include ':app'
rootProject.name = "Hello World"

View File

@@ -1,15 +0,0 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State />
<State>
<id>Android</id>
</State>
<State>
<id>CorrectnessLintAndroid</id>
</State>
<State>
<id>Gradle</id>
</State>
<State>
<id>LintAndroid</id>
</State>
<State>
<id>Probable bugsGradle</id>
</State>
</expanded-state>
</profile-state>
</entry>
</component>
</project>

View File

@@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@@ -1 +0,0 @@
Account Login

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="JDK" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://linphone.org/maven_repository" />
</remote-repository>
</component>
</project>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="app/src/main/res/layout/account_login_activity.xml" value="0.3223958333333333" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

View File

@@ -1,10 +0,0 @@
Account login tutorial
====================
Now that you have set up Linphone-SDK in an Android project, let's start using it.
We will see how to login on a SIP server using the `Core` object instanciated in the previous tutorial.
If you don't have a SIP server yet, you can create an account for free using our [free SIP service](https://subscribe.linphone.org/).
Once you'll be logged-in, you'll be able to continue to the next tutorials to make calls and send messages.

View File

@@ -1 +0,0 @@
/build

View File

@@ -1,50 +0,0 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "org.linphone.accountlogin"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
// We need to declare this repository to be able to use Liblinphone SDK
repositories {
maven {
url "https://linphone.org/maven_repository"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
// Latest version is 5.0.x, using + to get the latest available
implementation 'org.linphone:linphone-sdk-android:5.0+'
}

View File

@@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.linphone.accountlogin">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AccountLogin">
<activity
android:name=".AccountLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -1,169 +0,0 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.accountlogin
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.RadioGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.linphone.core.*
import org.linphone.core.tools.Log
class AccountLoginActivity: AppCompatActivity() {
private lateinit var core: Core
// Create a Core listener to listen for the callback we need
// In this case, we want to know about the account registration status
private val coreListener = object: CoreListenerStub() {
override fun onAccountRegistrationStateChanged(core: Core, account: Account, state: RegistrationState, message: String) {
// If account has been configured correctly, we will go through Progress and Ok states
// Otherwise, we will be Failed.
findViewById<TextView>(R.id.registration_status).text = message
if (state == RegistrationState.Failed || state == RegistrationState.Cleared) {
findViewById<Button>(R.id.connect).isEnabled = true
} else if (state == RegistrationState.Ok) {
findViewById<Button>(R.id.disconnect).isEnabled = true
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.account_login_activity)
val factory = Factory.instance()
factory.setDebugMode(true, "Hello Linphone")
core = factory.createCore(null, null, this)
findViewById<Button>(R.id.connect).setOnClickListener {
login()
it.isEnabled = false
}
findViewById<Button>(R.id.disconnect).setOnClickListener {
unregister()
it.isEnabled = false
}
findViewById<Button>(R.id.delete).setOnClickListener {
delete()
it.isEnabled = false
}
val coreVersion = findViewById<TextView>(R.id.core_version)
coreVersion.text = core.version
}
private fun login() {
val username = findViewById<EditText>(R.id.username).text.toString()
val password = findViewById<EditText>(R.id.password).text.toString()
val domain = findViewById<EditText>(R.id.domain).text.toString()
// Get the transport protocol to use.
// TLS is strongly recommended
// Only use UDP if you don't have the choice
val transportType = when (findViewById<RadioGroup>(R.id.transport).checkedRadioButtonId) {
R.id.udp -> TransportType.Udp
R.id.tcp -> TransportType.Tcp
else -> TransportType.Tls
}
// To configure a SIP account, we need an Account object and an AuthInfo object
// The first one is how to connect to the proxy server, the second one stores the credentials
// The auth info can be created from the Factory as it's only a data class
// userID is set to null as it's the same as the username in our case
// ha1 is set to null as we are using the clear text password. Upon first register, the hash will be computed automatically.
// The realm will be determined automatically from the first register, as well as the algorithm
val authInfo = Factory.instance().createAuthInfo(username, null, password, null, null, domain, null)
// Account object replaces deprecated ProxyConfig object
// Account object is configured through an AccountParams object that we can obtain from the Core
val accountParams = core.createAccountParams()
// A SIP account is identified by an identity address that we can construct from the username and domain
val identity = Factory.instance().createAddress("sip:$username@$domain")
accountParams.identityAddress = identity
// We also need to configure where the proxy server is located
val address = Factory.instance().createAddress("sip:$domain")
// We use the Address object to easily set the transport protocol
address?.transport = transportType
accountParams.serverAddress = address
// And we ensure the account will start the registration process
accountParams.registerEnabled = true
// Now that our AccountParams is configured, we can create the Account object
val account = core.createAccount(accountParams)
// Now let's add our objects to the Core
core.addAuthInfo(authInfo)
core.addAccount(account)
// Also set the newly added account as default
core.defaultAccount = account
// Allow account to be removed
findViewById<Button>(R.id.delete).isEnabled = true
// To be notified of the connection status of our account, we need to add the listener to the Core
core.addListener(coreListener)
// We can also register a callback on the Account object
account.addListener { _, state, message ->
// There is a Log helper in org.linphone.core.tools package
Log.i("[Account] Registration state changed: $state, $message")
}
// Finally we need the Core to be started for the registration to happen (it could have been started before)
core.start()
}
private fun unregister() {
// Here we will disable the registration of our Account
val account = core.defaultAccount
account ?: return
val params = account.params
// Returned params object is const, so to make changes we first need to clone it
val clonedParams = params.clone()
// Now let's make our changes
clonedParams.registerEnabled = false
// And apply them
account.params = clonedParams
}
private fun delete() {
// To completely remove an Account
val account = core.defaultAccount
account ?: return
core.removeAccount(account)
// To remove all accounts use
core.clearAccounts()
// Same for auth info
core.clearAllAuthInfo()
}
}

View File

@@ -1,30 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -1,88 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/register_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/core_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/username"
android:hint="Username"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password"
android:hint="Password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/domain"
android:hint="Domain"
android:text="sip.linphone.org"
android:inputType="textUri"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioGroup
android:id="@+id/transport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/udp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UDP" />
<RadioButton
android:id="@+id/tcp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TCP" />
<RadioButton
android:id="@+id/tls"
android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TLS" />
</RadioGroup>
<Button
android:id="@+id/connect"
android:text="Connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/disconnect"
android:text="Disconnect"
android:enabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/delete"
android:text="Delete"
android:enabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/registration_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,16 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AccountLogin" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@@ -1,3 +0,0 @@
<resources>
<string name="app_name">Account Login</string>
</resources>

View File

@@ -1,16 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AccountLogin" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -1,26 +0,0 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.21"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -1,21 +0,0 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official

View File

@@ -1,6 +0,0 @@
#Mon Jan 18 10:29:47 CET 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

View File

@@ -1,172 +0,0 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

View File

@@ -1,84 +0,0 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -1,2 +0,0 @@
include ':app'
rootProject.name = "Account Login"

View File

@@ -1,15 +0,0 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State />
<State>
<id>Android</id>
</State>
<State>
<id>CorrectnessLintAndroid</id>
</State>
<State>
<id>Gradle</id>
</State>
<State>
<id>LintAndroid</id>
</State>
<State>
<id>Probable bugsGradle</id>
</State>
</expanded-state>
</profile-state>
</entry>
</component>
</project>

View File

@@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@@ -1 +0,0 @@
Push notifications

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
</component>
</project>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="JDK" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

@@ -1,8 +0,0 @@
Push notifications tutorial
====================
On mobile devices (Android & iOS), you probably want your app to be reachable even if it's not in the foreground.
To do that you need it to be able to receive push notifications from your SIP proxy, and in this tutorial, using [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging), you'll learn how to simply send the device push information to your server.
Compared to the previous tutorials, some changes are required in `app/build.gradle` and `AndroidManifest.xml` files, and you'll need to replace the `app/google-services.json` file by yours if you're not using a `sip.linphone.org` account.

View File

@@ -1 +0,0 @@
/build

View File

@@ -1,55 +0,0 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "org.linphone.pushnotifications"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
// We need to declare this repository to be able to use Liblinphone SDK
repositories {
maven {
url "https://linphone.org/maven_repository"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
// Latest version is 5.0.x, using + to get the latest available
implementation 'org.linphone:linphone-sdk-android:5.0+'
// Required for firebase push notifications
implementation 'com.google.firebase:firebase-messaging:19.0.1'
}
// Required for firebase push notifications
apply plugin: 'com.google.gms.google-services'

View File

@@ -1,40 +0,0 @@
{
"project_info": {
"project_number": "929724111839",
"firebase_url": "https://linphone-android-8a563.firebaseio.com",
"project_id": "linphone-android-8a563",
"storage_bucket": "linphone-android-8a563.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:929724111839:android:cfa1ce5fe611ab2818c26a",
"android_client_info": {
"package_name": "org.linphone.pushnotifications"
}
},
"oauth_client": [
{
"client_id": "929724111839-v5so1tcd65iil7dd7sde8jgii44h8luf.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCKrwWhkbA7Iy3wpEI8_ZvKOMp5jf6vV6A"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "929724111839-a6g55p0jkq0qfi8utt0v4eh3l405g6nj.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

View File

@@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.linphone.pushnotifications">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PushNotifications">
<activity
android:name=".PushNotificationsActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- The following is mandatory to have our SDK to handle push automatically -->
<service android:name="org.linphone.core.tools.firebase.FirebaseMessaging"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- This is to handle the PUSH_RECEIVED broadcast emitted by our SDK upon push reception -->
<receiver android:name=".PushBroadcastReceiver">
<intent-filter>
<action android:name="org.linphone.core.action.PUSH_RECEIVED"/>
</intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -1,33 +0,0 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.pushnotifications
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.widget.Toast
class PushBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "Push received with app shut down", Toast.LENGTH_LONG).show()
// A push have been received but there was no Core alive, you should create it again
// This way the core will register and it will handle the message or call event like if the app was started
}
}

View File

@@ -1,115 +0,0 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.pushnotifications
import android.os.Bundle
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import org.linphone.core.*
class PushNotificationsActivity: AppCompatActivity() {
private lateinit var core: Core
private val coreListener = object: CoreListenerStub() {
override fun onAccountRegistrationStateChanged(core: Core, account: Account, state: RegistrationState?, message: String) {
findViewById<TextView>(R.id.registration_status).text = message
if (state == RegistrationState.Failed) {
findViewById<Button>(R.id.connect).isEnabled = true
} else if (state == RegistrationState.Ok) {
findViewById<LinearLayout>(R.id.register_layout).visibility =
View.GONE
// This will display the push information stored in the contact URI parameters
findViewById<TextView>(R.id.push_info).text = account.params.contactUriParameters
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.push_notifications_activity)
// For push notifications to work, you have to copy your google-services.json in the app/ folder
// And you must declare our FirebaseMessaging service in the Manifest
// You also have to make some changes in your build.gradle files, see the ones in this project
val factory = Factory.instance()
factory.setDebugMode(true, "Hello Linphone")
core = factory.createCore(null, null, this)
// Make sure the core is configured to use push notification token from firebase
core.isPushNotificationEnabled = true
findViewById<Button>(R.id.connect).setOnClickListener {
login()
it.isEnabled = false
}
}
private fun login() {
val username = findViewById<EditText>(R.id.username).text.toString()
val password = findViewById<EditText>(R.id.password).text.toString()
val domain = findViewById<EditText>(R.id.domain).text.toString()
val transportType = when (findViewById<RadioGroup>(R.id.transport).checkedRadioButtonId) {
R.id.udp -> TransportType.Udp
R.id.tcp -> TransportType.Tcp
else -> TransportType.Tls
}
val authInfo = Factory.instance().createAuthInfo(username, null, password, null, null, domain, null)
val params = core.createAccountParams()
val identity = Factory.instance().createAddress("sip:$username@$domain")
params.identityAddress = identity
val address = Factory.instance().createAddress("sip:$domain")
address?.transport = transportType
params.serverAddress = address
params.registerEnabled = true
// Ensure push notification is enabled for this account
params.pushNotificationAllowed = true
core.addAuthInfo(authInfo)
val account = core.createAccount(params)
core.addAccount(account)
core.defaultAccount = account
core.addListener(coreListener)
core.start()
if (!core.isPushNotificationAvailable) {
Toast.makeText(this, "Something is wrong with the push setup!", Toast.LENGTH_LONG).show()
}
// And that's it!
// You can kill this app and send a message or initiate a call to the identity you registered and you'll see the toast.
// When a push notification will be received by your app, either:
// - the Core is alive and it will check it is properly registered & connected to the proxy
// - the Core isn't available and a broadcast on org.linphone.core.action.PUSH_RECEIVED will be fired
// Another way is to create your own Application object and create the Core in it
// This way, when a push will be received, the Core will be created before the push being handled
// so the first case above will always be true. See our linphone-android app for an example of that.
}
}

View File

@@ -1,30 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/registration_status"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/register_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/registration_status"
android:gravity="center"
android:orientation="vertical">
<EditText
android:id="@+id/username"
android:hint="Username"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password"
android:hint="Password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/domain"
android:hint="Domain"
android:text="sip.linphone.org"
android:inputType="textUri"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioGroup
android:id="@+id/transport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/udp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UDP" />
<RadioButton
android:id="@+id/tcp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TCP" />
<RadioButton
android:id="@+id/tls"
android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TLS" />
</RadioGroup>
<Button
android:id="@+id/connect"
android:text="Connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView
android:id="@+id/push_info"
android:layout_below="@id/registration_status"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More