Skip to content

Commit add201a

Browse files
draft
1 parent 64c59fa commit add201a

File tree

5 files changed

+220
-45
lines changed

5 files changed

+220
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.hoxfon.react.RNTwilioVoice;
2+
3+
import android.app.ActivityManager;
4+
import android.content.BroadcastReceiver;
5+
import android.content.Context;
6+
import android.content.Intent;
7+
import android.os.Bundle;
8+
import android.util.Log;
9+
10+
import com.facebook.react.HeadlessJsTaskService;
11+
12+
import java.util.List;
13+
//import java.util.Random;
14+
//
15+
//import androidx.localbroadcastmanager.content.LocalBroadcastManager;
16+
//
17+
//import com.facebook.react.ReactApplication;
18+
//import com.facebook.react.ReactInstanceManager;
19+
//import com.facebook.react.bridge.ReactApplicationContext;
20+
//import com.facebook.react.bridge.ReactContext;
21+
//import com.hoxfon.react.RNTwilioVoice.CallNotificationManager;
22+
//
23+
//import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_INCOMING_CALL;
24+
//import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_NOTIFICATION_ID;
25+
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG;
26+
27+
public class BackgroundCallReceiver extends BroadcastReceiver {
28+
29+
@Override
30+
public void onReceive(final Context context, final Intent intent) {
31+
Log.d(TAG, "### onReceive");
32+
/**
33+
This part will be called every time network connection is changed
34+
e.g. Connected -> Not Connected
35+
**/
36+
if (!isAppOnForeground((context))) {
37+
// ReactApplicationContext ctx = new ReactApplicationContext(context);
38+
//
39+
// Random randomNumberGenerator = new Random(System.currentTimeMillis());
40+
// final int notificationId = randomNumberGenerator.nextInt();
41+
// CallNotificationManager callNotificationManager = new CallNotificationManager();
42+
//
43+
// int appImportance = callNotificationManager.getApplicationImportance(ctx);
44+
// if (BuildConfig.DEBUG) {
45+
// Log.d(TAG, "CONTEXT not present appImportance = " + appImportance);
46+
// }
47+
// Intent launchIntent = callNotificationManager.getLaunchIntent(
48+
// ctx,
49+
// notificationId,
50+
// intent.getStringExtra("call_sid"),
51+
// intent.getStringExtra("call_from"),
52+
// intent.getStringExtra("call_to"),
53+
// true,
54+
// ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND
55+
// );
56+
// context.startActivity(launchIntent);
57+
//// Intent callInviteIntent = new Intent(ACTION_INCOMING_CALL);
58+
//// callInviteIntent.putExtra(INCOMING_CALL_NOTIFICATION_ID, notificationId);
59+
//// LocalBroadcastManager.getInstance(context).sendBroadcast(callInviteIntent);
60+
//// callNotificationManager.createIncomingCallNotification(
61+
//// ctx,
62+
//// intent.getStringExtra("call_sid"),
63+
//// intent.getStringExtra("call_from"),
64+
//// notificationId,
65+
//// launchIntent
66+
//// );
67+
68+
69+
70+
/**
71+
We will start our service and send extra info about
72+
network connections
73+
**/
74+
Bundle extras = intent.getExtras();
75+
Intent serviceIntent = new Intent(context, BackgroundCallTaskService.class);
76+
serviceIntent.putExtras(extras);
77+
context.startService(serviceIntent);
78+
HeadlessJsTaskService.acquireWakeLockNow(context);
79+
}
80+
}
81+
82+
private boolean isAppOnForeground(Context context) {
83+
/**
84+
We need to check if app is in foreground otherwise the app will crash.
85+
http://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not
86+
**/
87+
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
88+
List<ActivityManager.RunningAppProcessInfo> appProcesses =
89+
activityManager.getRunningAppProcesses();
90+
if (appProcesses == null) {
91+
return false;
92+
}
93+
final String packageName = context.getPackageName();
94+
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
95+
if (appProcess.importance ==
96+
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
97+
appProcess.processName.equals(packageName)) {
98+
return true;
99+
}
100+
}
101+
return false;
102+
}
103+
104+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.hoxfon.react.RNTwilioVoice;
2+
3+
import android.content.Intent;
4+
import android.os.Bundle;
5+
import android.util.Log;
6+
7+
import com.facebook.react.HeadlessJsTaskService;
8+
import com.facebook.react.bridge.Arguments;
9+
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
10+
11+
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG;
12+
13+
public class BackgroundCallTaskService extends HeadlessJsTaskService {
14+
@Override
15+
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
16+
Bundle extras = intent.getExtras();
17+
Log.d(TAG, "###getTaskConfig"+ extras.toString());
18+
if (extras != null) {
19+
return new HeadlessJsTaskConfig(
20+
"BackgroundCallTaskService",
21+
Arguments.fromBundle(extras),
22+
5000, // timeout for the task
23+
false // optional: defines whether or not the task is allowed in foreground. Default is false
24+
);
25+
}
26+
return null;
27+
}
28+
}

