In Android set-top box products, the relationship between Ethernet and WiFi is as follows:
1. Both Ethernet and WiFi STA can connect to the router to access the external network;
2. The WiFi AP function can share Ethernet access to the external network.
This document addresses the change in point 2, implementing the sharing of WiFi STA access to the external network via Ethernet, and on this basis, it can also share 4G/5G networks (if the device supports it). Below are the code modifications involved in implementing the corresponding functionality (taking RK3399 Android 7 as an example):
1. Modify frameworks
1) Modify the device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml file as follows:
--- a/device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml+++ b/device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml@@ -140,6 +140,10 @@ <item>"bt-pan"</item> </string-array>+ <string-array translatable="false" name="config_tether_ethernet_regexs">+ <item>"eth0"</item>+ </string-array>+ <!-- Array of allowable ConnectivityManager network types for tethering -->
2) Modify the frameworks/base/api/system-current.txt file as follows:
--- a/frameworks/base/api/system-current.txt+++ b/frameworks/base/api/system-current.txt@@ -25479,6 +25479,7 @@ package android.net { field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3 field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2 field public static final int TETHERING_BLUETOOTH = 2; // 0x2+ field public static final int TETHERING_ETHERNET = 3; // 0x3 field public static final int TETHERING_USB = 1; // 0x1
3) Modify the frameworks/base/core/java/android/net/ConnectivityManager.java file as follows:
--- a/frameworks/base/core/java/android/net/ConnectivityManager.java+++ b/frameworks/base/core/java/android/net/ConnectivityManager.java@@ -396,6 +396,14 @@ public class ConnectivityManager { @SystemApi public static final int TETHERING_BLUETOOTH = 2;+ /**+ * Ethernet tethering type.+ * @see #startTethering(int, OnStartTetheringCallback, boolean)+ * @hide+ */+ @SystemApi+ public static final int TETHERING_ETHERNET = 3;+ /** * Extra used for communicating with the TetherService. Includes the type of tethering to * enable if any.@@ -2190,6 +2202,26 @@ public class ConnectivityManager { } }+ /**+ * Get the list of regular expressions that define any tetherable+ * Ethernet network interfaces. If Ethernet tethering is not supported by the+ * device, this list should be empty.+ * <p>This method requires the caller to hold the permission+ * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.+ *+ * @return an array of 0 or more regular expression Strings defining+ * what interfaces are considered tetherable Ethernet interfaces.+ *+ * {@hide}+ */+ public String[] getTetherableEthernetRegexs() {+ try {+ return mService.getTetherableEthernetRegexs();+ } catch (RemoteException e) {+ throw e.rethrowFromSystemServer();+ }+ }+ /** * Attempt to both alter the mode of USB and Tethering of USB. A * utility method to deal with some of the complexity of USB - will
4) Modify the frameworks/base/core/java/android/net/EthernetManager.java file as follows:
--- a/frameworks/base/core/java/android/net/EthernetManager.java+++ b/frameworks/base/core/java/android/net/EthernetManager.java@@ -235,6 +235,22 @@ public class EthernetManager { } }+ public void start() {+ try {+ mService.start();+ } catch (RemoteException e) {+ throw e.rethrowFromSystemServer();+ }+ }++ public void stop() {+ try {+ mService.stop();+ } catch (RemoteException e) {+ throw e.rethrowFromSystemServer();+ }+ }+ /** * Adds a listener. * @param listener A {@link Listener} to add.
5) Modify the frameworks/base/core/java/android/net/IConnectivityManager.aidl file as follows:
--- a/frameworks/base/core/java/android/net/IConnectivityManager.aidl+++ b/frameworks/base/core/java/android/net/IConnectivityManager.aidl@@ -95,6 +95,8 @@ interface IConnectivityManager String[] getTetherableBluetoothRegexs();+ String[] getTetherableEthernetRegexs();+ int setUsbTethering(boolean enable);
6) Modify the frameworks/base/core/java/android/net/IEthernetManager.aidl file as follows:
--- a/frameworks/base/core/java/android/net/IEthernetManager.aidl+++ b/frameworks/base/core/java/android/net/IEthernetManager.aidl@@ -27,6 +27,8 @@ import android.net.IEthernetServiceListener; interface IEthernetManager { IpConfiguration getConfiguration();+ void start();+ void stop(); void setConfiguration(in IpConfiguration config); boolean isAvailable(); int getEthernetCarrierState(String ifname);
7) Modify the frameworks/base/core/java/android/provider/Settings.java file as follows:
--- a/frameworks/base/core/java/android/provider/Settings.java+++ b/frameworks/base/core/java/android/provider/Settings.java@@ -3282,6 +3282,13 @@ public final class Settings { public static final Validator HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY_VALIDATOR = sBooleanValidator;+ /**+ * Ethernet Tethering ON/OFF state+ *+ * @hide+ */+ public static final String ETHERNET_TETHERING_STATE = "ethernet_tethering_state";+ /** * screenshot location. *
8) Modify the frameworks/base/core/res/res/values/config.xml file as follows:
--- a/frameworks/base/core/res/res/values/config.xml+++ b/frameworks/base/core/res/res/values/config.xml@@ -306,6 +306,9 @@ <item>"bt-pan"</item> </string-array>+ <string-array translatable="false" name="config_tether_ethernet_regexs">+ </string-array>+ <!-- Max number of Bluetooth tethering connections allowed. If this is updated config_tether_dhcp_range has to be updated appropriately. -->
9) Modify the frameworks/base/core/res/res/values/symbols.xml file as follows:
--- a/frameworks/base/core/res/res/values/symbols.xml+++ b/frameworks/base/core/res/res/values/symbols.xml@@ -1663,6 +1663,7 @@ <java-symbol type="array" name="config_protectedNetworks" /> <java-symbol type="array" name="config_statusBarIcons" /> <java-symbol type="array" name="config_tether_bluetooth_regexs" />+ <java-symbol type="array" name="config_tether_ethernet_regexs" /> <java-symbol type="array" name="config_tether_dhcp_range" /> <java-symbol type="array" name="config_tether_upstream_types" />
10) Modify the frameworks/base/packages/SettingsProvider/res/values/defaults.xml file as follows:
--- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml+++ b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml@@ -22,6 +22,7 @@ <integer name="def_sleep_timeout">-1</integer> <bool name="def_airplane_mode_on">false</bool> <bool name="def_theater_mode_on">false</bool>+ <integer name="def_ethernet_tethering_state">0</integer> <!-- Comma-separated list of bluetooth, wifi, and cell. --> <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string> <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfc</string>
11) Modify the frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java file as follows:
--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java@@ -2401,6 +2401,9 @@ class DatabaseHelper extends SQLiteOpenHelper { loadIntegerSetting(stmt, Settings.System.SCREENSHOT_BUTTON_SHOW, R.integer.def_screenshot_button_show);+ loadIntegerSetting(stmt, Settings.System.ETHERNET_TETHERING_STATE,+ R.integer.def_ethernet_tethering_state);+ loadBooleanSetting(stmt, Settings.System.HIDEBAR_BUTTON_SHOW, R.bool.def_hidebar_button_show);
12) Modify the frameworks/base/services/core/java/com/android/server/ConnectivityService.java file as follows:
--- a/frameworks/base/services/core/java/com/android/server/ConnectivityService.java+++ b/frameworks/base/services/core/java/com/android/server/ConnectivityService.java@@ -3076,6 +3076,16 @@ public class ConnectivityService extends IConnectivityManager.Stub } }+ @Override+ public String[] getTetherableEthernetRegexs() {+ enforceTetherAccessPermission();+ if (isTetheringSupported()) {+ return mTethering.getTetherableEthernetRegexs();+ } else {+ return new String[0];+ }+ }+ @Override public int setUsbTethering(boolean enable) { ConnectivityManager.enforceTetherChangePermission(mContext);@@ -3125,7 +3135,8 @@ public class ConnectivityService extends IConnectivityManager.Stub return tetherEnabledInSettings && mUserManager.isAdminUser() && ((mTethering.getTetherableUsbRegexs().length != 0 || mTethering.getTetherableWifiRegexs().length != 0 ||- mTethering.getTetherableBluetoothRegexs().length != 0) &&+ mTethering.getTetherableBluetoothRegexs().length != 0 ||+ mTethering.getTetherableEthernetRegexs().length != 0) && mTethering.getUpstreamIfaceTypes().length != 0); }
13) Modify the frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java file as follows:
--- a/frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java+++ b/frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java@@ -61,6 +61,7 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; import android.util.SparseArray;+import android.net.EthernetManager; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.TelephonyIntents;@@ -110,6 +111,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private String[] mTetherableUsbRegexs; private String[] mTetherableWifiRegexs; private String[] mTetherableBluetoothRegexs;+ private String[] mTetherableEthernetRegexs;+ private Collection<Integer> mUpstreamIfaceTypes; // used to synchronize public access to members@@ -152,6 +155,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering // BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1 // with 255.255.255.0 // P2P is 192.168.49.1 and 255.255.255.0+ // Ethernet is 192.168.50.1 and 255.255.255.0 private String[] mDhcpRange; private static final String[] DHCP_DEFAULT_RANGE = {@@ -159,6 +163,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254", "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254", "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254",+ "192.168.50.2", "192.168.50.254", }; private String[] mDefaultDnsServers;@@ -239,6 +244,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering com.android.internal.R.array.config_tether_wifi_regexs); String[] tetherableBluetoothRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_bluetooth_regexs);+ String[] tetherableEthernetRegexs = mContext.getResources().getStringArray(+ com.android.internal.R.array.config_tether_ethernet_regexs); int ifaceTypes[] = mContext.getResources().getIntArray( com.android.internal.R.array.config_tether_upstream_types);@@ -251,6 +258,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mTetherableUsbRegexs = tetherableUsbRegexs; mTetherableWifiRegexs = tetherableWifiRegexs; mTetherableBluetoothRegexs = tetherableBluetoothRegexs;+ mTetherableEthernetRegexs = tetherableEthernetRegexs;+ mUpstreamIfaceTypes = upstreamIfaceTypes; }@@ -322,6 +331,15 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } }+ private boolean isEthernet(String iface) {+ synchronized (mPublicSync) {+ for (String regex : mTetherableEthernetRegexs) {+ if (iface.matches(regex)) return true;+ }+ return false;+ }+ }+ private int ifaceNameToType(String iface) { if (isWifi(iface)) { return ConnectivityManager.TETHERING_WIFI;@@ -329,6 +347,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering return ConnectivityManager.TETHERING_USB; } else if (isBluetooth(iface)) { return ConnectivityManager.TETHERING_BLUETOOTH;+ } else if (isEthernet(iface)) {+ return ConnectivityManager.TETHERING_ETHERNET; } return ConnectivityManager.TETHERING_INVALID; }@@ -446,6 +466,9 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering case ConnectivityManager.TETHERING_BLUETOOTH: setBluetoothTethering(enable, receiver); break;+ case ConnectivityManager.TETHERING_ETHERNET:+ setEthernetTethering(enable);+ break; default: Log.w(TAG, "Invalid tether type."); sendTetherResult(receiver, ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE);@@ -458,6 +481,43 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } }+ private void setEthernetTethering(final boolean enable) {+ final EthernetManager mEthManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);+ if (mEthManager != null) {+ if (enable == true)+ mEthManager.stop();+ }+ final long ident = Binder.clearCallingIdentity();+ try {+ tetherMatchingInterfaces(enable, ConnectivityManager.TETHERING_ETHERNET);+ } finally {+ Binder.restoreCallingIdentity(ident);+ }+ if (mEthManager != null) {+ if (enable == false) {+ mEthManager.start();+ String mIface = getTetherMatchingInterface(ConnectivityManager.TETHERING_ETHERNET);+ if (mIface != null) {+ try {+ mNMService.setInterfaceUp(mIface);+ } catch (RemoteException e) {+ }+ //mEthManager.reconnect(mIface);+ }+ /*if (!mEthManager.isAvailable()) {+ mEthManager.start();+ if (mIface != null) {+ try {+ mNMService.setInterfaceUp(mIface);+ } catch (RemoteException e) {+ }+ //mEthManager.reconnect(mIface);+ }+ }*/+ }+ }+ }+ private int setWifiTethering(final boolean enable) { synchronized (mPublicSync) { mWifiTetherRequested = enable;@@ -635,6 +695,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering stopTethering(ConnectivityManager.TETHERING_WIFI); stopTethering(ConnectivityManager.TETHERING_USB); stopTethering(ConnectivityManager.TETHERING_BLUETOOTH);+ stopTethering(ConnectivityManager.TETHERING_ETHERNET); } public int getLastTetherError(String iface) {@@ -844,6 +905,32 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } }+ private String getTetherMatchingInterface(int interfaceType) {+ if (VDBG) Log.d(TAG, "getTetherMatchingInterface(" + interfaceType + ")");++ String[] ifaces = null;+ try {+ ifaces = mNMService.listInterfaces();+ } catch (Exception e) {+ Log.e(TAG, "Error listing Interfaces", e);+ return null;+ }+ String chosenIface = null;+ if (ifaces != null) {+ for (String iface : ifaces) {+ if (ifaceNameToType(iface) == interfaceType) {+ chosenIface = iface;+ break;+ }+ }+ }+ if (chosenIface == null) {+ Log.e(TAG, "could not find iface of type " + interfaceType);+ return null;+ }+ return chosenIface;+ }+ private void tetherMatchingInterfaces(boolean enable, int interfaceType) { if (VDBG) Log.d(TAG, "tetherMatchingInterfaces(" + enable + ", " + interfaceType + ")");@@ -888,6 +975,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering return mTetherableBluetoothRegexs; }+ public String[] getTetherableEthernetRegexs() {+ return mTetherableEthernetRegexs;+ }+ public int setUsbTethering(boolean enable) { if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);
14) Modify the frameworks/base/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java file as follows:
--- a/frameworks/base/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java+++ b/frameworks/base/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java@@ -45,6 +45,8 @@ public class TetherInterfaceStateMachine extends StateMachine { private static final int USB_PREFIX_LENGTH = 24; private static final String WIFI_HOST_IFACE_ADDR = "192.168.43.1"; private static final int WIFI_HOST_IFACE_PREFIX_LENGTH = 24;+ private static final String ETHERNET_HOST_IFACE_ADDR = "192.168.50.1";+ private static final int ETHERNET_HOST_IFACE_PREFIX_LENGTH = 24; private final static String TAG = "TetherInterfaceSM"; private final static boolean DBG = false;@@ -130,6 +132,9 @@ public class TetherInterfaceStateMachine extends StateMachine { } else if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) { ipAsString = WIFI_HOST_IFACE_ADDR; prefixLen = WIFI_HOST_IFACE_PREFIX_LENGTH;+ } else if (mInterfaceType == ConnectivityManager.TETHERING_ETHERNET) {+ ipAsString = ETHERNET_HOST_IFACE_ADDR;+ prefixLen = ETHERNET_HOST_IFACE_PREFIX_LENGTH; } else { // Nothing to do, BT does this elsewhere. return true;@@ -144,7 +149,12 @@ public class TetherInterfaceStateMachine extends StateMachine { if (enabled) { ifcg.setInterfaceUp(); } else {+ if (mInterfaceType != ConnectivityManager.TETHERING_ETHERNET) ifcg.setInterfaceDown();+ else {+ addr = NetworkUtils.numericToInetAddress("0.0.0.0");+ ifcg.setLinkAddress(new LinkAddress(addr, prefixLen));+ } } ifcg.clearFlag("running");
15) Modify the frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java file as follows:
--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java@@ -90,18 +90,28 @@ public class EthernetServiceImpl extends IEthernetManager.Stub { } }+ @Override public void start() { Log.i(TAG, "Starting Ethernet service");- HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");- handlerThread.start();- mHandler = new Handler(handlerThread.getLooper());+ if (mHandler == null) {+ HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");+ handlerThread.start();+ mHandler = new Handler(handlerThread.getLooper());+ } mTracker.start(mContext, mHandler); mStarted.set(true); }+ @Override+ public void stop() {+ Log.i(TAG, "Stop Ethernet service");+ mStarted.set(false);+ mTracker.stop();+ }+ /** * Get Ethernet configuration * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
16) Modify the frameworks/opt/telephony/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java file as follows:
--- a/frameworks/opt/telephony/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java+++ b/frameworks/opt/telephony/tests/telephonytests/src/com/android/internal/telephony/mocks/ConnectivityServiceMock.java@@ -632,6 +632,10 @@ public class ConnectivityServiceMock extends IConnectivityManager.Stub throw new RuntimeException("not implemented"); }+ public String[] getTetherableEthernetRegexs() {+ throw new RuntimeException("not implemented");+ }+ public int setUsbTethering(boolean enable) { throw new RuntimeException("not implemented"); }
2. Modify the Settings APP
1) Modify the packages/apps/Settings/AndroidManifest.xml file as follows:
--- a/packages/apps/Settings/AndroidManifest.xml+++ b/packages/apps/Settings/AndroidManifest.xml@@ -167,6 +167,12 @@ </intent-filter> </receiver>+ <receiver android:name="StaticBroadcastReceiver">+ <intent-filter>+ <action android:name="android.intent.action.BOOT_COMPLETED"/>+ </intent-filter>+ </receiver>+ <activity android:name=".SubSettings" android:taskAffinity="com.android.settings" android:parentActivityName="Settings">
2) Modify the packages/apps/Settings/res/values/strings.xml file as follows:
--- a/packages/apps/Settings/res/values/strings.xml+++ b/packages/apps/Settings/res/values/strings.xml@@ -3000,6 +3000,8 @@ <string name="tether_settings_title_wifi">Portable hotspot</string> <!-- Tethering controls, item title to go into the tethering settings when only Bluetooth tethering is available [CHAR LIMIT=25]--> <string name="tether_settings_title_bluetooth">Bluetooth tethering</string>+ <!-- Tethering controls, item title to go into the tethering settings when only Ethernet tethering is available [CHAR LIMIT=25]-->+ <string name="tether_settings_title_ethernet">Ethernet tethering</string> <!-- Tethering controls, item title to go into the tethering settings when USB and Bluetooth tethering are available [CHAR LIMIT=25]--> <string name="tether_settings_title_usb_bluetooth">Tethering</string> <!-- Tethering controls, item title to go into the tethering settings when USB, Bluetooth and Wifi tethering are available [CHAR LIMIT=25]-->@@ -3007,6 +3009,9 @@ <!-- Tethering controls, footer note displayed when tethering is disabled because Data Saver mode is on [CHAR LIMIT=none]--> <string name="tether_settings_disabled_on_data_saver">"Can’t tether or use portable hotspots while Data Saver is on"</string>+ <!-- Ethernet Tethering options -->+ <string name="ethernet_tether_checkbox_text">Ethernet tethering</string>+ <!-- USB Tethering options --> <string name="usb_title">USB</string> <string name="usb_tethering_button_text">USB tethering</string>
3) Modify the packages/apps/Settings/res/xml/tether_prefs.xml file as follows:
--- a/packages/apps/Settings/res/xml/tether_prefs.xml+++ b/packages/apps/Settings/res/xml/tether_prefs.xml@@ -34,6 +34,10 @@ android:key="enable_bluetooth_tethering" android:title="@string/bluetooth_tether_checkbox_text" />+ <SwitchPreference+ android:key="enable_ethernet_tethering"+ android:title="@string/ethernet_tether_checkbox_text" />+ <com.android.settings.DividerPreference android:key="disabled_on_data_saver" android:summary="@string/tether_settings_disabled_on_data_saver"
4) Add a new file packages/apps/Settings/src/com/android/settings/StaticBroadcastReceiver.java with the following content:
--- /dev/null+++ b/packages/apps/Settings/src/com/android/settings/StaticBroadcastReceiver.java@@ -0,0 +1,52 @@+package com.android.settings;++import android.content.BroadcastReceiver;+import android.content.ComponentName;+import android.content.Context;+import android.content.Intent;+import android.provider.Settings;+import android.net.ConnectivityManager;+import android.os.Handler;++import static android.net.ConnectivityManager.TETHERING_ETHERNET;++public class StaticBroadcastReceiver extends BroadcastReceiver {++ private static final class OnStartTetheringCallback extends+ ConnectivityManager.OnStartTetheringCallback {+ //final WeakReference<TetherSettings> mTetherSettings;++ OnStartTetheringCallback(StaticBroadcastReceiver receiver/*TetherSettings settings*/) {+ //mTetherSettings = new WeakReference<TetherSettings>(settings);+ }++ @Override+ public void onTetheringStarted() {+ //update();+ }++ @Override+ public void onTetheringFailed() {+ //update();+ }++ /*private void update() {+ TetherSettings settings = mTetherSettings.get();+ if (settings != null) {+ settings.updateState();+ }+ }*/+ }++ @Override+ public void onReceive(Context context, Intent broadcast) {+ boolean isEthernetTetheringOn = Settings.System.getInt(context.getContentResolver(), Settings.System.ETHERNET_TETHERING_STATE, 1) == 1;+ if (isEthernetTetheringOn) {+ ConnectivityManager mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);+ Handler mHandler = new Handler();+ OnStartTetheringCallback mStartTetheringCallback = new OnStartTetheringCallback(this);+ mCm.startTethering(TETHERING_ETHERNET, true, mStartTetheringCallback, mHandler);+ }+ }++}
5) Modify the packages/apps/Settings/src/com/android/settings/TetherSettings.java file as follows:
--- a/packages/apps/Settings/src/com/android/settings/TetherSettings.java+++ b/packages/apps/Settings/src/com/android/settings/TetherSettings.java@@ -39,6 +39,7 @@ import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.util.Log;+import android.provider.Settings; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.datausage.DataSaverBackend;@@ -53,6 +54,7 @@ import java.util.concurrent.atomic.AtomicReference; import static android.net.ConnectivityManager.TETHERING_BLUETOOTH; import static android.net.ConnectivityManager.TETHERING_USB; import static android.net.ConnectivityManager.TETHERING_WIFI;+import static android.net.ConnectivityManager.TETHERING_ETHERNET; /* * Displays preferences for Tethering.@@ -64,6 +66,7 @@ public class TetherSettings extends RestrictedSettingsFragment private static final String USB_TETHER_SETTINGS = "usb_tether_settings"; private static final String ENABLE_WIFI_AP = "enable_wifi_ap"; private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";+ private static final String ENABLE_ETHERNET_TETHERING = "enable_ethernet_tethering"; private static final String TETHER_CHOICE = "TETHER_TYPE"; private static final String DATA_SAVER_FOOTER = "disabled_on_data_saver";@@ -78,6 +81,8 @@ public class TetherSettings extends RestrictedSettingsFragment private SwitchPreference mBluetoothTether;+ private SwitchPreference mEthernetTether;+ private BroadcastReceiver mTetherChangeReceiver; private String[] mUsbRegexs;@@ -87,6 +92,8 @@ public class TetherSettings extends RestrictedSettingsFragment private String[] mBluetoothRegexs; private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<BluetoothPan>();+ private String[] mEthernetRegexs;+ private Handler mHandler = new Handler(); private OnStartTetheringCallback mStartTetheringCallback;@@ -157,7 +164,7 @@ public class TetherSettings extends RestrictedSettingsFragment Preference wifiApSettings = findPreference(WIFI_AP_SSID_AND_SECURITY); mUsbTether = (SwitchPreference) findPreference(USB_TETHER_SETTINGS); mBluetoothTether = (SwitchPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);-+ mEthernetTether = (SwitchPreference) findPreference(ENABLE_ETHERNET_TETHERING); mDataSaverBackend.addListener(this); mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);@@ -166,15 +173,21 @@ public class TetherSettings extends RestrictedSettingsFragment mUsbRegexs = mCm.getTetherableUsbRegexs(); mWifiRegexs = mCm.getTetherableWifiRegexs(); mBluetoothRegexs = mCm.getTetherableBluetoothRegexs();+ mEthernetRegexs = mCm.getTetherableEthernetRegexs(); final boolean usbAvailable = mUsbRegexs.length != 0; final boolean wifiAvailable = mWifiRegexs.length != 0; final boolean bluetoothAvailable = mBluetoothRegexs.length != 0;+ final boolean ethernetAvailable = mEthernetRegexs.length != 0; if (!usbAvailable || Utils.isMonkeyRunning()) { getPreferenceScreen().removePreference(mUsbTether); }+ if (!ethernetAvailable || Utils.isMonkeyRunning()) {+ getPreferenceScreen().removePreference(mEthernetTether);+ }+ if (wifiAvailable && !Utils.isMonkeyRunning()) { mWifiApEnabler = new WifiApEnabler(activity, mDataSaverBackend, mEnableWifiAp); initWifiTethering();@@ -193,6 +206,10 @@ public class TetherSettings extends RestrictedSettingsFragment mBluetoothTether.setChecked(false); } }++ boolean isEthernetTetheringOn = Settings.System.getInt(getContentResolver(), Settings.System.ETHERNET_TETHERING_STATE, 1) == 1;+ mEthernetTether.setChecked(isEthernetTetheringOn);+ // Set initial state based on Data Saver mode. onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled()); }@@ -209,6 +226,7 @@ public class TetherSettings extends RestrictedSettingsFragment mEnableWifiAp.setEnabled(!mDataSaverEnabled); mUsbTether.setEnabled(!mDataSaverEnabled); mBluetoothTether.setEnabled(!mDataSaverEnabled);+ mEthernetTether.setEnabled(!mDataSaverEnabled); mDataSaverFooter.setVisible(mDataSaverEnabled); }@@ -559,6 +577,14 @@ public class TetherSettings extends RestrictedSettingsFragment } else { mCm.stopTethering(TETHERING_USB); }+ } else if (preference == mEthernetTether) {+ if (mEthernetTether.isChecked()) {+ startTethering(TETHERING_ETHERNET);+ Settings.System.putInt(getContentResolver(), Settings.System.ETHERNET_TETHERING_STATE, 1);+ } else {+ mCm.stopTethering(TETHERING_ETHERNET);+ Settings.System.putInt(getContentResolver(), Settings.System.ETHERNET_TETHERING_STATE, 0);+ } } else if (preference == mBluetoothTether) { if (mBluetoothTether.isChecked()) { startTethering(TETHERING_BLUETOOTH);
Thus, the functionality is basically implemented. If you encounter any porting issues or other related problems, please contact us for technical support ([email protected]).