diff options
author | Brian Orr <brianorr@google.com> | 2021-08-11 19:11:45 +0000 |
---|---|---|
committer | Brian Orr <brianorr@google.com> | 2021-08-11 23:59:25 +0000 |
commit | ab1e0271287465c071b9b6ba89e6845fd7161063 (patch) | |
tree | 642e46e0ca778bf77b958c4973aaa8f6e030740e /telephony/java/android | |
parent | b6bd2054b05bb47779c041675f34828517288d73 (diff) | |
parent | 1cb4fdb115b920ff5df88c33047243bef48224a6 (diff) |
Merge SP1A.210811.001
Change-Id: I5aa7cf27a3a3cc16830c9947a826e30a0da481c4
Diffstat (limited to 'telephony/java/android')
-rw-r--r-- | telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java | 4 | ||||
-rw-r--r-- | telephony/java/android/telephony/ims/stub/SipTransportImplBase.java | 46 |
2 files changed, 44 insertions, 6 deletions
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java index c18ab33eb2c9..f0048248a5cc 100644 --- a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java +++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java @@ -193,6 +193,10 @@ public class SipDelegateAidlWrapper implements DelegateStateCallback, DelegateMe return mDelegateBinder; } + public ISipDelegateStateCallback getStateCallbackBinder() { + return mStateBinder; + } + private void notifyLocalMessageFailedToBeReceived(SipMessage m, int reason) { String transactionId = m.getViaBranchParameter(); SipDelegate d = mDelegate; diff --git a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java index 1f74c09af0f6..13ea99735ab4 100644 --- a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java +++ b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java @@ -21,6 +21,7 @@ import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.os.Binder; import android.os.IBinder; +import android.os.RemoteException; import android.telephony.ims.DelegateMessageCallback; import android.telephony.ims.DelegateRequest; import android.telephony.ims.DelegateStateCallback; @@ -33,6 +34,7 @@ import android.telephony.ims.aidl.SipDelegateAidlWrapper; import android.util.Log; import java.util.ArrayList; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.concurrent.Executor; @@ -49,10 +51,15 @@ import java.util.concurrent.Executor; public class SipTransportImplBase { private static final String LOG_TAG = "SipTransportIB"; - private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { + private final IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { - mBinderExecutor.execute(() -> binderDiedInternal()); + // Clean up all binders in this case. + mBinderExecutor.execute(() -> binderDiedInternal(null)); + } + @Override + public void binderDied(IBinder who) { + mBinderExecutor.execute(() -> binderDiedInternal(who)); } }; @@ -142,6 +149,7 @@ public class SipTransportImplBase { ISipDelegateStateCallback cb, ISipDelegateMessageCallback mc) { SipDelegateAidlWrapper wrapper = new SipDelegateAidlWrapper(mBinderExecutor, cb, mc); mDelegates.add(wrapper); + linkDeathRecipient(wrapper); createSipDelegate(subId, r, wrapper, wrapper); } @@ -155,6 +163,7 @@ public class SipTransportImplBase { } if (result != null) { + unlinkDeathRecipient(result); mDelegates.remove(result); destroySipDelegate(result.getDelegate(), reason); } else { @@ -163,12 +172,37 @@ public class SipTransportImplBase { } } - private void binderDiedInternal() { + private void linkDeathRecipient(SipDelegateAidlWrapper w) { + try { + w.getStateCallbackBinder().asBinder().linkToDeath(mDeathRecipient, 0); + } catch (RemoteException e) { + Log.w(LOG_TAG, "linkDeathRecipient, remote process already died, cleaning up."); + mDeathRecipient.binderDied(w.getStateCallbackBinder().asBinder()); + } + } + + private void unlinkDeathRecipient(SipDelegateAidlWrapper w) { + try { + w.getStateCallbackBinder().asBinder().unlinkToDeath(mDeathRecipient, 0); + } catch (NoSuchElementException e) { + // Ignore this case. + } + } + + private void binderDiedInternal(IBinder who) { for (SipDelegateAidlWrapper w : mDelegates) { - destroySipDelegate(w.getDelegate(), - SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD); + // If the binder itself was not given from the platform, just clean up all binders. + if (who == null || w.getStateCallbackBinder().asBinder().equals(who)) { + Log.w(LOG_TAG, "Binder death detected for " + w + ", calling destroy and " + + "removing."); + mDelegates.remove(w); + destroySipDelegate(w.getDelegate(), + SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD); + return; + } } - mDelegates.clear(); + Log.w(LOG_TAG, "Binder death detected for IBinder " + who + ", but couldn't find matching " + + "SipDelegate"); } /** |