Merge Android 24Q1 Release (ab/11220357)

Bug: 319669529
Merged-In: I874715e2e0843427fbefe33343fbe2ab2b22dd9c
Change-Id: I2a231ba9b6917dca40119ccfe93249abf719d3cc
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index b5a1168..c9252f2 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -75,6 +75,7 @@
 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 @@
             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 7ae66b5..a628946 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -37,6 +37,8 @@
         "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 ad5051b..9e206b7 100644
--- a/tests/src/com/android/ims/ImsManagerTest.java
+++ b/tests/src/com/android/ims/ImsManagerTest.java
@@ -23,11 +23,15 @@
 
 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.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.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 @@
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(
                         "android.permission.READ_PRIVILEGED_PHONE_STATE");
+
+        mSetFlagsRule.initAllFlagsToReleaseConfigDefault();
     }
 
     @After
@@ -1020,6 +1031,25 @@
         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 ->  {