From b95baa67996b276597ffde63b9601194cfa52b9b Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Mon, 30 Mar 2026 09:08:39 +0700 Subject: [PATCH] docs: add MIT license and expand README with full documentation --- LICENSE | 22 ++++- README.md | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 253 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index ba75c69..41e04e1 100644 --- a/LICENSE +++ b/LICENSE @@ -1 +1,21 @@ -TODO: Add your license here. +MIT License + +Copyright (c) 2025-2026 Andrew 'nuark' G. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 6ea60f0..dd33b52 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,237 @@ # liblinphone_flutter -libLinPhone integration library for Flutter apps +A Flutter plugin that provides integration with the Linphone library for VoIP calls (audio and video) on Android and iOS platforms. -## Getting Started +## Third-Party Licenses -Better docs will be available some day +This project depends on the Linphone SDK, developed by Belledonne Communications, which is dual-licensed under the GNU Affero General Public License v3 (AGPLv3) and a proprietary commercial license. +This wrapper library itself is licensed under the MIT License. However, it is designed to work with the Linphone SDK, and therefore **does not remove or replace the licensing requirements of Linphone**. + +### Important + +Any application using this plugin and linking against the Linphone SDK is subject to the terms of the AGPLv3, unless a commercial license for Linphone is obtained. + +In practice, this means that applications using this plugin must comply with AGPLv3 requirements, which may include releasing the application's source code under a compatible license. + +For proprietary or closed-source applications, you must obtain a commercial license for the Linphone SDK from Belledonne Communications. + +## Description + +This plugin wraps the native Linphone SDK (liblinphone) and exposes a Dart API for making SIP-based voice and video calls in Flutter applications. + +## Features + +- SIP account registration +- Audio and video calls +- Video streaming with local preview and remote view +- Call management (answer, hangup, toggle video/microphone) +- Registration and call state event streams + +## Platform Support + +| Platform | Status | +| -------- | --------- | +| Android | Supported | +| iOS | Supported | + +## Requirements + +- Flutter SDK >= 3.3.0 +- Dart SDK >= 3.9.0-333.2.beta +- Linphone SDK (native dependency) + +## Installation + +Add this to your `pubspec.yaml`: + +```yaml +dependencies: + liblinphone_flutter: ^0.0.3 +``` + +Or if you want to go with git: + +```yaml +dependencies: + liblinphone_flutter: + git: + url: https://git.nuark.xyz/nuark/liblinphone_flutter.git + ref: commit-hash +``` + +Then run: + +```bash +flutter pub get +``` + +### Platform-Specific Setup + +#### Android + +Ensure you have the necessary permissions in your `AndroidManifest.xml`: + +```xml + + + + +``` + +#### iOS + +The plugin requires access to the camera and microphone. Add the following to your `Info.plist`: + +```xml +NSCameraUsageDescription +Camera access is required for video calls +NSMicrophoneUsageDescription +Microphone access is required for audio and video calls +``` + +## Usage + +### Basic Example + +```dart +import 'package:liblinphone_flutter/liblinphone_flutter.dart'; + +final liblinphone = LiblinphoneFlutter(); + +// Initialize +await liblinphone.checkPermissions(); +await liblinphone.initialize(); + +// Register to SIP server +await liblinphone.register( + 'username', + 'password', + 'sip.server.com', + 5060, +); + +// Listen to registration events +liblinphone.registrationEvents.listen((state) { + print('Registration state: $state'); +}); + +// Listen to call events +liblinphone.callEvents.listen((state) { + print('Call state: $state'); +}); + +// Make a video call +await liblinphone.makeCall('sip:recipient@sip.server.com', true); + +// Answer incoming call +await liblinphone.answerCall(); + +// Toggle video during call +await liblinphone.toggleVideo(); + +// Toggle microphone +await liblinphone.toggleMicrophone(); + +// Hangup +await liblinphone.hangupCall(); + +// Unregister and cleanup +await liblinphone.unregister(); +await liblinphone.stop(); +``` + +### Video Views + +For video calls, use the provided widgets to display local and remote video streams: + +```dart +import 'package:liblinphone_flutter/widgets/local_view.dart'; +import 'package:liblinphone_flutter/widgets/remote_view.dart'; + +// In your widget tree +Column( + children: [ + // Remote video (full screen or large area) + Expanded( + child: RemoteView(), + ), + // Local video preview (picture-in-picture) + SizedBox( + height: 150, + width: 100, + child: LocalView(), + ), + ], +) +``` + +## API Reference + +### Main Class: `LiblinphoneFlutter` + +#### Methods + +| Method | Description | +| ----------------------------------------------------------------- | -------------------------------------------------- | +| `Future checkPermissions()` | Checks and requests camera/microphone permissions | +| `Future initialize()` | Initializes the Linphone core | +| `Future register(username, password, serverIp, serverPort)` | Registers to a SIP server | +| `Future unregister()` | Unregisters from the SIP server | +| `Future makeCall(callTo, isVideoEnabled)` | Makes an outgoing call | +| `Future answerCall()` | Answers an incoming call | +| `Future hangupCall()` | Hangs up the current call | +| `Future inCall()` | Returns true if there is an active call | +| `Future callType()` | Returns the type of the current call (audio/video) | +| `Future toggleVideo()` | Toggles video enabled state during a call | +| `Future toggleMicrophone()` | Toggles microphone muted state | +| `Future stop()` | Stops the Linphone core | +| `Future syncCurrentState()` | Forces synchronization of current state | + +#### Event Streams + +| Stream | Type | Description | +| -------------------- | --------------------------- | -------------------------------- | +| `registrationEvents` | `Stream` | Emits registration state changes | +| `callEvents` | `Stream` | Emits call state changes | + +### Enums + +#### `RegistrationState` + +- `None` - Not registered +- `Progress` - Registration in progress +- `Ok` - Successfully registered +- `Cleared` - Registration cleared +- `Failed` - Registration failed + +#### `CallState` + +- `Idle` - No active call +- `IncomingReceived` - Incoming call received +- `OutgoingInit` - Outgoing call initialized +- `OutgoingProgress` - Outgoing call in progress +- `OutgoingRinging` - Remote party ringing +- `Connected` - Call connected +- `StreamsRunning` - Media streams running +- `Pausing` - Call pausing +- `Paused` - Call paused +- `Resuming` - Call resuming +- `Error` - Call error +- `End` - Call ended +- And other states... + +#### `CallType` + +- `Audio` - Audio-only call +- `Video` - Video call +- `Unknown` - Call type unknown + +## License + +This project is licensed under the MIT License. + +## Links + +- [Homepage](https://git.nuark.xyz/nuark/liblinphone_flutter) +- [Linphone Project](https://www.linphone.org/)