Call onPhoneDestroyed when the service is unbound.

Bug: 17253031
Change-Id: I1a74e0f2fe1ec9172268638dba531c17d22dee99
This commit is contained in:
Santos Cordon
2014-08-26 09:54:33 -07:00
parent 2cd88d7512
commit f30d7e9a8e
3 changed files with 33 additions and 2 deletions

View File

@@ -743,6 +743,16 @@ public final class Call {
fireStartActivity(intent);
}
/** {@hide} */
final void internalSetDisconnected() {
if (mState != Call.STATE_DISCONNECTED) {
mState = Call.STATE_DISCONNECTED;
fireStateChanged(mState);
fireCallDestroyed();
mPhone.internalRemoveCall(this);
}
}
private void fireStateChanged(int newState) {
for (Listener listener : mListeners) {
listener.onStateChanged(this, newState);

View File

@@ -163,6 +163,16 @@ public abstract class InCallService extends Service {
return new InCallServiceBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Phone oldPhone = mPhone;
mPhone = null;
oldPhone.destroy();
onPhoneDestroyed(oldPhone);
return false;
}
/**
* Obtain the {@code Phone} associated with this {@code InCallService}.
*

View File

@@ -20,7 +20,6 @@ import android.annotation.SystemApi;
import android.app.PendingIntent;
import android.util.ArrayMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -83,7 +82,7 @@ public final class Phone {
// A List allows us to keep the Calls in a stable iteration order so that casually developed
// user interface components do not incur any spurious jank
private final List<Call> mCalls = new ArrayList<>();
private final List<Call> mCalls = new CopyOnWriteArrayList<>();
// An unmodifiable view of the above List can be safely shared with subclass implementations
private final List<Call> mUnmodifiableCalls = Collections.unmodifiableList(mCalls);
@@ -159,6 +158,18 @@ public final class Phone {
}
}
/**
* Called to destroy the phone and cleanup any lingering calls.
* @hide
*/
final void destroy() {
for (Call call : mCalls) {
if (call.getState() != Call.STATE_DISCONNECTED) {
call.internalSetDisconnected();
}
}
}
/**
* Adds a listener to this {@code Phone}.
*