Fixed race condition while powering down

Made sure powerOffRadioSafely is also run in the main thread
so that it can access DataNetworkController without synchronization.

Fix: 378616116
Test: atest FrameworksTelephonyTests
Test: Manuall power down the device on Pixel 7
Flag: com.android.internal.telephony.flags.power_down_race_fix
Change-Id: Ic645fb9cb324a31274e9dce4a6797694ce996cc8
diff --git a/flags/misc.aconfig b/flags/misc.aconfig
index 303c0ff..03d1f4e 100644
--- a/flags/misc.aconfig
+++ b/flags/misc.aconfig
@@ -220,3 +220,13 @@
     }
 }
 
+# OWNER=jackyu TARGET=25Q2
+flag {
+    name: "power_down_race_fix"
+    namespace: "telephony"
+    description: "Fixed race condition while powering down"
+    bug:"378616116"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index a91000e..6a6e4d0 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -1893,8 +1893,15 @@
     @Override
     public void setRadioPowerForReason(boolean power, boolean forEmergencyCall,
             boolean isSelectedPhoneForEmergencyCall, boolean forceApply, int reason) {
-        mSST.setRadioPowerForReason(power, forEmergencyCall, isSelectedPhoneForEmergencyCall,
-                forceApply, reason);
+        if (mFeatureFlags.powerDownRaceFix()) {
+            // setRadioPowerForReason can be called by the binder thread. We need to move that into
+            // the main thread to prevent race condition.
+            post(() -> mSST.setRadioPowerForReason(power, forEmergencyCall,
+                    isSelectedPhoneForEmergencyCall, forceApply, reason));
+        } else {
+            mSST.setRadioPowerForReason(power, forEmergencyCall, isSelectedPhoneForEmergencyCall,
+                    forceApply, reason);
+        }
     }
 
     @Override