Call onPhoneDestroyed when the service is unbound.
Bug: 17253031 Change-Id: I1a74e0f2fe1ec9172268638dba531c17d22dee99
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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}.
|
||||
*
|
||||
|
||||
@@ -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}.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user