diff --git a/api/module-lib-current.txt b/api/module-lib-current.txt index 6863221f7fda3..1b41915b95f34 100644 --- a/api/module-lib-current.txt +++ b/api/module-lib-current.txt @@ -47,6 +47,7 @@ package android.net { method @NonNull public String[] getTetheredIfaces(); method @NonNull public String[] getTetheringErroredIfaces(); method public boolean isTetheringSupported(); + method public boolean isTetheringSupported(@NonNull String); method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean); diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java b/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java index fd9f7137c85dc..79242c5da329f 100644 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java +++ b/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java @@ -1131,6 +1131,25 @@ public class TetheringManager { public boolean isTetheringSupported() { final String callerPkg = mContext.getOpPackageName(); + return isTetheringSupported(callerPkg); + } + + /** + * Check if the device allows for tethering. It may be disabled via {@code ro.tether.denied} + * system property, Settings.TETHER_SUPPORTED or due to device configuration. This is useful + * for system components that query this API on behalf of an app. In particular, Bluetooth + * has @UnsupportedAppUsage calls that will let apps turn on bluetooth tethering if they have + * the right permissions, but such an app needs to know whether it can (permissions as well + * as support from the device) turn on tethering in the first place to show the appropriate UI. + * + * @param callerPkg The caller package name, if it is not matching the calling uid, + * SecurityException would be thrown. + * @return a boolean - {@code true} indicating Tethering is supported. + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public boolean isTetheringSupported(@NonNull final String callerPkg) { + final RequestDispatcher dispatcher = new RequestDispatcher(); final int ret = dispatcher.waitForResult((connector, listener) -> { try {