From 95d85a0742e9277512a677efa30261b8f8181253 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 20 Apr 2020 14:38:23 +0800 Subject: [PATCH] [Settings] Avoid from EUICC access blocking main thread Avoid from EUICC accessing form main thread and timeout if API takes too much time. Bug: 143996139 Test: manual Merged-In: Ic1a2bd948b69d40632555d293df6ed56a6b7a712 Change-Id: Ia2a15ee43ce2b49b90c8d0626aee939c536aea56 --- .../network/telephony/MobileNetworkUtils.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java index a472fd8adc1..777a1bc9002 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -29,6 +29,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.PersistableBundle; +import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Settings; import android.telecom.PhoneAccountHandle; @@ -60,9 +61,12 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.graph.SignalDrawable; +import com.android.settingslib.utils.ThreadUtils; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class MobileNetworkUtils { @@ -290,6 +294,18 @@ public class MobileNetworkUtils { * the user has enabled development mode. */ public static boolean showEuiccSettings(Context context) { + long timeForAccess = SystemClock.elapsedRealtime(); + try { + return ((Future) ThreadUtils.postOnBackgroundThread(() + -> showEuiccSettingsDetecting(context))).get(); + } catch (ExecutionException | InterruptedException exception) { + timeForAccess = SystemClock.elapsedRealtime() - timeForAccess; + Log.w(TAG, "Accessing Euicc takes too long: +" + timeForAccess + "ms"); + } + return false; + } + + private static Boolean showEuiccSettingsDetecting(Context context) { final EuiccManager euiccManager = (EuiccManager) context.getSystemService(EuiccManager.class); if (!euiccManager.isEnabled()) {