Loading location/java/android/location/flags/location.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,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" Loading services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +61 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -71,6 +72,17 @@ public class SystemEmergencyHelper extends EmergencyHelper { return; } if (Flags.fixIsInEmergencyAnr()) { try { 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( Loading @@ -79,6 +91,7 @@ public class SystemEmergencyHelper extends EmergencyHelper { Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e); } } } dispatchEmergencyStateChanged(); } Loading @@ -98,13 +111,39 @@ public class SystemEmergencyHelper extends EmergencyHelper { } @Override public synchronized boolean isInEmergency(long extensionTimeMs) { 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; && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs; boolean emergencyCallbackMode = false; boolean emergencySmsMode = false; Loading @@ -120,6 +159,8 @@ public class SystemEmergencyHelper extends EmergencyHelper { || emergencyCallbackMode || emergencySmsMode; } } } private class EmergencyCallTelephonyCallback extends TelephonyCallback implements TelephonyCallback.CallStateListener{ Loading Loading
location/java/android/location/flags/location.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,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" Loading
services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +61 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -71,6 +72,17 @@ public class SystemEmergencyHelper extends EmergencyHelper { return; } if (Flags.fixIsInEmergencyAnr()) { try { 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( Loading @@ -79,6 +91,7 @@ public class SystemEmergencyHelper extends EmergencyHelper { Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e); } } } dispatchEmergencyStateChanged(); } Loading @@ -98,13 +111,39 @@ public class SystemEmergencyHelper extends EmergencyHelper { } @Override public synchronized boolean isInEmergency(long extensionTimeMs) { 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; && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs; boolean emergencyCallbackMode = false; boolean emergencySmsMode = false; Loading @@ -120,6 +159,8 @@ public class SystemEmergencyHelper extends EmergencyHelper { || emergencyCallbackMode || emergencySmsMode; } } } private class EmergencyCallTelephonyCallback extends TelephonyCallback implements TelephonyCallback.CallStateListener{ Loading