From 23ed0b2c34475267931e6256b420d885b3014f48 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 Change-Id: Ic1a2bd948b69d40632555d293df6ed56a6b7a712 --- .../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 25cd2727a44..3b5e6e04726 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -42,6 +42,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; @@ -70,9 +71,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 { @@ -242,6 +246,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()) {