summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yu-Han Yang <yuhany@google.com> 2025-03-20 20:11:18 +0000
committer Yu-Han Yang <yuhany@google.com> 2025-03-20 21:02:00 +0000
commit452d12b50af9972b4164e5a20d489e0bbd8aa417 (patch)
tree3e874ba614057a3c3f16ba1804a845227cb2d6a5
parent0800ef92e35529f09badfa88a102a1fe9dfc97ca (diff)
Avoid calling IPC with a lock
Bug: 355384257 Test: manual Flag: android.location.flags.fix_is_in_emergency_anr Change-Id: I5774b944ff682926790733d815487282eaf1450a
-rw-r--r--location/java/android/location/flags/location.aconfig10
-rw-r--r--services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java81
2 files changed, 71 insertions, 20 deletions
diff --git a/location/java/android/location/flags/location.aconfig b/location/java/android/location/flags/location.aconfig
index f26e72fa79f1..80fa6b7f9130 100644
--- a/location/java/android/location/flags/location.aconfig
+++ b/location/java/android/location/flags/location.aconfig
@@ -199,6 +199,16 @@ flag {
}
flag {
+ name: "fix_is_in_emergency_anr"
+ namespace: "location"
+ description: "Avoid calling IPC with a lock to avoid deadlock"
+ bug: "355384257"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "gnss_assistance_interface_jni"
namespace: "location"
description: "Flag for GNSS assistance interface JNI"
diff --git a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
index 3f75b11befc2..ea4b3d426346 100644
--- a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
+++ b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.location.flags.Flags;
import android.os.SystemClock;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
@@ -71,13 +72,25 @@ public class SystemEmergencyHelper extends EmergencyHelper {
return;
}
- synchronized (SystemEmergencyHelper.this) {
+ if (Flags.fixIsInEmergencyAnr()) {
try {
- mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber(
+ boolean isInEmergency = mTelephonyManager.isEmergencyNumber(
intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
+ synchronized (SystemEmergencyHelper.this) {
+ mIsInEmergencyCall = isInEmergency;
+ }
} catch (IllegalStateException | UnsupportedOperationException e) {
Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e);
}
+ } else {
+ synchronized (SystemEmergencyHelper.this) {
+ try {
+ mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber(
+ intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
+ } catch (IllegalStateException | UnsupportedOperationException e) {
+ Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e);
+ }
+ }
}
dispatchEmergencyStateChanged();
@@ -98,27 +111,55 @@ public class SystemEmergencyHelper extends EmergencyHelper {
}
@Override
- public synchronized boolean isInEmergency(long extensionTimeMs) {
- if (mTelephonyManager == null) {
- return false;
- }
+ public boolean isInEmergency(long extensionTimeMs) {
+ if (Flags.fixIsInEmergencyAnr()) {
+ if (mTelephonyManager == null) {
+ return false;
+ }
+ boolean emergencyCallbackMode = false;
+ boolean emergencySmsMode = false;
+ PackageManager pm = mContext.getPackageManager();
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
+ emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode();
+ }
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) {
+ emergencySmsMode = mTelephonyManager.isInEmergencySmsMode();
+ }
+ boolean isInExtensionTime;
+ synchronized (this) {
+ isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE
+ && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs)
+ < extensionTimeMs;
+ return mIsInEmergencyCall
+ || isInExtensionTime
+ || emergencyCallbackMode
+ || emergencySmsMode;
+ }
+ } else {
+ synchronized (this) {
+ if (mTelephonyManager == null) {
+ return false;
+ }
- boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE
- && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs;
+ boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE
+ && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs)
+ < extensionTimeMs;
- boolean emergencyCallbackMode = false;
- boolean emergencySmsMode = false;
- PackageManager pm = mContext.getPackageManager();
- if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
- emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode();
- }
- if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) {
- emergencySmsMode = mTelephonyManager.isInEmergencySmsMode();
+ boolean emergencyCallbackMode = false;
+ boolean emergencySmsMode = false;
+ PackageManager pm = mContext.getPackageManager();
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
+ emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode();
+ }
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) {
+ emergencySmsMode = mTelephonyManager.isInEmergencySmsMode();
+ }
+ return mIsInEmergencyCall
+ || isInExtensionTime
+ || emergencyCallbackMode
+ || emergencySmsMode;
+ }
}
- return mIsInEmergencyCall
- || isInExtensionTime
- || emergencyCallbackMode
- || emergencySmsMode;
}
private class EmergencyCallTelephonyCallback extends TelephonyCallback implements