From cf934c17f21e60b15f6baa20da589aba8c54bda6 Mon Sep 17 00:00:00 2001 From: joonhunshin Date: Fri, 13 Oct 2023 02:28:54 +0000 Subject: Throw the ImsException when registering listener failed If registering listener failed, set session closed flag to block other operations. Bug: 289461637 Bug: 304441595 Test: atest ImsManagerTest Test: received test result from partner Change-Id: I874715e2e0843427fbefe33343fbe2ab2b22dd9c --- src/java/com/android/ims/ImsManager.java | 10 ++++++++ tests/Android.bp | 2 ++ tests/src/com/android/ims/ImsManagerTest.java | 34 +++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java index b5a1168b..c9252f24 100644 --- a/src/java/com/android/ims/ImsManager.java +++ b/src/java/com/android/ims/ImsManager.java @@ -75,6 +75,7 @@ import android.util.SparseArray; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsServiceFeatureCallback; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.ITelephony; import com.android.telephony.Rlog; @@ -2450,6 +2451,15 @@ public class ImsManager implements FeatureUpdates { call.attachSession(new ImsCallSession(session)); call.setListener(listener); + if (Flags.ignoreAlreadyTerminatedIncomingCallBeforeRegisteringListener()){ + // If the call session already terminated before registering callback then the + // framework should ignore incoming call. + if (!ImsCall.isSessionAlive(call.getSession())) { + loge("takeCall : ImsCallSession is not alive"); + throw new ImsException("takeCall() : ImsCallSession is not alive", + ImsReasonInfo.CODE_UNSPECIFIED); + } + } return call; } catch (Throwable t) { loge("takeCall caught: ", t); diff --git a/tests/Android.bp b/tests/Android.bp index 7ae66b56..a628946a 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -37,6 +37,8 @@ android_test { "androidx.test.ext.junit", "androidx.test.rules", "mockito-target-minus-junit4", + "telephony_flags_core_java_lib", + "flag-junit", ], test_suites: [ diff --git a/tests/src/com/android/ims/ImsManagerTest.java b/tests/src/com/android/ims/ImsManagerTest.java index ad5051be..9e206b78 100644 --- a/tests/src/com/android/ims/ImsManagerTest.java +++ b/tests/src/com/android/ims/ImsManagerTest.java @@ -23,11 +23,15 @@ import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TE import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -38,11 +42,11 @@ import android.content.res.Resources; import android.os.IBinder; import android.os.PersistableBundle; import android.os.RemoteException; +import android.platform.test.flag.junit.SetFlagsRule; import android.telephony.BinderCacheManager; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsMmTelManager; -import android.telephony.ims.ImsRcsManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsRegistration; @@ -56,20 +60,25 @@ import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.ims.internal.IImsCallSession; import com.android.internal.os.SomeArgs; import com.android.internal.telephony.ITelephony; +import com.android.internal.telephony.flags.Flags; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import java.util.Hashtable; -import java.util.concurrent.Executor; @RunWith(AndroidJUnit4.class) public class ImsManagerTest extends ImsTestBase { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private static final boolean ENHANCED_4G_MODE_DEFAULT_VAL = true; private static final boolean ENHANCED_4G_MODE_EDITABLE = true; private static final boolean WFC_IMS_ENABLE_DEFAULT_VAL = false; @@ -131,6 +140,8 @@ public class ImsManagerTest extends ImsTestBase { InstrumentationRegistry.getInstrumentation().getUiAutomation() .adoptShellPermissionIdentity( "android.permission.READ_PRIVILEGED_PHONE_STATE"); + + mSetFlagsRule.initAllFlagsToReleaseConfigDefault(); } @After @@ -1020,6 +1031,25 @@ public class ImsManagerTest extends ImsTestBase { verify(mMmTelFeatureConnection).onMemoryAvailable(eq(token)); } + @Test @SmallTest + public void testTakeCall_incomingSessionTerminatedBeforeRegisterListener() + throws RemoteException { + mSetFlagsRule.enableFlags( + Flags.FLAG_IGNORE_ALREADY_TERMINATED_INCOMING_CALL_BEFORE_REGISTERING_LISTENER); + + IImsCallSession mockSession = mock(IImsCallSession.class); + doThrow(RemoteException.class).when(mockSession).setListener(any()); + ImsCall.Listener mockListener = mock(ImsCall.Listener.class); + + ImsManager imsManager = getImsManagerAndInitProvisionedValues(); + try { + imsManager.takeCall(mockSession, mockListener); + fail("expect ImsException"); + } catch (ImsException e) { + // expected result + } + } + private ImsManager getImsManagerAndInitProvisionedValues() { when(mImsConfigImplBaseMock.getConfigInt(anyInt())) .thenAnswer(invocation -> { -- cgit v1.2.3