Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: flutter-webrtc/callkeep
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.2.0
Choose a base ref
...
head repository: flutter-webrtc/callkeep
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref

Commits on Dec 1, 2020

  1. Copy the full SHA
    b308413 View commit details

Commits on Dec 22, 2020

  1. fix: change parameter handle to number (#39)

    * fix: change parameter handle to number , call.argument("number") was undefined in HandleMethodCall for startCall case
    
    * fix(ios): change handle to number
    Pierre-Monier authored Dec 22, 2020
    Copy the full SHA
    59306ca View commit details

Commits on Dec 23, 2020

  1. Upgrade version to 0.2.1.

    cloudwebrtc committed Dec 23, 2020
    Copy the full SHA
    ddef4ba View commit details

Commits on Dec 24, 2020

  1. Copy the full SHA
    b3dd0b2 View commit details

Commits on Dec 26, 2020

  1. Copy the full SHA
    cfb8f3f View commit details
  2. update.

    cloudwebrtc committed Dec 26, 2020
    Copy the full SHA
    0933f2b View commit details

Commits on Jan 7, 2021

  1. Copy the full SHA
    b09080e View commit details
  2. Copy the full SHA
    0046d4e View commit details
  3. hotfix.

    cloudwebrtc committed Jan 7, 2021
    Copy the full SHA
    0090d26 View commit details

Commits on Jan 10, 2021

  1. chore(deps): update dependency gradle to v6 (#32)

    Co-authored-by: Renovate Bot <bot@renovateapp.com>
    renovate[bot] and renovate-bot authored Jan 10, 2021
    Copy the full SHA
    27690ce View commit details
  2. Copy the full SHA
    6de659d View commit details

Commits on Jan 25, 2021

  1. chore(deps): update dependency gradle to v6.8.1 (#48)

    Co-authored-by: Renovate Bot <bot@renovateapp.com>
    renovate[bot] and renovate-bot authored Jan 25, 2021
    Copy the full SHA
    4aede74 View commit details

Commits on Jan 29, 2021

  1. hasDefaultPhoneAccount give feedback about the user choice (#49)

    * fix: change parameter handle to number , call.argument("number") was undefined in HandleMethodCall for startCall case
    
    * fix(ios): change handle to number
    
    * feat: make hasDefaultPhoneAccount return a bool to have feedback on the telecom manager request
    Pierre-Monier authored Jan 29, 2021
    Copy the full SHA
    7f23ec4 View commit details

Commits on May 5, 2021

  1. Update README.md

    cloudwebrtc authored May 5, 2021
    Copy the full SHA
    bf318ed View commit details
  2. Update README.md

    cloudwebrtc authored May 5, 2021
    Copy the full SHA
    a542fa1 View commit details

Commits on May 21, 2021

  1. Copy the full SHA
    cc57761 View commit details

Commits on May 22, 2021

  1. Upgrade version to 0.2.4.

    cloudwebrtc committed May 22, 2021
    Copy the full SHA
    f3e799a View commit details

Commits on Jun 11, 2021

  1. null safety.

    cloudwebrtc committed Jun 11, 2021
    Copy the full SHA
    1052eda View commit details
  2. Copy the full SHA
    50652c4 View commit details
  3. Copy the full SHA
    f49367b View commit details
  4. Update iOS project.

    cloudwebrtc committed Jun 11, 2021
    Copy the full SHA
    9b4d23e View commit details

Commits on Jun 12, 2021

  1. Copy the full SHA
    419ff9a View commit details
  2. Update README.md

    cloudwebrtc authored Jun 12, 2021
    Copy the full SHA
    ea939ae View commit details
  3. Update README.md

    cloudwebrtc authored Jun 12, 2021
    Copy the full SHA
    248b9ab View commit details
  4. Upgrade version to 0.3.0

    cloudwebrtc committed Jun 12, 2021
    Copy the full SHA
    726db97 View commit details
  5. Update README.md

    cloudwebrtc authored Jun 12, 2021
    Copy the full SHA
    e736cae View commit details

Commits on Jun 16, 2021

  1. Fix that the call list cannot be displayed when the push is received …

    …when andorid is running.
    cloudwebrtc committed Jun 16, 2021
    Copy the full SHA
    276f73f View commit details

Commits on Jul 11, 2021

  1. feature: added some doc (#86)

    * feature: added some doc [WIP]
    
    * feature: added more doc
    
    * feature: added more doc
    
    * feature: added more doc on README.md
    
    * feature: added more doc on README.md
    
    * feature: doc added
    
    * feature: doc added
    
    * feature: doc added
    
    * feature: doc added
    efraespada authored Jul 11, 2021
    Copy the full SHA
    395aaa3 View commit details

Commits on Jul 27, 2021

  1. Copy the full SHA
    fbcb3aa View commit details
  2. bump version to 0.3.1.

    cloudwebrtc committed Jul 27, 2021
    Copy the full SHA
    948b070 View commit details

Commits on Aug 4, 2021

  1. fix cannot receive answer call on Android 11 (#98)

    fix cannot receive answer call on Android 11
    quango2304 authored Aug 4, 2021
    Copy the full SHA
    5bb6385 View commit details

Commits on Sep 8, 2021

  1. [FIX] Duplicated call onAnswer. New open method. (#111)

    * feature: open method openPhoneAccounts
    
    * feature: fixed duplicated call onAnswer on VoiceConnection
    
    * feature: added support for drawables in notification icon in foreground service
    efraespada authored Sep 8, 2021
    Copy the full SHA
    dd1c872 View commit details

Commits on Sep 27, 2021

  1. Copy the full SHA
    5abd43e View commit details
  2. Upgrade version to 0.3.2.

    cloudwebrtc committed Sep 27, 2021
    Copy the full SHA
    df37b17 View commit details

Commits on Sep 28, 2021

  1. Update README.md

    cloudwebrtc authored Sep 28, 2021
    Copy the full SHA
    c8425f7 View commit details

Commits on Nov 27, 2021

  1. Copy the full SHA
    f382f55 View commit details
  2. Copy the full SHA
    097e59d View commit details

Commits on Feb 15, 2022

  1. Copy the full SHA
    376c935 View commit details

Commits on Apr 9, 2022

  1. Copy the full SHA
    7169d9c View commit details

Commits on Oct 18, 2022

  1. feature: include isCallActive in Android, added activeCalls method fo…

    …r getting available calls (Android/iOS) (#135)
    efraespada authored Oct 18, 2022
    Copy the full SHA
    2461875 View commit details

Commits on Jan 24, 2023

  1. Copy the full SHA
    ace08d0 View commit details
  2. release: 0.3.3.

    cloudwebrtc committed Jan 24, 2023
    Copy the full SHA
    d1c483e View commit details

Commits on Apr 2, 2023

  1. Fix example (#166)

    * example: Sort imports.
    
    * example: Remove space.
    
    * example: Use ElevatedButton instead of RaisedButton.
    
    * example: Lint.
    ryojiro authored Apr 2, 2023
    Copy the full SHA
    67b2e21 View commit details
  2. Fix some error (#167)

    * pubspec: Use double quotation instead of single.
    
    * api: Sort import.
    
    * api, event: Remove unused asset which never has null.
    ryojiro authored Apr 2, 2023
    Copy the full SHA
    f66bba5 View commit details
  3. Update example (#168)

    * example: pubspec: Sort.
    
    * example: pubspec: Remove unused cupertino_icons.
    
    * example: pubspec: Upgrade uuid 3.0.7.
    
    * example: pubspec: Add flutter_lints 2.0.1.
    
    * example: amalysis_options: Set linter without avoid_print which is used too many times.
    
    * example: main: Fix non_constant_identifier_names.
    
    * example: main: Fix prefer_interpolation_to_compose_strings.
    
    * example: main: Rename _MyAppState to MyAppState. Fix library_private_types_in_public_api.
    
    * example: main: Fix use_key_in_widget_constructors.
    
    * example: main: Fix prefer_const_constructors.
    
    * example: main: Fix use_build_context_synchronously.
    ryojiro authored Apr 2, 2023
    Copy the full SHA
    bc36106 View commit details

Commits on Sep 5, 2023

  1. Improve Android broadcasts and iOS delegate (#159)

    * add missing call data
    
    * add self managed call permission
    
    * working android self managed
    
    * init integration with ios
    
    * working android call
    
    * export android and fix iOS call
    
    * restore signing team to cloudwebrtc
    
    * differ between iOS and android connected
    
    * simplify mute boolean comparison
    
    * send notification on disconnect report
    
    * add custom schema option
    
    * start calls from log
    
    * encapsulate account handle
    
    * fix appdelegate callback signature
    
    * add answer call to iOS
    
    * fix null audio state access
    
    * add optional notify on end call report android
    
    * add settings caching
    
    * change displayincoming to static
    mouEsam authored Sep 5, 2023
    Copy the full SHA
    50e75ba View commit details

Commits on May 19, 2024

  1. Updated to the latest flutter and firebase messaging (#185)

    Co-authored-by: Mikael Wills <mikael.wills@ideaworks.co.uk>
    mikaelwills and Mikael Wills authored May 19, 2024
    Copy the full SHA
    7d8a0a6 View commit details

Commits on Aug 24, 2024

  1. Copy the full SHA
    c5ee757 View commit details
  2. Extracting UI responsibility, named parameters, android dismissal fix (

    …#189)
    
    Co-authored-by: Mikael Wills <mikael.wills@ideaworks.co.uk>
    mikaelwills and Mikael Wills authored Aug 24, 2024
    Copy the full SHA
    0377bfd View commit details
  3. release: 0.4.0.

    cloudwebrtc committed Aug 24, 2024
    Copy the full SHA
    062ceb8 View commit details
Showing with 2,949 additions and 1,021 deletions.
  1. +5 −0 .gitignore
  2. +46 −0 CHANGELOG.md
  3. +262 −2 README.md
  4. +1 −1 android/build.gradle
  5. +0 −5 android/gradle/wrapper/gradle-wrapper.properties
  6. +1 −1 android/src/main/java/com/github/cloudwebrtc/flutter_callkeep/FlutterCallkeepPlugin.java
  7. +3 −1 android/src/main/java/io/wazo/callkeep/CallKeepBackgroundMessagingService.java
  8. +17 −2 android/src/main/java/io/wazo/callkeep/{Constants.java → CallKeepConstants.java}
  9. +453 −274 android/src/main/java/io/wazo/callkeep/CallKeepModule.java
  10. +159 −78 android/src/main/java/io/wazo/callkeep/VoiceConnection.java
  11. +310 −123 android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java
  12. +2 −2 android/src/main/java/io/wazo/callkeep/utils/Callback.java
  13. +6 −4 android/src/main/java/io/wazo/callkeep/utils/ConstraintsArray.java
  14. +4 −2 android/src/main/java/io/wazo/callkeep/utils/ConstraintsMap.java
  15. +60 −0 android/src/main/java/io/wazo/callkeep/utils/MapUtils.java
  16. +2 −1 android/src/main/java/io/wazo/callkeep/utils/ObjectType.java
  17. +5 −0 example/analysis_options.yaml
  18. +2 −2 example/android/app/build.gradle
  19. +1 −0 example/android/app/src/main/AndroidManifest.xml
  20. +1 −1 example/android/gradle/wrapper/gradle-wrapper.properties
  21. +1 −0 example/android/settings_aar.gradle
  22. +1 −1 example/ios/Podfile
  23. +4 −19 example/ios/Runner.xcodeproj/project.pbxproj
  24. +1 −1 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  25. +2 −1 example/ios/Runner/AppDelegate.h
  26. +8 −4 example/ios/Runner/AppDelegate.m
  27. +1 −0 example/ios/Runner/Info.plist
  28. +251 −138 example/lib/main.dart
  29. +8 −11 example/pubspec.yaml
  30. +4 −5 example/test/widget_test.dart
  31. BIN images/sample.png
  32. +24 −3 ios/Classes/CallKeep.h
  33. +246 −138 ios/Classes/CallKeep.m
  34. +14 −0 ios/Classes/CallKeepPushDelegate.h
  35. +3 −1 ios/Classes/FlutterCallkeepPlugin.m
  36. +1 −0 lib/callkeep.dart
  37. +60 −44 lib/src/actions.dart
  38. +216 −129 lib/src/api.dart
  39. +34 −0 lib/src/call.dart
  40. +17 −22 lib/src/event.dart
  41. +6 −5 pubspec.yaml
  42. +23 −0 tools/README.md
  43. +63 −0 tools/cmd/main.go
  44. +13 −0 tools/go.mod
  45. +537 −0 tools/go.sum
  46. +36 −0 tools/pkg/fcm/fcm.go
  47. +35 −0 tools/pkg/pushkit/pushkit.go
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -19,3 +19,8 @@ doc/api/
*.js_
*.js.deps
*.js.map
.DS_Store
.idea
.vscode
android/gradle*
example/ios/Podfile.lock
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,52 @@
# Changelog

-----------------------------------------------
[0.4.0] - 2023.08.24

* [fix] Extracting UI responsibility, named parameters, android dismissal fix (#189).
* [fix] make the Object nullable (#182)
* [chore] Updated to the latest flutter and firebase messaging (#185)
* [feat] Improve Android broadcasts and iOS delegate (#159)

[0.3.3] - 2023.01.25

* [fix] Remove as `type` to allow null assignment.

[0.3.2] - 2021.09.27

* [feat] Add backgroundMode for setup.
* [fix] Duplicated call onAnswer. New open method. (#111)
* [fix] Cannot receive answer call on Android 11 (#98)

[0.3.1] - 2021.07.27

* Add foregroundService for Android 11.

[0.3.0] - 2021.06.12

* null safety
* Add toolkit for testing.
* Fixed receiving Voip push in background mode for iOS 13+.
* Fix crash when iOS push uses the wrong push format (alert).

[0.2.4] - 2021.01.08

* Fix crash when appName is not set.
* hasDefaultPhoneAccount give feedback about the user choice.

[0.2.3] - 2021.01.08

* Fix backToForeground method.

[0.2.2] - 2020.12.27

* Update json format for push payload.

[0.2.1] - 2020.12.23

* Fix: Missing null check.
* Fix: change parameter handle to number.

[0.2.0] - 2020.11.11

* Change FlutterCallKeep as a singleton.
264 changes: 262 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,263 @@
# callkeep
* iOS CallKit and Android ConnectionService for Flutter
* Support FCM and PushKit

[![Financial Contributors on Open Collective](https://opencollective.com/flutter-webrtc/all/badge.svg?label=financial+contributors)](https://opencollective.com/flutter-webrtc) [![pub package](https://img.shields.io/pub/v/callkeep.svg)](https://pub.dartlang.org/packages/callkeep) [![slack](https://img.shields.io/badge/join-us%20on%20slack-gray.svg?longCache=true&logo=slack&colorB=brightgreen)](https://join.slack.com/t/flutterwebrtc/shared_invite/zt-q83o7y1s-FExGLWEvtkPKM8ku_F8cEQ)

- iOS CallKit and Android ConnectionService for Flutter
- Support FCM and PushKit

> Keep in mind Callkit is banned in China, so if you want your app in the chinese AppStore consider include a basic alternative for notifying calls (ex. FCM notifications with sound).
`* P-C-M means -> presenter / controller / manager`

## Introduction

Callkeep acts as an intermediate between your call system (RTC, VOIP...) and the user, offering a native calling interface for handling your app calls.

This allows you (for example) to answer calls when your device is locked even if your app is terminated.

## Initial setup

Basic configuration. In Android a popup is displayed before starting requesting some permissions to work properly.

```dart
final callSetup = <String, dynamic>{
'ios': {
'appName': 'CallKeepDemo',
},
'android': {
'alertTitle': 'Permissions required',
'alertDescription':
'This application needs to access your phone accounts',
'cancelButton': 'Cancel',
'okButton': 'ok',
// Required to get audio in background when using Android 11
'foregroundService': {
'channelId': 'com.company.my',
'channelName': 'Foreground service for my app',
'notificationTitle': 'My app is running on background',
'notificationIcon': 'mipmap/ic_notification_launcher',
},
},
};
callKeep.setup(callSetup);
```

This configuration should be defined when your application wakes up, but keep in mind this alert will appear if you aren't granting the needed permissions yet.

A clean alternative is to control by yourself the required permissions when your application wakes up, and only invoke the `setup()` method if those permissions are granted.

## Events

Callkeep offers some events to handle native actions during a call.

These events are quite crucial because they act as an intermediate between the native calling UI and your call P-C-M.

What does it mean?

Assuming your application already implements some calling system (RTC, Voip, or whatever) with its own calling UI, you are using some basic controls:

<img width="40%" vspace="10" src="https://raw.githubusercontent.com/efraespada/callkeep/master/images/sample.png"></p>

> before implementing `callkeep`
- Hang up -> `presenter.hangUp()`
- Microphone switcher -> `presenter.microSwitch()`

> after implementing `callkeep`
- Hang up -> `callkeep.endCall(call_uuid)`
- Microphone switcher -> `callKeep.setMutedCall(uuid, true / false)`

Then you handle the action:

```dart
Future<void> answerCall(CallKeepPerformAnswerCallAction event) async {
print('CallKeepPerformAnswerCallAction ${event.callUUID}');
// notify to your call P-C-M the answer action
};
Future<void> endCall(CallKeepPerformEndCallAction event) async {
print('CallKeepPerformEndCallAction ${event.callUUID}');
// notify to your call P-C-M the end action
};
Future<void> didPerformSetMutedCallAction(CallKeepDidPerformSetMutedCallAction event) async {
print('CallKeepDidPerformSetMutedCallAction ${event.callUUID}');
// notify to your call P-C-M the muted switch action
};
Future<void> didToggleHoldCallAction(CallKeepDidToggleHoldAction event) async {
print('CallKeepDidToggleHoldAction ${event.callUUID}');
// notify to your call P-C-M the hold switch action
};
```

```dart
@override
void initState() {
super.initState();
callKeep.on<CallKeepDidDisplayIncomingCall>(didDisplayIncomingCall);
callKeep.on<CallKeepPerformAnswerCallAction>(answerCall);
callKeep.on<CallKeepPerformEndCallAction>(endCall);
callKeep.on<CallKeepDidToggleHoldAction>(didToggleHoldCallAction);
}
```

## Display incoming calls in foreground, background or terminate state

The incoming call concept we are looking for is firing an incoming call action when "something" is received in our app.

I've tested this concept with FCM and it works pretty fine.

```dart
final FlutterCallkeep _callKeep = FlutterCallkeep();
bool _callKeepStarted = false;
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
if (!_callKeepStarted) {
try {
await _callKeep.setup(callSetup);
_callKeepStarted = true;
} catch (e) {
print(e);
}
}
// then process your remote message looking for some call uuid
// and display any incoming call
}
```

Displaying incoming calls is really simple if you are receiving FCM messages (or whatever). This example shows how to show and close any incoming call:

> Notice that getting data from the payload can be done as you want, this is an example.
A payload data example:

```json
{
"uuid": "xxxxx-xxxxx-xxxxx-xxxxx",
"caller_id": "+0123456789",
"caller_name": "Draco",
"caller_id_type": "number",
"has_video": "false"
}
```

A `RemoteMessage` extension for getting data:

```dart
import 'dart:convert';
import 'package:firebase_messaging/firebase_messaging.dart';
extension RemoteMessageExt on RemoteMessage {
Map<String, dynamic> getContent() {
return jsonDecode(this.data["content"]);
}
Map<String, dynamic> payload() {
return getContent()["payload"];
}
}
```

Methods to show and close incoming calls:

```dart
Future<void> showIncomingCall(
BuildContext context,
RemoteMessage remoteMessage,
FlutterCallkeep callKeep,
) async {
var callerIdFrom = remoteMessage.payload()["caller_id"] as String;
var callerName = remoteMessage.payload()["caller_name"] as String;
var uuid = remoteMessage.payload()["uuid"] as String;
var hasVideo = remoteMessage.payload()["has_video"] == "true";
callKeep.on<CallKeepDidToggleHoldAction>(onHold);
callKeep.on<CallKeepPerformAnswerCallAction>(answerAction);
callKeep.on<CallKeepPerformEndCallAction>(endAction);
callKeep.on<CallKeepDidPerformSetMutedCallAction>(setMuted);
print('backgroundMessage: displayIncomingCall ($uuid)');
bool hasPhoneAccount = await callKeep.hasPhoneAccount();
if (!hasPhoneAccount) {
hasPhoneAccount = await callKeep.hasDefaultPhoneAccount(context, callSetup["android"]);
}
if (!hasPhoneAccount) {
return;
}
await callKeep.displayIncomingCall(uuid, callerIdFrom, localizedCallerName: callerName, hasVideo: hasVideo);
callKeep.backToForeground();
}
Future<void> closeIncomingCall(
RemoteMessage remoteMessage,
FlutterCallkeep callKeep,
) async {
var uuid = remoteMessage.payload()[MessageManager.CALLER_UUID] as String;
print('backgroundMessage: closeIncomingCall ($uuid)');
bool hasPhoneAccount = await callKeep.hasPhoneAccount();
if (!hasPhoneAccount) {
return;
}
await callKeep.endAllCalls();
}
```

Pass in your own dialog UI for permissions alerts

````dart
showAlertDialog: () async {
final BuildContext context = navigatorKey.currentContext!;
return await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Permissions Required'),
content: const Text(
'This application needs to access your phone accounts'),
actions: <Widget>[
TextButton(
child: const Text('Cancel'),
onPressed: () => Navigator.of(context).pop(false),
),
TextButton(
child: const Text('OK'),
onPressed: () => Navigator.of(context).pop(true),
),
],
);
},
) ??
false;
},
```
### FAQ
> I don't receive the incoming call
Receiving incoming calls depends on FCM push messages (or the system you use) for handling the call information and displaying it.
Remember FCM push messages not always works due to data-only messages are classified as "low priority". Devices can throttle and ignore these messages if your application is in the background, terminated, or a variety of other conditions such as low battery or currently high CPU usage. To help improve delivery, you can bump the priority of messages. Note; this does still not guarantee delivery. More info [here](https://firebase.flutter.dev/docs/messaging/usage/#low-priority-messages)
> How can I manage the call if the app is terminated and the device is locked?
Even in this scenario, the `backToForeground()` method will open the app and your call P-C-M will be able to work.
## push test tool
Please refer to the [Push Toolkit](/tools/) to test callkeep offline push.
````
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ rootProject.allprojects {
apply plugin: 'com.android.library'

android {
compileSdkVersion 28
compileSdkVersion 31

defaultConfig {
minSdkVersion 23
5 changes: 0 additions & 5 deletions android/gradle/wrapper/gradle-wrapper.properties

This file was deleted.

Original file line number Diff line number Diff line change
@@ -66,7 +66,7 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBindin

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (!callKeep.HandleMethodCall(call, result)) {
if (!callKeep.handleMethodCall(call, result)) {
result.notImplemented();
}
}
Original file line number Diff line number Diff line change
@@ -48,7 +48,9 @@ public static void acquireWakeLockNow(Context context) {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "wakeUpApplication: " + intent.getStringExtra("callUUID") + ", number : " + intent.getStringExtra("handle") + ", displayName:" + intent.getStringExtra("name"));
Log.d(TAG, "wakeUpApplication: " + intent.getStringExtra(CallKeepConstants.EXTRA_CALL_UUID) +
", number : " + intent.getStringExtra(CallKeepConstants.EXTRA_CALL_NUMBER) +
", displayName:" + intent.getStringExtra(CallKeepConstants.EXTRA_CALLER_NAME));
//TODO: not implemented
return null;
}
Loading