blob: 2e1a74984a2e2dc0e8e332bf7a6dd754ac7b64cc [file] [log] [blame]
/*
* Copyright (c) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ims;
import java.util.ArrayList;
import com.android.ims.internal.ICallGroup;
import com.android.ims.internal.ICall;
/**
* Manages all IMS calls which are established hereafter the initial 1-to-1 call is established.
* It's for providing the dummy calls which are disconnected with the IMS network after
* merged or extended to the conference.
*
* @hide
*/
public class ImsCallGroup implements ICallGroup {
private Object mLockObj = new Object();
private ImsCall mOwner;
private ImsCall mNeutralReferrer;
private ArrayList<ICall> mReferrers = new ArrayList<ICall>();
public ImsCallGroup() {
}
@Override
public ICall getNeutralReferrer() {
synchronized(mLockObj) {
return mNeutralReferrer;
}
}
@Override
public ICall getOwner() {
synchronized(mLockObj) {
return mOwner;
}
}
@Override
public ArrayList<ICall> getReferrers() {
synchronized(mLockObj) {
return mReferrers;
}
}
@Override
public boolean hasReferrer() {
synchronized(mLockObj) {
return !mReferrers.isEmpty();
}
}
@Override
public boolean isOwner(ICall call) {
ImsCall owner;
synchronized(mLockObj) {
owner = mOwner;
}
if ((call == null) || (owner == null)) {
return false;
}
if (!(call instanceof ImsCall)) {
return false;
}
return isSameCall(owner, (ImsCall)call);
}
@Override
public boolean isReferrer(ICall call) {
if (call == null) {
return false;
}
if (!(call instanceof ImsCall)) {
return false;
}
synchronized(mLockObj) {
for (ICall c : mReferrers) {
if ((c != null) && isSameCall((ImsCall)c, (ImsCall)call)) {
return true;
}
}
}
return false;
}
@Override
public void addReferrer(ICall call) {
if (call == null) {
return;
}
if (!(call instanceof ImsCall)) {
return;
}
// If the call is already present, ignore it
if (isReferrer(call)) {
return;
}
synchronized(mLockObj) {
mReferrers.add(call);
}
}
@Override
public void removeReferrer(ICall call) {
if (call == null) {
return;
}
if (!(call instanceof ImsCall)) {
return;
}
synchronized(mLockObj) {
mReferrers.remove(call);
}
}
@Override
public void setNeutralReferrer(ICall call) {
if ((call != null) && !(call instanceof ImsCall)) {
return;
}
synchronized(mLockObj) {
mNeutralReferrer = (ImsCall)call;
}
}
@Override
public void setOwner(ICall call) {
if ((call != null) && !(call instanceof ImsCall)) {
return;
}
synchronized(mLockObj) {
mOwner = (ImsCall)call;
}
}
@Override
public ICall getReferrer(String name) {
if ((name == null) || (name.isEmpty())) {
return null;
}
ArrayList<ICall> referrers = getReferrers();
if (referrers == null) {
return null;
}
for (ICall call : referrers) {
if ((call != null) && call.checkIfRemoteUserIsSame(name)) {
return call;
}
}
return null;
}
private boolean isSameCall(ImsCall call1, ImsCall call2) {
if ((call1 == null) || (call2 == null)) {
return false;
}
return call1.equalsTo(call2);
}
}