summaryrefslogtreecommitdiffstats
path: root/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/car/dialer/ui/activecall/InCallViewModel.java')
-rw-r--r--src/com/android/car/dialer/ui/activecall/InCallViewModel.java102
1 files changed, 91 insertions, 11 deletions
diff --git a/src/com/android/car/dialer/ui/activecall/InCallViewModel.java b/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
index 39210fa2..57bb39e9 100644
--- a/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
+++ b/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
@@ -59,20 +59,24 @@ public class InCallViewModel extends AndroidViewModel implements
private final MutableLiveData<List<Call>> mCallListLiveData;
private final MutableLiveData<List<Call>> mOngoingCallListLiveData;
+ private final MutableLiveData<List<Call>> mConferenceCallListLiveData;
+ private final LiveData<List<CallDetail>> mConferenceCallDetailListLiveData;
private final Comparator<Call> mCallComparator;
private final MutableLiveData<Call> mIncomingCallLiveData;
- private final LiveData<CallDetail> mCallDetailLiveData;
+ private final CallDetailLiveData mCallDetailLiveData;
private final LiveData<Integer> mCallStateLiveData;
private final LiveData<Call> mPrimaryCallLiveData;
private final LiveData<Call> mSecondaryCallLiveData;
- private final LiveData<CallDetail> mSecondaryCallDetailLiveData;
+ private final CallDetailLiveData mSecondaryCallDetailLiveData;
+ private final LiveData<Pair<Call, Call>> mOngoingCallPairLiveData;
private final LiveData<Integer> mAudioRouteLiveData;
private MutableLiveData<CallAudioState> mCallAudioStateLiveData;
private final MutableLiveData<Boolean> mDialpadIsOpen;
private final ShowOnholdCallLiveData mShowOnholdCall;
private LiveData<Long> mCallConnectTimeLiveData;
+ private LiveData<Long> mSecondaryCallConnectTimeLiveData;
private LiveData<Pair<Integer, Long>> mCallStateAndConnectTimeLiveData;
private final Context mContext;
@@ -109,12 +113,25 @@ public class InCallViewModel extends AndroidViewModel implements
// Sets value to trigger incoming call and active call list to update.
mCallListLiveData.setValue(mCallListLiveData.getValue());
}
+
+ @Override
+ public void onParentChanged(Call call, Call parent) {
+ L.d(TAG, "onParentChanged %s", call);
+ updateCallList();
+ }
+
+ @Override
+ public void onChildrenChanged(Call call, List<Call> children) {
+ L.d(TAG, "onChildrenChanged %s", call);
+ updateCallList();
+ }
};
public InCallViewModel(@NonNull Application application) {
super(application);
mContext = application.getApplicationContext();
+ mConferenceCallListLiveData = new MutableLiveData<>();
mIncomingCallLiveData = new MutableLiveData<>();
mOngoingCallListLiveData = new MutableLiveData<>();
mCallAudioStateLiveData = new MutableLiveData<>();
@@ -126,16 +143,37 @@ public class InCallViewModel extends AndroidViewModel implements
List<Call> activeCallList = filter(callList,
call -> call != null && call.getState() != Call.STATE_RINGING);
activeCallList.sort(mCallComparator);
- mOngoingCallListLiveData.setValue(activeCallList);
+ List<Call> conferenceList = filter(activeCallList,
+ call -> call.getParent() != null);
+ List<Call> ongoingCallList = filter(activeCallList,
+ call -> call.getParent() == null);
+ mConferenceCallListLiveData.setValue(conferenceList);
+ mOngoingCallListLiveData.setValue(ongoingCallList);
mIncomingCallLiveData.setValue(firstMatch(callList,
call -> call != null && call.getState() == Call.STATE_RINGING));
+
+ L.d(TAG, "size:" + activeCallList.size() + " activeList" + activeCallList);
+ L.d(TAG, "conf:%s" + conferenceList, conferenceList.size());
+ L.d(TAG, "ongoing:%s" + ongoingCallList, ongoingCallList.size());
}
};
- mPrimaryCallLiveData = Transformations.map(mOngoingCallListLiveData,
- input -> input.isEmpty() ? null : input.get(0));
- mCallDetailLiveData = Transformations.switchMap(mPrimaryCallLiveData,
- input -> input != null ? new CallDetailLiveData(input) : null);
+ mConferenceCallDetailListLiveData = Transformations.map(mConferenceCallListLiveData,
+ callList -> {
+ List<CallDetail> detailList = new ArrayList<>();
+ for (Call call : callList) {
+ detailList.add(CallDetail.fromTelecomCallDetail(call.getDetails()));
+ }
+ return detailList;
+ });
+
+ mCallDetailLiveData = new CallDetailLiveData();
+ mPrimaryCallLiveData = Transformations.map(mOngoingCallListLiveData, input -> {
+ Call call = input.isEmpty() ? null : input.get(0);
+ mCallDetailLiveData.setTelecomCall(call);
+ return call;
+ });
+
mCallStateLiveData = Transformations.switchMap(mPrimaryCallLiveData,
input -> input != null ? new CallStateLiveData(input) : null);
mCallConnectTimeLiveData = Transformations.map(mCallDetailLiveData, (details) -> {
@@ -147,11 +185,23 @@ public class InCallViewModel extends AndroidViewModel implements
mCallStateAndConnectTimeLiveData =
LiveDataFunctions.pair(mCallStateLiveData, mCallConnectTimeLiveData);
- mSecondaryCallLiveData = Transformations.map(mOngoingCallListLiveData,
- callList -> (callList != null && callList.size() > 1) ? callList.get(1) : null);
+ mSecondaryCallDetailLiveData = new CallDetailLiveData();
+ mSecondaryCallLiveData = Transformations.map(mOngoingCallListLiveData, callList -> {
+ Call call = (callList != null && callList.size() > 1) ? callList.get(1) : null;
+ mSecondaryCallDetailLiveData.setTelecomCall(call);
+ return call;
+ });
+
+ mSecondaryCallConnectTimeLiveData = Transformations.map(mSecondaryCallDetailLiveData,
+ details -> {
+ if (details == null) {
+ return 0L;
+ }
+ return details.getConnectTimeMillis();
+ });
- mSecondaryCallDetailLiveData = Transformations.switchMap(mSecondaryCallLiveData,
- input -> input != null ? new CallDetailLiveData(input) : null);
+ mOngoingCallPairLiveData = LiveDataFunctions.pair(mPrimaryCallLiveData,
+ mSecondaryCallLiveData);
mAudioRouteLiveData = new AudioRouteLiveData(mContext);
@@ -166,6 +216,22 @@ public class InCallViewModel extends AndroidViewModel implements
mContext.bindService(intent, mInCallServiceConnection, Context.BIND_AUTO_CREATE);
}
+ /** Merge primary and secondary calls into a conference */
+ public void mergeConference() {
+ Call call = mPrimaryCallLiveData.getValue();
+ Call otherCall = mSecondaryCallLiveData.getValue();
+
+ if (call == null || otherCall == null) {
+ return;
+ }
+ call.conference(otherCall);
+ }
+
+ /** Returns the live data which monitors conference calls */
+ public LiveData<List<CallDetail>> getConferenceCallDetailList() {
+ return mConferenceCallDetailListLiveData;
+ }
+
/** Returns the live data which monitors all the calls. */
public LiveData<List<Call>> getAllCallList() {
return mCallListLiveData;
@@ -229,6 +295,20 @@ public class InCallViewModel extends AndroidViewModel implements
}
/**
+ * Returns the live data which monitors the secondary call connect time.
+ */
+ public LiveData<Long> getSecondaryCallConnectTime() {
+ return mSecondaryCallConnectTimeLiveData;
+ }
+
+ /**
+ * Returns the live data that monitors the primary and secondary calls.
+ */
+ public LiveData<Pair<Call, Call>> getOngoingCallPair() {
+ return mOngoingCallPairLiveData;
+ }
+
+ /**
* Returns current audio route.
*/
public LiveData<Integer> getAudioRoute() {