mirror of
https://github.com/pierre42100/ComunicAndroid
synced 2024-11-23 13:59:29 +00:00
Can respond to incoming calls.
This commit is contained in:
parent
6b3d46f04f
commit
8b6c64fd2a
@ -74,16 +74,30 @@
|
|||||||
<!-- Call activity -->
|
<!-- Call activity -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activities.CallActivity"
|
android:name=".ui.activities.CallActivity"
|
||||||
android:label="@string/activity_call_label"/>
|
android:label="@string/activity_call_label" />
|
||||||
|
|
||||||
|
<!-- Incoming call activity -->
|
||||||
|
<activity android:name=".ui.activities.IncomingCallActivity" />
|
||||||
|
|
||||||
<!-- New calls available receiver -->
|
<!-- New calls available receiver -->
|
||||||
<receiver android:name=".ui.receivers.PendingCallsBroadcastReceiver" android:exported="false">
|
<receiver
|
||||||
|
android:name=".ui.receivers.PendingCallsBroadcastReceiver"
|
||||||
|
android:exported="false">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="org.communiquons.android.comunic.client.NEW_CALLS_AVAILABLE" />
|
<action android:name="org.communiquons.android.comunic.client.NEW_CALLS_AVAILABLE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<!-- Reject new call receiver -->
|
||||||
|
<receiver
|
||||||
|
android:name=".ui.receivers.RejectCallReceiver"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="org.communiquons.android.comunic.client.REJECT_INCOMING_CALL" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -9,6 +9,7 @@ import org.communiquons.android.comunic.client.data.models.APIRequest;
|
|||||||
import org.communiquons.android.comunic.client.data.models.APIResponse;
|
import org.communiquons.android.comunic.client.data.models.APIResponse;
|
||||||
import org.communiquons.android.comunic.client.data.models.CallInformation;
|
import org.communiquons.android.comunic.client.data.models.CallInformation;
|
||||||
import org.communiquons.android.comunic.client.data.models.CallMember;
|
import org.communiquons.android.comunic.client.data.models.CallMember;
|
||||||
|
import org.communiquons.android.comunic.client.data.models.CallResponse;
|
||||||
import org.communiquons.android.comunic.client.data.models.CallsConfiguration;
|
import org.communiquons.android.comunic.client.data.models.CallsConfiguration;
|
||||||
import org.communiquons.android.comunic.client.data.models.NextPendingCallInformation;
|
import org.communiquons.android.comunic.client.data.models.NextPendingCallInformation;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -171,6 +172,26 @@ public class CallsHelper extends BaseHelper {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Respond to a call request
|
||||||
|
*
|
||||||
|
* @param response The response to the call
|
||||||
|
* @return TRUE for a success / FALSE else
|
||||||
|
*/
|
||||||
|
public boolean respondToCall(@NonNull CallResponse response){
|
||||||
|
|
||||||
|
APIRequest request = new APIRequest(getContext(), "calls/respond");
|
||||||
|
request.addInt("call_id", response.getCallID());
|
||||||
|
request.addBoolean("accept", response.isAccept());
|
||||||
|
|
||||||
|
try {
|
||||||
|
return request.exec().getJSONObject().has("success");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn a {@link JSONObject} object into a {@link CallsConfiguration} object.
|
* Turn a {@link JSONObject} object into a {@link CallsConfiguration} object.
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
package org.communiquons.android.comunic.client.data.models;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Response of a user to a call
|
||||||
|
*
|
||||||
|
* @author Pierre HUBERT
|
||||||
|
*/
|
||||||
|
public class CallResponse {
|
||||||
|
|
||||||
|
//Private fields
|
||||||
|
private int callID;
|
||||||
|
private boolean accept;
|
||||||
|
|
||||||
|
public CallResponse(int callID, boolean accept) {
|
||||||
|
this.callID = callID;
|
||||||
|
this.accept = accept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCallID() {
|
||||||
|
return callID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallID(int callID) {
|
||||||
|
this.callID = callID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAccept() {
|
||||||
|
return accept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccept(boolean accept) {
|
||||||
|
this.accept = accept;
|
||||||
|
}
|
||||||
|
}
|
@ -72,6 +72,13 @@ public final class Constants {
|
|||||||
public static final String ACTION_NOTIFY_NEW_CALLS_AVAILABLE =
|
public static final String ACTION_NOTIFY_NEW_CALLS_AVAILABLE =
|
||||||
"org.communiquons.android.comunic.client.NEW_CALLS_AVAILABLE";
|
"org.communiquons.android.comunic.client.NEW_CALLS_AVAILABLE";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intent used to reject incoming call
|
||||||
|
*/
|
||||||
|
public static final String ACTION_REJECT_INCOMING_CALL =
|
||||||
|
"org.communiquons.android.comunic.client.REJECT_INCOMING_CALL";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package org.communiquons.android.comunic.client.ui.activities;
|
package org.communiquons.android.comunic.client.ui.activities;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.CallSuper;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
|
||||||
@ -20,6 +20,12 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
*/
|
*/
|
||||||
private SafeAsyncTasksManager mSafeAsyncTasksManager = null;
|
private SafeAsyncTasksManager mSafeAsyncTasksManager = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current active class
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private static String mActiveActivityName = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -36,6 +42,22 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
mSafeAsyncTasksManager.unsetAllTasks();
|
mSafeAsyncTasksManager.unsetAllTasks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
|
||||||
|
mActiveActivityName = getClass().getSimpleName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
|
||||||
|
if(getClass().getSimpleName().equals(mActiveActivityName))
|
||||||
|
mActiveActivityName = null;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public ActionBar getSupportActionBar() {
|
public ActionBar getSupportActionBar() {
|
||||||
@ -51,4 +73,14 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
public SafeAsyncTasksManager getTasksManager() {
|
public SafeAsyncTasksManager getTasksManager() {
|
||||||
return mSafeAsyncTasksManager;
|
return mSafeAsyncTasksManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check out whether an activity is the active activity or not
|
||||||
|
*
|
||||||
|
* @param activity The activity to check
|
||||||
|
* @return True if the activity is the active one / false else
|
||||||
|
*/
|
||||||
|
public static boolean IsActiveActivity(Class<? extends BaseActivity> activity){
|
||||||
|
return activity.getSimpleName().equals(mActiveActivityName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.communiquons.android.comunic.client.ui.activities;
|
package org.communiquons.android.comunic.client.ui.activities;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.communiquons.android.comunic.client.R;
|
import org.communiquons.android.comunic.client.R;
|
||||||
@ -14,7 +13,7 @@ import java.util.Objects;
|
|||||||
*
|
*
|
||||||
* @author Pierre HUBERT
|
* @author Pierre HUBERT
|
||||||
*/
|
*/
|
||||||
public class CallActivity extends AppCompatActivity {
|
public class CallActivity extends BaseActivity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mandatory argument that includes call id
|
* Mandatory argument that includes call id
|
||||||
@ -29,9 +28,6 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
//Hide call bar
|
//Hide call bar
|
||||||
Objects.requireNonNull(getSupportActionBar()).hide();
|
Objects.requireNonNull(getSupportActionBar()).hide();
|
||||||
|
|
||||||
((TextView)findViewById(R.id.call_id)).setText(
|
|
||||||
"Call " + getIntent().getExtras().getInt(ARGUMENT_CALL_ID));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -40,5 +36,8 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
//Hide call notifications
|
//Hide call notifications
|
||||||
PendingCallsBroadcastReceiver.RemoveCallNotification(this);
|
PendingCallsBroadcastReceiver.RemoveCallNotification(this);
|
||||||
|
|
||||||
|
((TextView)findViewById(R.id.call_id)).setText(
|
||||||
|
"Call " + getIntent().getExtras().getInt(ARGUMENT_CALL_ID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,159 @@
|
|||||||
|
package org.communiquons.android.comunic.client.ui.activities;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.R;
|
||||||
|
import org.communiquons.android.comunic.client.data.models.NextPendingCallInformation;
|
||||||
|
import org.communiquons.android.comunic.client.data.utils.AccountUtils;
|
||||||
|
import org.communiquons.android.comunic.client.ui.Constants;
|
||||||
|
import org.communiquons.android.comunic.client.ui.asynctasks.GetNextPendingCallTask;
|
||||||
|
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
|
||||||
|
import org.communiquons.android.comunic.client.ui.receivers.PendingCallsBroadcastReceiver;
|
||||||
|
import org.communiquons.android.comunic.client.ui.receivers.RejectCallReceiver;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Incoming call activity
|
||||||
|
*
|
||||||
|
* @author Pierre HUBERT
|
||||||
|
*/
|
||||||
|
public class IncomingCallActivity extends BaseActivity implements SafeAsyncTask.OnPostExecuteListener<NextPendingCallInformation>, View.OnClickListener {
|
||||||
|
|
||||||
|
private NextPendingCallInformation mNextPendingCallInformation;
|
||||||
|
|
||||||
|
private RefreshThread mRefreshThread = null;
|
||||||
|
|
||||||
|
private Button mAcceptButton;
|
||||||
|
private Button mRejectButton;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_incoming_call);
|
||||||
|
|
||||||
|
getSupportActionBar().hide();
|
||||||
|
|
||||||
|
PendingCallsBroadcastReceiver.RemoveCallNotification(this);
|
||||||
|
|
||||||
|
mAcceptButton = findViewById(R.id.accept_button);
|
||||||
|
mRejectButton = findViewById(R.id.reject_button);
|
||||||
|
|
||||||
|
if(IsActiveActivity(IncomingCallActivity.class))
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
|
||||||
|
mRefreshThread = new RefreshThread();
|
||||||
|
mRefreshThread.start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
|
||||||
|
mRefreshThread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getNextPendingCall() {
|
||||||
|
//Get next pending call
|
||||||
|
GetNextPendingCallTask getNextPendingCallTask = new GetNextPendingCallTask(getApplicationContext());
|
||||||
|
getNextPendingCallTask.setOnPostExecuteListener(this);
|
||||||
|
getNextPendingCallTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
|
getTasksManager().addTask(getNextPendingCallTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void OnPostExecute(@Nullable NextPendingCallInformation nextPendingCallInformation) {
|
||||||
|
|
||||||
|
if(nextPendingCallInformation == null){
|
||||||
|
Toast.makeText(this, R.string.err_get_next_pending_call_info, Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!nextPendingCallInformation.isHasPendingCall()
|
||||||
|
|| nextPendingCallInformation.hasAllMembersLeftCallExcept(AccountUtils.getID(this)))
|
||||||
|
finish();
|
||||||
|
|
||||||
|
this.mNextPendingCallInformation = nextPendingCallInformation;
|
||||||
|
|
||||||
|
((TextView)findViewById(R.id.call_title)).setText(nextPendingCallInformation.getCallName());
|
||||||
|
mAcceptButton.setOnClickListener(this);
|
||||||
|
mRejectButton.setOnClickListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
|
||||||
|
//Accept call
|
||||||
|
if(v.equals(mAcceptButton)){
|
||||||
|
Intent intent = new Intent(this, CallActivity.class);
|
||||||
|
intent.putExtra(CallActivity.ARGUMENT_CALL_ID, mNextPendingCallInformation.getId());
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Reject calls
|
||||||
|
if(v.equals(mRejectButton)){
|
||||||
|
Intent intent = new Intent(this, RejectCallReceiver.class);
|
||||||
|
intent.setAction(Constants.IntentActions.ACTION_REJECT_INCOMING_CALL);
|
||||||
|
intent.putExtra(RejectCallReceiver.ARGUMENT_CALL_ID, mNextPendingCallInformation.getId());
|
||||||
|
sendBroadcast(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class used to refresh call information
|
||||||
|
*/
|
||||||
|
private class RefreshThread extends Thread {
|
||||||
|
|
||||||
|
private boolean stop = false;
|
||||||
|
private final Object o = new Object();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
super.run();
|
||||||
|
|
||||||
|
while(!stop){
|
||||||
|
|
||||||
|
//Execute task
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
getNextPendingCall();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
synchronized (o) {
|
||||||
|
|
||||||
|
//Looping
|
||||||
|
try {
|
||||||
|
o.wait(2000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void interrupt(){
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package org.communiquons.android.comunic.client.ui.asynctasks;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.data.helpers.CallsHelper;
|
||||||
|
import org.communiquons.android.comunic.client.data.models.CallResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Respond to call task
|
||||||
|
*
|
||||||
|
* @author Pierre HUBERT
|
||||||
|
*/
|
||||||
|
public class RespondToCallTask extends SafeAsyncTask<CallResponse, Void, Boolean> {
|
||||||
|
|
||||||
|
public RespondToCallTask(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(CallResponse... callResponses) {
|
||||||
|
return new CallsHelper(getContext()).respondToCall(callResponses[0]);
|
||||||
|
}
|
||||||
|
}
|
@ -18,7 +18,9 @@ import org.communiquons.android.comunic.client.R;
|
|||||||
import org.communiquons.android.comunic.client.data.models.NextPendingCallInformation;
|
import org.communiquons.android.comunic.client.data.models.NextPendingCallInformation;
|
||||||
import org.communiquons.android.comunic.client.data.utils.AccountUtils;
|
import org.communiquons.android.comunic.client.data.utils.AccountUtils;
|
||||||
import org.communiquons.android.comunic.client.ui.Constants;
|
import org.communiquons.android.comunic.client.ui.Constants;
|
||||||
|
import org.communiquons.android.comunic.client.ui.activities.BaseActivity;
|
||||||
import org.communiquons.android.comunic.client.ui.activities.CallActivity;
|
import org.communiquons.android.comunic.client.ui.activities.CallActivity;
|
||||||
|
import org.communiquons.android.comunic.client.ui.activities.IncomingCallActivity;
|
||||||
import org.communiquons.android.comunic.client.ui.asynctasks.GetNextPendingCallTask;
|
import org.communiquons.android.comunic.client.ui.asynctasks.GetNextPendingCallTask;
|
||||||
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
|
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
|
||||||
import org.communiquons.android.comunic.client.ui.utils.UiUtils;
|
import org.communiquons.android.comunic.client.ui.utils.UiUtils;
|
||||||
@ -50,6 +52,11 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
*/
|
*/
|
||||||
private boolean locked = false;
|
private boolean locked = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ID of the last shown notification
|
||||||
|
*/
|
||||||
|
private static int mLastNotificationCallID = 0;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(final Context context, Intent intent) {
|
public void onReceive(final Context context, Intent intent) {
|
||||||
@ -61,6 +68,12 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
throw new RuntimeException("Unexpected call of " + TAG);
|
throw new RuntimeException("Unexpected call of " + TAG);
|
||||||
|
|
||||||
|
|
||||||
|
//Check if user is already calling
|
||||||
|
if(CheckIfUseless(context, null)) {
|
||||||
|
Log.v(TAG, "Reported that a new call is available but skipped because considered as useless.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//Check if service is currently locked
|
//Check if service is currently locked
|
||||||
if(locked) {
|
if(locked) {
|
||||||
Log.e(TAG, "New call skipped because this class is locked");
|
Log.e(TAG, "New call skipped because this class is locked");
|
||||||
@ -93,29 +106,20 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if there is no pending call
|
|
||||||
if(!info.isHasPendingCall()) {
|
|
||||||
|
|
||||||
//Remove any related notification
|
|
||||||
RemoveCallNotification(context);
|
|
||||||
|
|
||||||
|
//Check if it is useless to continue
|
||||||
|
if(CheckIfUseless(context, info)) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if all notification members left the call
|
|
||||||
if(info.hasAllMembersLeftCallExcept(AccountUtils.getID(context)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Create notification
|
//Create notification
|
||||||
|
|
||||||
//Accept intent
|
//Full screen call request intent
|
||||||
Intent acceptIntent = new Intent(context, CallActivity.class);
|
Intent fullScreenCallRequestIntent = new Intent(context, IncomingCallActivity.class);
|
||||||
acceptIntent.putExtra(CallActivity.ARGUMENT_CALL_ID, info.getId());
|
PendingIntent pendingFullScreenRequestIntent = PendingIntent.getActivity(context,
|
||||||
PendingIntent pendingAcceptIntent
|
0, fullScreenCallRequestIntent, 0);
|
||||||
= PendingIntent.getActivity(context, 0, acceptIntent, 0);
|
|
||||||
|
|
||||||
//Create and show notification
|
//Create and show notification
|
||||||
NotificationCompat.Builder builder =
|
NotificationCompat.Builder builder =
|
||||||
@ -123,14 +127,9 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
.setSmallIcon(R.drawable.ic_call)
|
.setSmallIcon(R.drawable.ic_call)
|
||||||
.setContentTitle(info.getCallName())
|
.setContentTitle(info.getCallName())
|
||||||
.setContentText(UiUtils.getString(context, R.string.notification_call_content, info.getCallName()))
|
.setContentText(UiUtils.getString(context, R.string.notification_call_content, info.getCallName()))
|
||||||
.setContentIntent(pendingAcceptIntent)
|
//.setContentIntent(pendingAcceptIntent)
|
||||||
.setFullScreenIntent(pendingAcceptIntent, true)
|
.setFullScreenIntent(pendingFullScreenRequestIntent, true)
|
||||||
.setPriority(PRIORITY_HIGH)
|
.setPriority(PRIORITY_HIGH);
|
||||||
|
|
||||||
//Accept action
|
|
||||||
.addAction(R.drawable.ic_call,
|
|
||||||
UiUtils.getString(context, R.string.notification_call_accept), pendingAcceptIntent);
|
|
||||||
//.addAction(R.drawable.ic_call, R.string.notification_call_reject, null)
|
|
||||||
|
|
||||||
|
|
||||||
//Create notification channel if required
|
//Create notification channel if required
|
||||||
@ -146,7 +145,28 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
Notification n = builder.build();
|
Notification n = builder.build();
|
||||||
n.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
|
n.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
|
||||||
|
|
||||||
NotificationManagerCompat.from(context).notify(CALL_NOTIFICATION_ID, n);
|
mLastNotificationCallID = info.getId();
|
||||||
|
NotificationManagerCompat.from(context).notify(GetNotificationID(mLastNotificationCallID), n);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if calling this receiver is useless for now
|
||||||
|
*
|
||||||
|
* @param context Context of application
|
||||||
|
* @param call Optional information about a pending call
|
||||||
|
* @return TRUE if useless / FALSE else
|
||||||
|
*/
|
||||||
|
public static boolean CheckIfUseless(Context context, @Nullable NextPendingCallInformation call){
|
||||||
|
boolean useless = BaseActivity.IsActiveActivity(IncomingCallActivity.class)
|
||||||
|
|| BaseActivity.IsActiveActivity(CallActivity.class)
|
||||||
|
|| (call != null && (
|
||||||
|
!call.isHasPendingCall()
|
||||||
|
|| call.hasAllMembersLeftCallExcept(AccountUtils.getID(context))));
|
||||||
|
|
||||||
|
if(useless)
|
||||||
|
RemoveCallNotification(context);
|
||||||
|
|
||||||
|
return useless;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,6 +175,15 @@ public class PendingCallsBroadcastReceiver extends BroadcastReceiver {
|
|||||||
* @param context The context of the application
|
* @param context The context of the application
|
||||||
*/
|
*/
|
||||||
public static void RemoveCallNotification(Context context){
|
public static void RemoveCallNotification(Context context){
|
||||||
NotificationManagerCompat.from(context).cancel(CALL_NOTIFICATION_ID);
|
NotificationManagerCompat.from(context).cancel(GetNotificationID(mLastNotificationCallID));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ID of a notification for a call
|
||||||
|
*
|
||||||
|
* @param callID The ID of the target call
|
||||||
|
*/
|
||||||
|
private static int GetNotificationID(int callID){
|
||||||
|
return CALL_NOTIFICATION_ID*1000 + callID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package org.communiquons.android.comunic.client.ui.receivers;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.data.models.CallResponse;
|
||||||
|
import org.communiquons.android.comunic.client.ui.asynctasks.RespondToCallTask;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static org.communiquons.android.comunic.client.ui.Constants.IntentActions.ACTION_REJECT_INCOMING_CALL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This broadcast receiver is used to reject incoming calls
|
||||||
|
*
|
||||||
|
* @author Pierre HUBERT
|
||||||
|
*/
|
||||||
|
public class RejectCallReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug tag
|
||||||
|
*/
|
||||||
|
private static final String TAG = RejectCallReceiver.class.getSimpleName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mandatory argument that includes call id
|
||||||
|
*/
|
||||||
|
public static final String ARGUMENT_CALL_ID = "call_id";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
|
||||||
|
if(intent == null || !ACTION_REJECT_INCOMING_CALL.equals(intent.getAction()))
|
||||||
|
throw new RuntimeException(TAG + " was incorrectly triggered!");
|
||||||
|
|
||||||
|
int callID = Objects.requireNonNull(intent.getExtras()).getInt(ARGUMENT_CALL_ID);
|
||||||
|
|
||||||
|
//Send the response back to the server
|
||||||
|
Log.v(TAG, "Reject call " + callID);
|
||||||
|
RespondToCallTask respondToCallTask = new RespondToCallTask(context);
|
||||||
|
respondToCallTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new CallResponse(
|
||||||
|
callID,
|
||||||
|
false
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
72
app/src/main/res/layout/activity_incoming_call.xml
Normal file
72
app/src/main/res/layout/activity_incoming_call.xml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".ui.activities.IncomingCallActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/call_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Large"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/linearLayout3"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:text="Call title" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/linearLayout3"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/reject_button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:backgroundTint="@color/holo_red_dark"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:text="@string/button_reject_call"
|
||||||
|
tools:ignore="ButtonStyle" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/accept_button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:backgroundTint="@color/holo_green_dark"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:text="@string/button_accept_call"
|
||||||
|
tools:ignore="ButtonStyle" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView14"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginTop="7dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:text="@string/title_incoming_call"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/call_title"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
@ -325,4 +325,8 @@
|
|||||||
<string name="notification_call_reject">Rejeter</string>
|
<string name="notification_call_reject">Rejeter</string>
|
||||||
<string name="notification_call_content">%s vous appelle.</string>
|
<string name="notification_call_content">%s vous appelle.</string>
|
||||||
<string name="action_accelerate_notifications_refresh">Accélérer le rafraîchissement des notifications</string>
|
<string name="action_accelerate_notifications_refresh">Accélérer le rafraîchissement des notifications</string>
|
||||||
|
<string name="button_reject_call">Rejeter</string>
|
||||||
|
<string name="button_accept_call">Répondre</string>
|
||||||
|
<string name="title_incoming_call">Appel entrant</string>
|
||||||
|
<string name="err_get_next_pending_call_info">Impossible de récupérer les informations de l\'appel en cours !</string>
|
||||||
</resources>
|
</resources>
|
@ -8,7 +8,7 @@
|
|||||||
<color name="darker_gray">#aaa</color>
|
<color name="darker_gray">#aaa</color>
|
||||||
<color name="darker_darker_gray">#5b5b5b</color>
|
<color name="darker_darker_gray">#5b5b5b</color>
|
||||||
<color name="dark_blue">#303f9f</color>
|
<color name="dark_blue">#303f9f</color>
|
||||||
<color name="holo_red_dark">#ffcc0000</color>
|
<color name="holo_red_dark">#cc0000</color>
|
||||||
|
|
||||||
<color name="default_drawable_color">#000000</color>
|
<color name="default_drawable_color">#000000</color>
|
||||||
|
|
||||||
|
@ -324,4 +324,8 @@
|
|||||||
<string name="notification_call_reject">Reject call</string>
|
<string name="notification_call_reject">Reject call</string>
|
||||||
<string name="notification_call_content">%s is calling you</string>
|
<string name="notification_call_content">%s is calling you</string>
|
||||||
<string name="action_accelerate_notifications_refresh">Accelerate notifications refresh</string>
|
<string name="action_accelerate_notifications_refresh">Accelerate notifications refresh</string>
|
||||||
|
<string name="button_reject_call">Reject call</string>
|
||||||
|
<string name="button_accept_call">Accept call</string>
|
||||||
|
<string name="title_incoming_call">Incoming call</string>
|
||||||
|
<string name="err_get_next_pending_call_info">Could not get pending call information!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user