blob: d8621cb796abfff8a592c49a24166a7d5ba7a1db [file] [log] [blame]
/*
* Copyright (C) 2023 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.server.companion.datatransfer.contextsync;
import android.annotation.NonNull;
import android.companion.ContextSyncMessage;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/** A read-only snapshot of an {@link ContextSyncMessage}. */
class CallMetadataSyncData {
final Map<String, CallMetadataSyncData.Call> mCalls = new HashMap<>();
final List<CallMetadataSyncData.CallCreateRequest> mCallCreateRequests = new ArrayList<>();
final List<CallMetadataSyncData.CallControlRequest> mCallControlRequests = new ArrayList<>();
final List<CallMetadataSyncData.CallFacilitator> mCallFacilitators = new ArrayList<>();
public void addCall(CallMetadataSyncData.Call call) {
mCalls.put(call.getId(), call);
}
public boolean hasCall(String id) {
return mCalls.containsKey(id);
}
public Collection<CallMetadataSyncData.Call> getCalls() {
return mCalls.values();
}
public void addCallCreateRequest(CallMetadataSyncData.CallCreateRequest request) {
mCallCreateRequests.add(request);
}
public List<CallMetadataSyncData.CallCreateRequest> getCallCreateRequests() {
return mCallCreateRequests;
}
public void addCallControlRequest(CallMetadataSyncData.CallControlRequest request) {
mCallControlRequests.add(request);
}
public List<CallMetadataSyncData.CallControlRequest> getCallControlRequests() {
return mCallControlRequests;
}
public void addFacilitator(CallFacilitator facilitator) {
mCallFacilitators.add(facilitator);
}
public List<CallFacilitator> getFacilitators() {
return mCallFacilitators;
}
public static class CallFacilitator implements Parcelable {
private String mName;
private String mIdentifier;
CallFacilitator() {}
CallFacilitator(String name, String identifier) {
mName = name;
mIdentifier = identifier;
}
CallFacilitator(Parcel parcel) {
this(parcel.readString(), parcel.readString());
}
@Override
public void writeToParcel(Parcel parcel, int parcelableFlags) {
parcel.writeString(mName);
parcel.writeString(mIdentifier);
}
public String getName() {
return mName;
}
public String getIdentifier() {
return mIdentifier;
}
public void setName(String name) {
mName = name;
}
public void setIdentifier(String identifier) {
mIdentifier = identifier;
}
@Override
public int describeContents() {
return 0;
}
@NonNull
public static final Parcelable.Creator<CallFacilitator> CREATOR =
new Parcelable.Creator<>() {
@Override
public CallFacilitator createFromParcel(Parcel source) {
return new CallFacilitator(source);
}
@Override
public CallFacilitator[] newArray(int size) {
return new CallFacilitator[size];
}
};
}
public static class CallControlRequest {
private String mId;
private int mControl;
public void setId(String id) {
mId = id;
}
public void setControl(int control) {
mControl = control;
}
public String getId() {
return mId;
}
public int getControl() {
return mControl;
}
}
public static class CallCreateRequest {
private String mId;
private String mAddress;
private CallFacilitator mFacilitator;
public void setId(String id) {
mId = id;
}
public void setAddress(String address) {
mAddress = address;
}
public void setFacilitator(CallFacilitator facilitator) {
mFacilitator = facilitator;
}
public String getId() {
return mId;
}
public String getAddress() {
return mAddress;
}
public CallFacilitator getFacilitator() {
return mFacilitator;
}
}
public static class Call implements Parcelable {
private String mId;
private String mCallerId;
private byte[] mAppIcon;
private CallFacilitator mFacilitator;
private int mStatus;
private final Set<Integer> mControls = new HashSet<>();
public static Call fromParcel(Parcel parcel) {
final Call call = new Call();
call.setId(parcel.readString());
call.setCallerId(parcel.readString());
call.setAppIcon(parcel.readBlob());
call.setFacilitator(parcel.readParcelable(CallFacilitator.class.getClassLoader(),
CallFacilitator.class));
call.setStatus(parcel.readInt());
final int numberOfControls = parcel.readInt();
for (int i = 0; i < numberOfControls; i++) {
call.addControl(parcel.readInt());
}
return call;
}
@Override
public void writeToParcel(Parcel parcel, int parcelableFlags) {
parcel.writeString(mId);
parcel.writeString(mCallerId);
parcel.writeBlob(mAppIcon);
parcel.writeParcelable(mFacilitator, parcelableFlags);
parcel.writeInt(mStatus);
parcel.writeInt(mControls.size());
for (int control : mControls) {
parcel.writeInt(control);
}
}
void setId(String id) {
mId = id;
}
void setCallerId(String callerId) {
mCallerId = callerId;
}
void setAppIcon(byte[] appIcon) {
mAppIcon = appIcon;
}
void setFacilitator(CallFacilitator facilitator) {
mFacilitator = facilitator;
}
void setStatus(int status) {
mStatus = status;
}
void addControl(int control) {
mControls.add(control);
}
void setControls(Set<Integer> controls) {
mControls.clear();
mControls.addAll(controls);
}
String getId() {
return mId;
}
String getCallerId() {
return mCallerId;
}
byte[] getAppIcon() {
return mAppIcon;
}
CallFacilitator getFacilitator() {
return mFacilitator;
}
int getStatus() {
return mStatus;
}
Set<Integer> getControls() {
return mControls;
}
boolean hasControl(int control) {
return mControls.contains(control);
}
@Override
public boolean equals(Object other) {
if (other instanceof CallMetadataSyncData.Call) {
return mId != null && mId.equals(((Call) other).getId());
}
return false;
}
@Override
public int hashCode() {
return Objects.hashCode(mId);
}
@Override
public int describeContents() {
return 0;
}
@NonNull public static final Parcelable.Creator<Call> CREATOR = new Parcelable.Creator<>() {
@Override
public Call createFromParcel(Parcel source) {
return Call.fromParcel(source);
}
@Override
public Call[] newArray(int size) {
return new Call[size];
}
};
}
}