From 011728fc3a4368b601844d225d1f37bf48ea5735 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Thu, 23 Apr 2015 15:47:06 -0700 Subject: Add handler parameter for callbacks. Bug: 20160491 Change-Id: I94639b06b8c97b6585e169d667a67ce328e716af --- telecomm/java/android/telecom/Call.java | 139 +++++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 28 deletions(-) (limited to 'telecomm/java/android/telecom/Call.java') diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index d92c0c7..9273939 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -19,10 +19,12 @@ package android.telecom; import android.annotation.SystemApi; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import java.lang.String; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -608,7 +610,7 @@ public final class Call { private final List mChildrenIds = new ArrayList<>(); private final List mChildren = new ArrayList<>(); private final List mUnmodifiableChildren = Collections.unmodifiableList(mChildren); - private final List mCallbacks = new CopyOnWriteArrayList<>(); + private final List> mCallbackRecords = new CopyOnWriteArrayList<>(); private final List mConferenceableCalls = new ArrayList<>(); private final List mUnmodifiableConferenceableCalls = Collections.unmodifiableList(mConferenceableCalls); @@ -850,7 +852,20 @@ public final class Call { * @param callback A {@code Callback}. */ public void registerCallback(Callback callback) { - mCallbacks.add(callback); + registerCallback(callback, new Handler()); + } + + /** + * Registers a callback to this {@code Call}. + * + * @param callback A {@code Callback}. + * @param handler A handler which command and status changes will be delivered to. + */ + public void registerCallback(Callback callback, Handler handler) { + unregisterCallback(callback); + if (callback != null && handler != null) { + mCallbackRecords.add(new CallbackRecord(callback, handler)); + } } /** @@ -860,7 +875,12 @@ public final class Call { */ public void unregisterCallback(Callback callback) { if (callback != null) { - mCallbacks.remove(callback); + for (CallbackRecord record : mCallbackRecords) { + if (record.getCallback() == callback) { + mCallbackRecords.remove(record); + break; + } + } } } @@ -1021,57 +1041,120 @@ public final class Call { } } - private void fireStateChanged(int newState) { - for (Callback callback : mCallbacks) { - callback.onStateChanged(this, newState); + private void fireStateChanged(final int newState) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onStateChanged(call, newState); + } + }); } } - private void fireParentChanged(Call newParent) { - for (Callback callback : mCallbacks) { - callback.onParentChanged(this, newParent); + private void fireParentChanged(final Call newParent) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onParentChanged(call, newParent); + } + }); } } - private void fireChildrenChanged(List children) { - for (Callback callback : mCallbacks) { - callback.onChildrenChanged(this, children); + private void fireChildrenChanged(final List children) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onChildrenChanged(call, children); + } + }); } } - private void fireDetailsChanged(Details details) { - for (Callback callback : mCallbacks) { - callback.onDetailsChanged(this, details); + private void fireDetailsChanged(final Details details) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onDetailsChanged(call, details); + } + }); } } - private void fireCannedTextResponsesLoaded(List cannedTextResponses) { - for (Callback callback : mCallbacks) { - callback.onCannedTextResponsesLoaded(this, cannedTextResponses); + private void fireCannedTextResponsesLoaded(final List cannedTextResponses) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onCannedTextResponsesLoaded(call, cannedTextResponses); + } + }); } } - private void fireVideoCallChanged(InCallService.VideoCall videoCall) { - for (Callback callback : mCallbacks) { - callback.onVideoCallChanged(this, videoCall); + private void fireVideoCallChanged(final InCallService.VideoCall videoCall) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onVideoCallChanged(call, videoCall); + } + }); } } - private void firePostDialWait(String remainingPostDialSequence) { - for (Callback callback : mCallbacks) { - callback.onPostDialWait(this, remainingPostDialSequence); + private void firePostDialWait(final String remainingPostDialSequence) { + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onPostDialWait(call, remainingPostDialSequence); + } + }); } } private void fireCallDestroyed() { - for (Callback callback : mCallbacks) { - callback.onCallDestroyed(this); + for (CallbackRecord record: mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onCallDestroyed(call); + } + }); } } private void fireConferenceableCallsChanged() { - for (Callback callback : mCallbacks) { - callback.onConferenceableCallsChanged(this, mUnmodifiableConferenceableCalls); + for (CallbackRecord record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onConferenceableCallsChanged(call, mUnmodifiableConferenceableCalls); + } + }); } } } -- cgit v1.1