Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c804f20 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Avoid calling IPC with a lock" into main

parents c0539870 452d12b5
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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"
+61 −20
Original line number Diff line number Diff line
@@ -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,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(
@@ -79,6 +91,7 @@ public class SystemEmergencyHelper extends EmergencyHelper {
                            Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e);
                        }
                    }
                }

                dispatchEmergencyStateChanged();
            }
@@ -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;
@@ -120,6 +159,8 @@ public class SystemEmergencyHelper extends EmergencyHelper {
                        || emergencyCallbackMode
                        || emergencySmsMode;
            }
        }
    }

    private class EmergencyCallTelephonyCallback extends TelephonyCallback implements
            TelephonyCallback.CallStateListener{