diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java index a3fc6216d5..e49696679b 100644 --- a/framework/src/android/net/ConnectivityManager.java +++ b/framework/src/android/net/ConnectivityManager.java @@ -936,7 +936,17 @@ public class ConnectivityManager { private final Context mContext; - private final TetheringManager mTetheringManager; + @GuardedBy("mTetheringEventCallbacks") + private TetheringManager mTetheringManager; + + private TetheringManager getTetheringManager() { + synchronized (mTetheringEventCallbacks) { + if (mTetheringManager == null) { + mTetheringManager = mContext.getSystemService(TetheringManager.class); + } + return mTetheringManager; + } + } /** * Tests if a given integer represents a valid network type. @@ -2395,7 +2405,6 @@ public class ConnectivityManager { public ConnectivityManager(Context context, IConnectivityManager service) { mContext = Objects.requireNonNull(context, "missing context"); mService = Objects.requireNonNull(service, "missing IConnectivityManager"); - mTetheringManager = (TetheringManager) mContext.getSystemService(Context.TETHERING_SERVICE); sInstance = this; } @@ -2466,7 +2475,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetherableIfaces() { - return mTetheringManager.getTetherableIfaces(); + return getTetheringManager().getTetherableIfaces(); } /** @@ -2481,7 +2490,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetheredIfaces() { - return mTetheringManager.getTetheredIfaces(); + return getTetheringManager().getTetheredIfaces(); } /** @@ -2502,7 +2511,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetheringErroredIfaces() { - return mTetheringManager.getTetheringErroredIfaces(); + return getTetheringManager().getTetheringErroredIfaces(); } /** @@ -2546,7 +2555,7 @@ public class ConnectivityManager { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @Deprecated public int tether(String iface) { - return mTetheringManager.tether(iface); + return getTetheringManager().tether(iface); } /** @@ -2570,7 +2579,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public int untether(String iface) { - return mTetheringManager.untether(iface); + return getTetheringManager().untether(iface); } /** @@ -2596,7 +2605,7 @@ public class ConnectivityManager { @RequiresPermission(anyOf = {android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported() { - return mTetheringManager.isTetheringSupported(); + return getTetheringManager().isTetheringSupported(); } /** @@ -2689,7 +2698,7 @@ public class ConnectivityManager { final TetheringRequest request = new TetheringRequest.Builder(type) .setShouldShowEntitlementUi(showProvisioningUi).build(); - mTetheringManager.startTethering(request, executor, tetheringCallback); + getTetheringManager().startTethering(request, executor, tetheringCallback); } /** @@ -2708,7 +2717,7 @@ public class ConnectivityManager { @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int type) { - mTetheringManager.stopTethering(type); + getTetheringManager().stopTethering(type); } /** @@ -2766,7 +2775,7 @@ public class ConnectivityManager { synchronized (mTetheringEventCallbacks) { mTetheringEventCallbacks.put(callback, tetherCallback); - mTetheringManager.registerTetheringEventCallback(executor, tetherCallback); + getTetheringManager().registerTetheringEventCallback(executor, tetherCallback); } } @@ -2788,7 +2797,7 @@ public class ConnectivityManager { synchronized (mTetheringEventCallbacks) { final TetheringEventCallback tetherCallback = mTetheringEventCallbacks.remove(callback); - mTetheringManager.unregisterTetheringEventCallback(tetherCallback); + getTetheringManager().unregisterTetheringEventCallback(tetherCallback); } } @@ -2808,7 +2817,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetherableUsbRegexs() { - return mTetheringManager.getTetherableUsbRegexs(); + return getTetheringManager().getTetherableUsbRegexs(); } /** @@ -2826,7 +2835,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetherableWifiRegexs() { - return mTetheringManager.getTetherableWifiRegexs(); + return getTetheringManager().getTetherableWifiRegexs(); } /** @@ -2845,7 +2854,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public String[] getTetherableBluetoothRegexs() { - return mTetheringManager.getTetherableBluetoothRegexs(); + return getTetheringManager().getTetherableBluetoothRegexs(); } /** @@ -2869,7 +2878,7 @@ public class ConnectivityManager { @UnsupportedAppUsage @Deprecated public int setUsbTethering(boolean enable) { - return mTetheringManager.setUsbTethering(enable); + return getTetheringManager().setUsbTethering(enable); } /** @@ -2985,7 +2994,7 @@ public class ConnectivityManager { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @Deprecated public int getLastTetherError(String iface) { - int error = mTetheringManager.getLastTetherError(iface); + int error = getTetheringManager().getLastTetherError(iface); if (error == TetheringManager.TETHER_ERROR_UNKNOWN_TYPE) { // TETHER_ERROR_UNKNOWN_TYPE was introduced with TetheringManager and has never been // returned by ConnectivityManager. Convert it to the legacy TETHER_ERROR_UNKNOWN_IFACE @@ -3067,7 +3076,7 @@ public class ConnectivityManager { } }; - mTetheringManager.requestLatestTetheringEntitlementResult(type, wrappedListener, + getTetheringManager().requestLatestTetheringEntitlementResult(type, wrappedListener, showEntitlementUi); } @@ -4849,7 +4858,7 @@ public class ConnectivityManager { public void factoryReset() { try { mService.factoryReset(); - mTetheringManager.stopAllTethering(); + getTetheringManager().stopAllTethering(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }