基于Android S 代码:http://aospxref.com/android-13.0.0_r3/
界面代码:http://aospxref.com/android-13.0.0_r3/xref/packages/apps/Settings/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java#onSwitchChanged
onSwitchChanged —> startTether()
void startTether() {
if (isWifiApActivated()) return;
mSwitchBar.setEnabled(false);
mConnectivityManager.startTethering(TETHERING_WIFI, true /* showProvisioningUi */, ---> 继续看
mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
}
http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java#2892
public void startTethering(int type, boolean showProvisioningUi,
final OnStartTetheringCallback callback, Handler handler) {
Objects.requireNonNull(callback, "OnStartTetheringCallback cannot be null.");
// 创建一个执行器,用于在合适的线程上执行回调任务
final Executor executor = new Executor() {
@Override
public void execute(Runnable command) {
if (handler == null) {
// 如果没有传入 Handler,则直接运行任务
command.run();
} else {
// 如果传入了 Handler,则在主线程上执行任务
handler.post(command);
}
}
};
// 创建一个 StartTetheringCallback 对象,用于接收启动网络共享的回调事件
final StartTetheringCallback tetheringCallback = new StartTetheringCallback() {
@Override
public void onTetheringStarted() {
// 当网络共享启动时,调用传入的回调对象的相应方法
callback.onTetheringStarted();
}
@Override
public void onTetheringFailed(final int error) {
// 当网络共享启动失败时,调用传入的回调对象的相应方法
callback.onTetheringFailed();
}
};
// 构建一个 TetheringRequest 对象,用于描述网络共享的请求参数
final TetheringRequest request = new TetheringRequest.Builder(type)
.setShouldShowEntitlementUi(showProvisioningUi).build();
// 获取 TetheringManager 对象,并调用其 startTethering() 方法启动网络共享
getTetheringManager().startTethering(request, executor, tetheringCallback);
}
/packages/modules/Connectivity/Tethering/common/TetheringLib/src/android/net/TetheringManager.java
public void startTethering(@NonNull final TetheringRequest request,
@NonNull final Executor executor, @NonNull final StartTetheringCallback callback) {
final String callerPkg = mContext.getOpPackageName();
Log.i(TAG, "startTethering caller:" + callerPkg);
final IIntResultListener listener = new IIntResultListener.Stub() {
@Override
public void onResult(final int resultCode) {
executor.execute(() -> {
if (resultCode == TETHER_ERROR_NO_ERROR) {
callback.onTetheringStarted();
} else {
callback.onTetheringFailed(resultCode);
}
});
}
};
getConnector(c -> c.startTethering(request.getParcel(), callerPkg,
getAttributionTag(), listener));
}
http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/TetheringService.java#startTethering
然后调用到:http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/Tethering.java#startTethering
void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) {
mHandler.post(() -> {
final TetheringRequestParcel unfinishedRequest = mActiveTetheringRequests.get(
request.tetheringType);
// If tethering is already enabled with a different request,
// disable before re-enabling.
if (unfinishedRequest != null
&& !TetheringUtils.isTetheringRequestEquals(unfinishedRequest, request)) {
enableTetheringInternal(request.tetheringType, false /* disabled */, null);
mEntitlementMgr.stopProvisioningIfNeeded(request.tetheringType);
}
mActiveTetheringRequests.put(request.tetheringType, request);
if (request.exemptFromEntitlementCheck<

最低0.47元/天 解锁文章
815

被折叠的 条评论
为什么被折叠?