android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_HANGUP_CALL;
3434
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_INCOMING_CALL;
3535
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_MISSED_CALL;
36-
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_INVITE;
3736
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_NOTIFICATION_ID;
3837
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.NOTIFICATION_TYPE;
3938
import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.CALL_SID_KEY;
@@ -86,7 +85,9 @@ public Class getMainActivityClass(ReactApplicationContext context) {
8685

8786
public Intent getLaunchIntent(ReactApplicationContext context,
8887
int notificationId,
89-
CallInvite callInvite,
88+
String callInviteSid,
89+
String callInviteFrom,
90+
String callInviteTo,
9091
Boolean shouldStartNewTask,
9192
int appImportance
9293
) {
@@ -107,14 +108,15 @@ public Intent getLaunchIntent(ReactApplicationContext context,
107108
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
108109
);
109110

110-
if (callInvite != null) {
111-
launchIntent.putExtra(INCOMING_CALL_INVITE, callInvite);
112-
}
111+
launchIntent.putExtra("call_sid", callInviteSid);
112+
launchIntent.putExtra("call_from", callInviteFrom);
113+
launchIntent.putExtra("call_to", callInviteTo);
113114
return launchIntent;
114115
}
115116

116117
public void createIncomingCallNotification(ReactApplicationContext context,
117-
CallInvite callInvite,
118+
String callInviteSid,
119+
String callInviteFrom,
118120
int notificationId,
119121
Intent launchIntent)
120122
{
@@ -131,7 +133,7 @@ public void createIncomingCallNotification(ReactApplicationContext context,
131133
*/
132134
Bundle extras = new Bundle();
133135
extras.putInt(INCOMING_CALL_NOTIFICATION_ID, notificationId);
134-
extras.putString(CALL_SID_KEY, callInvite.getCallSid());
136+
extras.putString(CALL_SID_KEY, callInviteSid);
135137
extras.putString(NOTIFICATION_TYPE, ACTION_INCOMING_CALL);
136138
/*
137139
* Create the notification shown in the notification drawer
@@ -145,7 +147,7 @@ public void createIncomingCallNotification(ReactApplicationContext context,
145147
.setCategory(NotificationCompat.CATEGORY_CALL)
146148
.setSmallIcon(R.drawable.ic_call_white_24dp)
147149
.setContentTitle("Incoming call")
148-
.setContentText(callInvite.getFrom() + " is calling")
150+
.setContentText(callInviteFrom + " is calling")
149151
.setOngoing(true)
150152
.setAutoCancel(true)
151153
.setExtras(extras)
@@ -180,7 +182,7 @@ public void createIncomingCallNotification(ReactApplicationContext context,
180182
notificationBuilder.addAction(R.drawable.ic_call_white_24dp, "ANSWER", pendingAnswerIntent);
181183

182184
notificationManager.notify(notificationId, notificationBuilder.build());
183-
TwilioVoiceModule.callNotificationMap.put(INCOMING_NOTIFICATION_PREFIX+callInvite.getCallSid(), notificationId);
185+
TwilioVoiceModule.callNotificationMap.put(INCOMING_NOTIFICATION_PREFIX+callInviteSid, notificationId);
184186
}
185187

186188
public void initCallNotificationsChannel(NotificationManager notificationManager) {

android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public class TwilioVoiceModule extends ReactContextBaseJavaModule implements Act
8282
// Empty HashMap, contains parameters for the Outbound call
8383
private HashMap<String, String> twiMLParams = new HashMap<>();
8484

85-
public static final String INCOMING_CALL_INVITE = "INCOMING_CALL_INVITE";
8685
public static final String INCOMING_CALL_NOTIFICATION_ID = "INCOMING_CALL_NOTIFICATION_ID";
8786
public static final String NOTIFICATION_TYPE = "NOTIFICATION_TYPE";
8887
public static final String CANCELLED_CALL_INVITE = "CANCELLED_CALL_INVITE";
@@ -461,8 +460,7 @@ private void handleIncomingCallIntent(Intent intent) {
461460
if (BuildConfig.DEBUG) {
462461
Log.d(TAG, "handleIncomingCallIntent");
463462
}
464-
activeCallInvite = intent.getParcelableExtra(INCOMING_CALL_INVITE);
465-
if (activeCallInvite != null) {
463+
if (intent != null) {
466464
callAccepted = false;
467465
SoundPoolManager.getInstance(getReactApplicationContext()).playRinging();
468466

@@ -479,9 +477,9 @@ private void handleIncomingCallIntent(Intent intent) {
479477
appImportance == RunningAppProcessInfo.IMPORTANCE_SERVICE) {
480478

481479
WritableMap params = Arguments.createMap();
482-
params.putString("call_sid", activeCallInvite.getCallSid());
483-
params.putString("call_from", activeCallInvite.getFrom());
484-
params.putString("call_to", activeCallInvite.getTo()); // TODO check if needed
480+
params.putString("call_sid", intent.getStringExtra("call_sid"));
481+
params.putString("call_from", intent.getStringExtra("call_from"));
482+
params.putString("call_to", intent.getStringExtra("call_to"));
485483
eventManager.sendEvent(EVENT_DEVICE_DID_RECEIVE_INCOMING, params);
486484
}
487485
} else {

0 commit comments

Comments
 (0)