From 9c5bc56df10017649974a562c860f6831e170e28 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 24 May 2022 10:33:59 +0000 Subject: [PATCH] Wrap TelephonyCallback in nested class to avoid class loading issues. PiperOrigin-RevId: 450643824 --- .../exoplayer2/util/NetworkTypeObserver.java | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java index 457121abf1..9d24d0d93e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java @@ -215,34 +215,49 @@ public final class NetworkTypeObserver { @C.NetworkType int networkType = getNetworkTypeFromConnectivityManager(context); if (Util.SDK_INT >= 31 && networkType == C.NETWORK_TYPE_4G) { // Delay update of the network type to check whether this is actually 5G-NSA. - try { - TelephonyManager telephonyManager = - checkNotNull((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)); - DisplayInfoCallback callback = new DisplayInfoCallback(); - telephonyManager.registerTelephonyCallback(context.getMainExecutor(), callback); - // We are only interested in the initial response with the current state, so unregister - // the listener immediately. - telephonyManager.unregisterTelephonyCallback(callback); - return; - } catch (RuntimeException e) { - // Ignore problems with listener registration and keep reporting as 4G. - } + Api31.disambiguate4gAnd5gNsa(context, /* instance= */ NetworkTypeObserver.this); + } else { + updateNetworkType(networkType); } - updateNetworkType(networkType); } } @RequiresApi(31) - private final class DisplayInfoCallback extends TelephonyCallback implements DisplayInfoListener { + private static final class Api31 { - @Override - public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) { - int overrideNetworkType = telephonyDisplayInfo.getOverrideNetworkType(); - boolean is5gNsa = - overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA - || overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE - || overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED; - updateNetworkType(is5gNsa ? C.NETWORK_TYPE_5G_NSA : C.NETWORK_TYPE_4G); + public static void disambiguate4gAnd5gNsa(Context context, NetworkTypeObserver instance) { + try { + TelephonyManager telephonyManager = + checkNotNull((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)); + DisplayInfoCallback callback = new DisplayInfoCallback(instance); + telephonyManager.registerTelephonyCallback(context.getMainExecutor(), callback); + // We are only interested in the initial response with the current state, so unregister + // the listener immediately. + telephonyManager.unregisterTelephonyCallback(callback); + } catch (RuntimeException e) { + // Ignore problems with listener registration and keep reporting as 4G. + instance.updateNetworkType(C.NETWORK_TYPE_4G); + } + } + + private static final class DisplayInfoCallback extends TelephonyCallback + implements DisplayInfoListener { + + private final NetworkTypeObserver instance; + + public DisplayInfoCallback(NetworkTypeObserver instance) { + this.instance = instance; + } + + @Override + public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) { + int overrideNetworkType = telephonyDisplayInfo.getOverrideNetworkType(); + boolean is5gNsa = + overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA + || overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE + || overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED; + instance.updateNetworkType(is5gNsa ? C.NETWORK_TYPE_5G_NSA : C.NETWORK_TYPE_4G); + } } } }