【Android】Android13 MTK平台添加以太网设置静态IP菜单

本文介绍了在Android13 MTK平台上如何添加以太网设置静态IP的菜单。相较于Android 12,改动主要发生在framework层,EthernetManager的相关代码移动到packages/modules/Connectivity/下。虽然设置界面变化不大,但提供了详细的代码修改指导。
摘要由CSDN通过智能技术生成

朋友们,以太网功能真的是太太太太常用了,这次我又带着 13 的以太网静态IP功能来了,相比 12.0 而言,

设置界面添加菜单没啥变化,可以直接对比移植。
framework层就有变化了,EthernetManager相关代码从framework移到packages/modules/Connectivity/下了。
效果图 和 12一样差别不大。

话不多说,直接上代码

[MTK_13][Ethernet]add etherent static ip
diff --git a/system/packages/modules/Connectivity/framework-t/api/module-lib-current.txt b/system/packages/modules/Connectivity/framework-t/api/module-lib-current.txt
old mode 100644
new mode 100755
index 5a8d47b5f5c..8d81025a91e
--- a/system/packages/modules/Connectivity/framework-t/api/module-lib-current.txt
+++ b/system/packages/modules/Connectivity/framework-t/api/module-lib-current.txt
@@ -44,9 +44,18 @@ package android.net {
   public class EthernetManager {
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void addEthernetStateListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer);
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void addInterfaceStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.InterfaceStateListener);
+    method public String[] getAvailableInterfaces();
+    method public android.net.IpConfiguration getConfiguration(String);
+    method public String getDns(String);
+    method public String getGateway(String);
     method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public java.util.List<java.lang.String> getInterfaceList();
+    method public String getIpAddress(String);
+    method public String getNetmask(String);
+    method public boolean isAvailable();
+    method public boolean isInterfaceup(String);
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void removeEthernetStateListener(@NonNull java.util.function.IntConsumer);
     method public void removeInterfaceStateListener(@NonNull android.net.EthernetManager.InterfaceStateListener);
+    method public void setConfiguration(@NonNull String, @NonNull android.net.IpConfiguration);
     method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setEthernetEnabled(boolean);
     method public void setIncludeTestInterfaces(boolean);
     field public static final int ETHERNET_STATE_DISABLED = 0; // 0x0
diff --git a/system/packages/modules/Connectivity/framework-t/api/module-lib-lint-baseline.txt b/system/packages/modules/Connectivity/framework-t/api/module-lib-lint-baseline.txt
old mode 100644
new mode 100755
index 3158bd45963..d3d312dc775
--- a/system/packages/modules/Connectivity/framework-t/api/module-lib-lint-baseline.txt
+++ b/system/packages/modules/Connectivity/framework-t/api/module-lib-lint-baseline.txt
@@ -5,3 +5,29 @@ BannedThrow: android.app.usage.NetworkStatsManager#querySummary(android.net.Netw
     Methods must not mention RuntimeException subclasses in throws clauses (was `java.lang.SecurityException`)
 BannedThrow: android.app.usage.NetworkStatsManager#queryTaggedSummary(android.net.NetworkTemplate, long, long):
     Methods must not mention RuntimeException subclasses in throws clauses (was `java.lang.SecurityException`)
+
+
+MissingNullability: android.net.EthernetManager#getAvailableInterfaces():
+    Missing nullability on method `getAvailableInterfaces` return
+MissingNullability: android.net.EthernetManager#getConfiguration(String):
+    Missing nullability on method `getConfiguration` return
+MissingNullability: android.net.EthernetManager#getConfiguration(String) parameter #0:
+    Missing nullability on parameter `iface` in method `getConfiguration`
+MissingNullability: android.net.EthernetManager#getDns(String):
+    Missing nullability on method `getDns` return
+MissingNullability: android.net.EthernetManager#getDns(String) parameter #0:
+    Missing nullability on parameter `iface` in method `getDns`
+MissingNullability: android.net.EthernetManager#getGateway(String):
+    Missing nullability on method `getGateway` return
+MissingNullability: android.net.EthernetManager#getGateway(String) parameter #0:
+    Missing nullability on parameter `iface` in method `getGateway`
+MissingNullability: android.net.EthernetManager#getIpAddress(String):
+    Missing nullability on method `getIpAddress` return
+MissingNullability: android.net.EthernetManager#getIpAddress(String) parameter #0:
+    Missing nullability on parameter `iface` in method `getIpAddress`
+MissingNullability: android.net.EthernetManager#getNetmask(String):
+    Missing nullability on method `getNetmask` return
+MissingNullability: android.net.EthernetManager#getNetmask(String) parameter #0:
+    Missing nullability on parameter `iface` in method `getNetmask`
+MissingNullability: android.net.EthernetManager#isInterfaceup(String) parameter #0:
+    Missing nullability on parameter `iface` in method `isInterfaceup`
diff --git a/system/packages/modules/Connectivity/framework-t/src/android/net/EthernetManager.java b/system/packages/modules/Connectivity/framework-t/src/android/net/EthernetManager.java
old mode 100644
new mode 100755
index 886d19499cb..d2c60ee3180
--- a/system/packages/modules/Connectivity/framework-t/src/android/net/EthernetManager.java
+++ b/system/packages/modules/Connectivity/framework-t/src/android/net/EthernetManager.java
@@ -190,7 +190,8 @@ public class EthernetManager {
      * Get Ethernet configuration.
      * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
      * @hide
-     */
+     *///<dengli>@<20230412> for <add Ethernet>
+    @SystemApi(client = MODULE_LIBRARIES)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public IpConfiguration getConfiguration(String iface) {
         try {
@@ -203,7 +204,8 @@ public class EthernetManager {
     /**
      * Set Ethernet configuration.
      * @hide
-     */
+     *///<dengli>@<20230412> for <add Ethernet>
+    @SystemApi(client = MODULE_LIBRARIES)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public void setConfiguration(@NonNull String iface, @NonNull IpConfiguration config) {
         try {
@@ -216,7 +218,8 @@ public class EthernetManager {
     /**
      * Indicates whether the system currently has one or more Ethernet interfaces.
      * @hide
-     */
+     *///<dengli>@<20230412> for <add Ethernet>
+    @SystemApi(client = MODULE_LIBRARIES)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public boolean isAvailable() {
         return getAvailableInterfaces().length > 0;
@@ -236,6 +239,75 @@ public class EthernetManager {
             throw e.rethrowFromSystemServer();
         }
     }
+    //<dengli>@<20230412> for <add Ethernet>
+    /**
+     * Indicates whether the interface is up.
+     *
+     * @param iface Ethernet interface name
+     * @hide
+     */
+    @SystemApi(client = MODULE_LIBRARIES)
+    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+    public boolean isInterfaceup(String iface) {
+        try {
+            return mService.isInterfaceup(iface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @SystemApi(client = MODULE_LIBRARIES)
+    @UnsupportedAppUsage
+    public String getIpAddress(String iface) {
+        try {
+            return mService.getIpAddress(iface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @SystemApi(client = MODULE_LIBRARIES)
+    @UnsupportedAppUsage
+    public String getNetmask(String iface) {
+        try {
+            return mService.getNetmask(iface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @SystemApi(client = MODULE_LIBRARIES)
+    @UnsupportedAppUsage
+    public String getGateway(String iface) {
+        try {
+            return mService.getGateway(iface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @SystemApi(client = MODULE_LIBRARIES)
+    @UnsupportedAppUsage
+    public String getDns(String iface) {
+        try {
+            return mService.getDns(iface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+    //<dengli>@<20230412> for <add Ethernet>
 
     /**
      * Adds a listener.
@@ -317,7 +389,8 @@ public class EthernetManager {
     /**
      * Returns an array of available Ethernet interface names.
      * @hide
-     */
+     *///<dengli>@<20230412> for <add Ethernet>
+    @SystemApi(client = MODULE_LIBRARIES)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public String[] getAvailableInterfaces() {
         try {
diff --git a/system/packages/modules/Connectivity/framework-t/src/android/net/IEthernetManager.aidl b/system/packages/modules/Connectivity/framework-t/src/android/net/IEthernetManager.aidl
old mode 100644
new mode 100755
index 42e4c1ac55a..54ac9c114a2
--- a/system/packages/modules/Connectivity/framework-t/src/android/net/IEthernetManager.aidl
+++ b/system/packages/modules/Connectivity/framework-t/src/android/net/IEthernetManager.aidl
@@ -36,6 +36,13 @@ interface IEthernetManager
     IpConfiguration getConfiguration(String iface);
     void setConfiguration(String iface, in IpConfiguration config);
     boolean isAvailable(String iface);
+    /*<dengli>@<20230412> for <add Ethernet>*/
+    boolean isInterfaceup(String iface);
+    String getIpAddress(String iface);
+    String getNetmask(String iface);
+    String getGateway(String iface);
+    String getDns(String iface);
+    /*<dengli>@<20230412> for <add Ethernet>*/
     void addListener(in IEthernetServiceListener listener);
     void removeListener(in IEthernetServiceListener listener);
     void setIncludeTestInterfaces(boolean include);
diff --git a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
old mode 100644
new mode 100755
index c4ea9ae8b04..2bac5901fdf
--- a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -59,6 +59,15 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+//<dengli>@<20230412> for <add Ethernet>
+import android.net.EthernetManager;
+import android.net.LinkAddress;
+import android.net.RouteInfo;
+import com.android.net.module.util.Inet4AddressUtils;
+import java.lang.reflect.Method;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+//<dengli>@<20230412> for <add Ethernet>
 /**
  * {@link NetworkProvider} that manages NetworkOffers for Ethernet networks.
  */
@@ -74,6 +83,10 @@ public class EthernetNetworkFactory {
     private final Context mContext;
     private final NetworkProvider mProvider;
     final Dependencies mDeps;
+    //<dengli>@<20230412> for <add Ethernet>
+    private EthernetManager mEthernetManager;
+    private static boolean[] mIfaceStatus = new boolean[2];
+    //<dengli>@<20230412> for <add Ethernet>
 
     public static class Dependencies {
         public void makeIpClient(Context context, String iface, IpClientCallbacks callbacks) {
@@ -109,6 +122,8 @@ public class EthernetNetworkFactory {
     public EthernetNetworkFactory(Handler handler, Context context) {
         this(handler, context, new NetworkProvider(context, handler.getLooper(), TAG),
             new Dependencies());
+        //<dengli>@<20230412> for <add Ethernet>
+        mEthernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
     }
 
     @VisibleForTesting
@@ -240,7 +255,12 @@ public class EthernetNetworkFactory {
         if (DBG) {
             Log.d(TAG, "updateInterfaceLinkState, iface: " + ifaceName + ", up: " + up);
         }
-
+        //<dengli>@<20230412> for <add Ethernet>
+        if (ifaceName.equals("eth0"))
+            mIfaceStatus[0] = up;
+        if (ifaceName.equals("eth1"))
+            mIfaceStatus[1] = up;
+        //<dengli>@<20230412> for <add Ethernet>
         NetworkInterfaceState iface = mTrackingInterfaces.get(ifaceName);
         return iface.updateLinkState(up, listener);
     }
@@ -251,7 +271,131 @@ public class EthernetNetworkFactory {
                 new EthernetNetworkManagementException(
                         ifaceName + " can't be updated as it is not available."));
     }
+    //<dengli>@<20230412> for <add Ethernet>
+    boolean isInterfaceup(String interfacName) {
+        if (interfacName.equals("eth0"))
+            return mIfaceStatus[0];
+        else if (interfacName.equals("eth1"))
+            return mIfaceStatus[1];
+        else
+            return false;
+    }
+
+    String getIpAddress(String iface) {
+        if(mEthernetManager==null){
+            mEthernetManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);
+        }
+        IpConfiguration config = mEthernetManager.getConfiguration(iface);
+        if (config.getIpAssignment() == IpAssignment.STATIC) {
+            return config.getStaticIpConfiguration().getIpAddress().getAddress().getHostAddress();
+        } else {
+            NetworkInterfaceState netState = mTrackingInterfaces.get(iface);
+            if (null != netState) {
+                for (LinkAddress l : netState.mLinkProperties.getLinkAddresses()) {
+                    InetAddress source = l.getAddress();
+                    //Log.d(TAG, "getIpAddress: " + source.getHostAddress());
+                    if (source instanceof Inet4Address) {
+                        return source.getHostAddress();
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+    private String prefix2netmask(int prefix) {
+        // convert prefix to netmask
+        if (true) {
+            int mask = 0xFFFFFFFF << (32 - prefix);
+            //Log.d(TAG, "mask = " + mask + " prefix = " + prefix);
+            return ((mask>>>24) & 0xff) + "." + ((mask>>>16) & 0xff) + "." + ((mask>>>8) & 0xff) + "." + ((mask) & 0xff);
+        } else {
+            int hostAddress = Inet4AddressUtils.prefixLengthToV4NetmaskIntHTL(prefix);
+            return Inet4AddressUtils.intToInet4AddressHTL(hostAddress).getHostName();
+        }
+    }
+
+    String getNetmask(String iface) {
+        if(mEthernetManager==null){
+            mEthernetManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);
+        }
+        IpConfiguration config = mEthernetManager.getConfiguration(iface);
+        if (config.getIpAssignment() == IpAssignment.STATIC) {
+            return prefix2netmask(config.getStaticIpConfiguration().getIpAddress().getPrefixLength());
+        } else {
+            NetworkInterfaceState netState = mTrackingInterfaces.get(iface);
+            if (null != netState) {
+                for (LinkAddress l : netState.mLinkProperties.getLinkAddresses()) {
+                    InetAddress source = l.getAddress();
+                    if (source instanceof Inet4Address) {
+                        return prefix2netmask(l.getPrefixLength());
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+    String getGateway(String iface) {
+        if(mEthernetManager==null){
+            mEthernetManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);
+        }
+        IpConfiguration config = mEthernetManager.getConfiguration(iface);
+        if (config.getIpAssignment() == IpAssignment.STATIC) {
+            return config.getStaticIpConfiguration().getGateway().getHostAddress();
+        } else {
+            NetworkInterfaceState netState = mTrackingInterfaces.get(iface);
+            if (null != netState) {
+                for (RouteInfo route : netState.mLinkProperties.getRoutes()) {
+                    if (route.hasGateway()) {
+                        InetAddress gateway = route.getGateway();
+                        Object isIPv4Default = invokeMethodNoParameter(route, "isIPv4Default");
+                        if (null != isIPv4Default && (Boolean)isIPv4Default) {
+                            return gateway.getHostAddress();
+                        }
+                    }
+                }
+            }
+        }
+        return "";
+    }
 
+    private Object invokeMethodNoParameter(Object object, String methodName) {
+        try {
+            Method method = object.getClass().getDeclaredMethod(methodName);
+            method.setAccessible(true);
+            return method.invoke(object);
+            //return method.invoke(object, paramTypes);
+        } catch (Exception e) {
+            Log.e(TAG, "invokeMethod->methodName:" + methodName + ", " + e);
+        }
+        return null;
+    }
+
+    /*
+     * return dns format: "8.8.8.8,4.4.4.4"
+     */
+    String getDns(String iface) {
+        String dns = "";
+        if(mEthernetManager==null){
+            mEthernetManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);
+        }
+        IpConfiguration config = mEthernetManager.getConfiguration(iface);
+        if (config.getIpAssignment() == IpAssignment.STATIC) {
+            for (InetAddress nameserver : config.getStaticIpConfiguration().getDnsServers()) {
+                dns += nameserver.getHostAddress() + ",";
+            }
+        } else {
+            NetworkInterfaceState netState = mTrackingInterfaces.get(iface);
+            if (null != netState) {
+                for (InetAddress nameserver : netState.mLinkProperties.getDnsServers()) {
+                    dns += nameserver.getHostAddress() + ",";
+                }
+            }
+        }
+        return dns;
+    }
+    //<dengli>@<20230412> for <add Ethernet>
     @VisibleForTesting
     protected boolean hasInterface(String ifaceName) {
         return mTrackingInterfaces.containsKey(ifaceName);
diff --git a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
old mode 100644
new mode 100755
index 5e830ad83a6..3a184e31b15
--- a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
+++ b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
@@ -44,7 +44,22 @@ import java.io.PrintWriter;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
-
+//<dengli>@<20230412> for <add Ethernet>
+import android.net.IpConfiguration.IpAssignment;
+import android.net.IpConfiguration.ProxySettings;
+import android.database.ContentObserver;
+import java.net.InetAddress;
+import android.net.Uri;
+import android.net.LinkAddress;
+import android.net.StaticIpConfiguration;
+import android.provider.Settings;
+import android.provider.Settings.System;
+import java.util.ArrayList;
+import android.os.SystemProperties;
+import java.net.Inet4Address;
+import android.net.InetAddresses;
+import java.util.regex.Pattern;
+//<dengli>@<20230412> for <add Ethernet>
 /**
  * EthernetServiceImpl handles remote Ethernet operation requests by implementing
  * the IEthernetManager interface.
@@ -57,7 +72,8 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
     private final Context mContext;
     private final Handler mHandler;
     private final EthernetTracker mTracker;
-
+    //<dengli>@<20230412> for <add Ethernet>
+    public StaticIpConfiguration mStaticIpConfiguration;
     EthernetServiceImpl(@NonNull final Context context, @NonNull final Handler handler,
             @NonNull final EthernetTracker tracker) {
         mContext = context;
@@ -74,9 +90,77 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
         return PermissionUtils.checkAnyPermissionOf(mContext,
                 android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS);
     }
+    //<dengli>@<20230412> for <add Ethernet>
+    private Inet4Address getIPv4Address(String text) {
+        try {
+            return (Inet4Address)InetAddresses.parseNumericAddress(text);
+        } catch (IllegalArgumentException | ClassCastException e) {
+            return null;
+        }
+    }
+    /*
+     * convert subMask string to prefix length
+     */
+    private int maskStr2InetMask(String maskStr) {
+        StringBuffer sb;
+        String str;
+        int inetmask = 0;
+        int count = 0;
+        /*
+         * check the subMask format
+         */
+        Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$");
+        if (pattern.matcher(maskStr).matches() == false) {
+            Log.e(TAG, "subMask is error");
+            return 0;
+        }
 
+        String[] ipSegment = maskStr.split("\\.");
+        for (int n = 0; n < ipSegment.length; n++) {
+            sb = new StringBuffer(Integer.toBinaryString(Integer.parseInt(ipSegment[n])));
+            str = sb.reverse().toString();
+            count = 0;
+            for (int i = 0; i < str.length(); i++) {
+                i = str.indexOf("1", i);
+                if (i == -1)
+                    break;
+                count++;
+            }
+            inetmask += count;
+        }
+        return inetmask;
+    }
+    //<dengli>@<20230412> for <add Ethernet>
     public void start() {
         Log.i(TAG, "Starting Ethernet service");
+		 //<dengli>@<20230412> for <add Ethernet>
+        if ("1".equals(SystemProperties.get("persist.xxxxx.ethernet_static"))) {
+               try {
+                Inet4Address inetAddr = getIPv4Address(SystemProperties.get("persist.xxxxx.ethernet_static_ip"));
+                int prefixLength = maskStr2InetMask(SystemProperties.get("persist.xxxxx.ethernet_static_mask"));
+                InetAddress gatewayAddr = getIPv4Address(SystemProperties.get("persist.xxxxx.ethernet_static_gateway"));
+                InetAddress dnsAddr = getIPv4Address(SystemProperties.get("persist.xxxxx.ethernet_static_dns1"));
+                String dnsStr2 = SystemProperties.get("persist.xxxxx.ethernet_static_dns2");
+                ArrayList<InetAddress> dnsAddrs = new ArrayList<InetAddress>();
+                dnsAddrs.add(dnsAddr);
+                if (!dnsStr2.isEmpty()) {
+                    dnsAddrs.add(getIPv4Address(dnsStr2));
+                }
+                mStaticIpConfiguration = new StaticIpConfiguration.Builder()
+                        .setIpAddress(new LinkAddress(inetAddr, prefixLength))
+                        .setGateway(gatewayAddr)
+                        .setDnsServers(dnsAddrs)
+                        .build();
+                }catch (Exception e){
+                e.printStackTrace();
+                }
+                IpConfiguration mIpConfiguration = new IpConfiguration();
+                mIpConfiguration.setIpAssignment(IpAssignment.STATIC);
+                mIpConfiguration.setProxySettings(ProxySettings.STATIC);
+                mIpConfiguration.setStaticIpConfiguration(mStaticIpConfiguration);
+                mTracker.updateIpConfiguration("eth0", mIpConfiguration);
+            }
+			 //<dengli>@<20230412> for <add Ethernet>
         mTracker.start();
         mStarted.set(true);
     }
@@ -136,6 +220,56 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
 
         return mTracker.isTrackingInterface(iface);
     }
+//<dengli>@<20230412> for <add Ethernet>
+    @Override
+    public boolean isInterfaceup(String iface) {
+        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
+        if (mTracker.isRestrictedInterface(iface)) {
+            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
+        }
+
+        return mTracker.isInterfaceup(iface);
+    }
+
+    @Override
+    public String getIpAddress(String iface) {
+        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
+        if (mTracker.isRestrictedInterface(iface)) {
+            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
+        }
+
+        return mTracker.getIpAddress(iface);
+    }
+
+    @Override
+    public String getNetmask(String iface) {
+        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
+        if (mTracker.isRestrictedInterface(iface)) {
+            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
+        }
+
+        return mTracker.getNetmask(iface);
+    }
+
+    @Override
+    public String getGateway(String iface) {
+        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
+        if (mTracker.isRestrictedInterface(iface)) {
+            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
+        }
+        return mTracker.getGateway(iface);
+    }
+
+    @Override
+    public String getDns(String iface) {
+        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
+        if (mTracker.isRestrictedInterface(iface)) {
+            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
+        }
+
+        return mTracker.getDns(iface);
+    }
+    //<dengli>@<20230412> for <add Ethernet>
 
     /**
      * Adds a listener.
diff --git a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
old mode 100644
new mode 100755
index 1ab7515b8cb..d8e8e871fb6
--- a/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
+++ b/system/packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetTracker.java
@@ -305,7 +305,27 @@ public class EthernetTracker {
     protected boolean isTrackingInterface(String iface) {
         return mFactory.hasInterface(iface);
     }
+   //<dengli>@<20230412> for <add Ethernet>
+    boolean isInterfaceup(String iface) {
+        return mFactory.isInterfaceup(iface);
+    }
+
+    String getIpAddress(String iface) {
+        return mFactory.getIpAddress(iface);
+    }
+
+    String getNetmask(String iface) {
+        return mFactory.getNetmask(iface);
+    }
+
+    String getGateway(String iface) {
+        return mFactory.getGateway(iface);
+    }
 
+    String getDns(String iface) {
+        return mFactory.getDns(iface);
+    }
+    //<dengli>@<20230412> for <add Ethernet>
     String[] getInterfaces(boolean includeRestricted) {
         return mFactory.getAvailableInterfaces(includeRestricted);
     }
diff --git a/system/system/sepolicy/private/property_contexts b/system/system/sepolicy/private/property_contexts
old mode 100644
new mode 100755
index 1b2360d18bf..d1bfbed9359
--- a/system/system/sepolicy/private/property_contexts
+++ b/system/system/sepolicy/private/property_contexts
@@ -283,6 +283,8 @@ bpf.progs_loaded        u:object_r:bpf_progs_loaded_prop:s0 exact bool
 
 gsid.                   u:object_r:gsid_prop:s0
 ro.gsid.                u:object_r:gsid_prop:s0
+#<dengli>@<20230412> for <add Ethernet>
+persist.xxxxx.            u:object_r:system_prop:s0
 
 # Property for disabling NNAPI vendor extensions on product image (used on GSI /product image,
 # which can't use NNAPI vendor extensions).
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml
index e07fce8daa2..a7283b7d336 100755
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml
@@ -797,7 +797,32 @@
             <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
                        android:value="@string/menu_key_network"/>
         </activity-alias>
+        <!-- <dengli>@<20230412> for <add Ethernet> -->
+        <activity android:name="Settings$EthernetSettingsActivity"
+            android:label="@string/ethernet_settings_title"
+            android:icon="@drawable/ic_settings_wireless"
+            android:exported="true"
+            android:taskAffinity="">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.ethernet.EthernetSettings" />
+        </activity>
 
+        <!-- Keep compatibility with old shortcuts. -->
+        <activity-alias android:name=".EthernetSettings"
+            android:label="@string/ethernet_settings"
+            android:clearTaskOnLaunch="true"
+            android:targetActivity="Settings$EthernetSettingsActivity"
+            android:exported="true">
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.EthernetSettings" />
+        </activity-alias>
+        <!-- <dengli>@<20230412> for <add Ethernet> end -->
         <activity android:name="Settings$WifiP2pSettingsActivity"
             android:exported="true">
             <intent-filter>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/drawable/ic_ethernet.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/drawable/ic_ethernet.xml
new file mode 100755
index 00000000000..ca47ec96d01
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/drawable/ic_ethernet.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2016 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M7.77,6.76L6.23,5.48 0.82,12l5.41,6.52 1.54,-1.28L3.42,12l4.35,-5.24zM7,13h2v-2L7,11v2zM17,11h-2v2h2v-2zM11,13h2v-2h-2v2zM17.77,5.48l-1.54,1.28L20.58,12l-4.35,5.24 1.54,1.28L23.18,12l-5.41,-6.52z"/>
+</vector>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/layout/static_ip_dialog.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/layout/static_ip_dialog.xml
new file mode 100755
index 00000000000..8e7bef0815f
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/layout/static_ip_dialog.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:fadeScrollbars="false" >
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:paddingBottom="8dip" >
+
+        <LinearLayout
+            android:id="@+id/wifi_advanced_fields"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" >
+
+            <LinearLayout
+                android:id="@+id/proxy_fields"
+                style="@style/wifi_section"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" >
+
+                <LinearLayout
+                    android:id="@+id/staticip"
+                    style="@style/wifi_section"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content" >
+
+                    <LinearLayout
+                        style="@style/wifi_item"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" >
+
+                        <TextView
+                            style="@style/wifi_item_label"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wifi_ip_address" />
+
+                        <EditText
+                            android:id="@+id/ipaddress"
+                            style="@style/wifi_item_edit_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:hint="@string/wifi_ip_address_hint"
+                            android:inputType="textNoSuggestions"
+                            android:singleLine="true" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        style="@style/wifi_item"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" >
+
+                        <TextView
+                            style="@style/wifi_item_label"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wifi_gateway" />
+
+                        <EditText
+                            android:id="@+id/gateway"
+                            style="@style/wifi_item_edit_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:hint="@string/wifi_gateway_hint"
+                            android:inputType="textNoSuggestions"
+                            android:singleLine="true" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        style="@style/wifi_item"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" >
+
+                        <TextView
+                            style="@style/wifi_item_label"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/ethernet_netmask" />
+
+                        <EditText
+                            android:id="@+id/network_prefix_length"
+                            style="@style/wifi_item_edit_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:hint="@string/ethernet_netmask_hint"
+                            android:inputType="textNoSuggestions"
+                            android:singleLine="true" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        style="@style/wifi_item"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" >
+
+                        <TextView
+                            style="@style/wifi_item_label"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wifi_dns1" />
+
+                        <EditText
+                            android:id="@+id/dns1"
+                            style="@style/wifi_item_edit_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:hint="@string/wifi_dns1_hint"
+                            android:inputType="textNoSuggestions"
+                            android:singleLine="true" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        style="@style/wifi_item"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content" >
+
+                        <TextView
+                            style="@style/wifi_item_label"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wifi_dns2" />
+
+                        <EditText
+                            android:id="@+id/dns2"
+                            style="@style/wifi_item_edit_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:hint="@string/wifi_dns2_hint"
+                            android:inputType="textNoSuggestions"
+                            android:singleLine="true" />
+                    </LinearLayout>
+                </LinearLayout>
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+</ScrollView>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml
index ca1cbb52d5a..8b5a9f60536 100755
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml
@@ -5800,4 +5800,50 @@
     <string name="date_time_set_time">"设置时间"</string>
     <string name="date_time_24hour_auto_summary">"使用默认语言区域"</string>
     <!--<dengli>@<20230322> for <add Chinese translation string>-->
+    <!-- <dengli>@<20230412> for <add Ethernet> -->
+    <string name="ethernet_settings_title">以太网</string>
+    <string name="ethernet_netmask_hint" translatable="false"> 255.255.255.0</string>
+    <!--string name="ethernet_info_getting">"getting IP info..."</string-->
+    <string name="ethernet_settings">以太网</string>
+    <string name="ethernet_connect">连接</string>
+    <string name="ethernet_cancel">取消</string>
+    <!--Wireless controls screen, settings summary for the item tot ake you to the ethernet settings screen -->
+    <string name="ethernet_settings_summary">管理以太网</string>
+    <!-- ethernet hw address  -->
+    <string name="ethernet_hw_addr">MAC</string>
+    <!-- ethernet ip address  -->
+    <string name="ethernet_ip_addr">IP 地址</string>
+    <!-- ethernet netmask  -->
+    <string name="ethernet_netmask">网络掩码</string>
+    <!-- ethernet gateway  -->
+    <string name="ethernet_gateway">网关</string>
+    <!-- ethernet dns1  -->
+    <string name="ethernet_dns1">dns1</string>
+    <!-- ethernet dns2 -->
+    <string name="ethernet_dns2">dns2</string>
+    <string name="category_ethernet">静态IP设置</string>
+    <string name="usedhcp">动态</string>
+    <string name="usestatic">静态</string>
+    <string name="ethernet_use_static_ip">使用静态IP</string>
+    <string name="ethernet_ip_address">IP 地址</string>
+    <string name="staticip_save">保存</string>
+    <string name="staticip_cancel">取消</string>
+    <string name="str_ok">OK</string>
+    <string name="str_cancel">取消</string>
+    <string name="str_about">重要的</string>
+    <string name="str_mesg">是否保存设置?</string>
+    <string name="save_failed">保存失败!</string>
+    <string name="ethernet_ip_settings_invalid_ip">请输入一个有效的IP地址。</string>
+    <string name="eth_ip_settings_please_complete_settings">请给完整的静态IP设置!</string>
+    <string name="ethernet_quick_toggle_title">以太网</string>
+    <!-- Ethernet settings check box summary for turning on ethernet -->
+    <string name="ethernet_quick_toggle_summary_off">以太网是禁用的</string>
+    <!--Used as title on second screen after selecting Ethernet settings -->
+    <string name="ethernet_quick_toggle_summary_on">启用以太网</string>
+    <!--Used as title on second screen after selecting Ethernet settings -->
+    <string name="ethernet_mode_title">以太网Ip模式</string>
+    <string name="ethernet_info_getting">"获得IP信息…"</string>
+    <string name="disabled_low_ram_device">"该设备不支持此功能"</string>
+    <string name="add_network_cable">"请先确认网线是否连接"</string>
+    <!-- <dengli>@<20230412> for <add Ethernet> end -->
 </resources>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml
index 053ff722da6..fb93c2ce3a5 100755
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml
@@ -1691,4 +1691,13 @@
          [CHAR LIMIT=NONE] -->
     <string-array name="allowlist_hide_summary_in_battery_usage" translatable="false">
     </string-array>
+    <!--<dengli>@<20230412> for <add Ethernet>-->
+    <string-array name="ethernet_mode_location">
+        <item>@string/usestatic</item>
+        <item>@string/usedhcp</item>
+    </string-array>
+    <string-array name="ethernet_mode_values">
+        <item>StaticIP</item>
+        <item>DHCP</item>
+    </string-array>
 </resources>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
index fff8da97eac..59236546b55 100755
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
@@ -14197,5 +14197,50 @@
     <string name="bt_le_audio_scan_qr_code_scanner">To start listening, center the QR code below</string>
     <!-- [CHAR LIMIT=NONE] Hint for QR code process failure -->
     <string name="bt_le_audio_qr_code_is_not_valid_format">QR code isn\u0027t a valid format</string>
-
+    <!-- <dengli>@<20230412> for <add Ethernet> -->
+    <string name="ethernet_settings_title">Ethernet</string>
+    <string name="ethernet_netmask_hint" translatable="false"> 255.255.255.0</string>
+    <!--string name="ethernet_info_getting">"getting IP info..."</string-->
+    <string name="ethernet_settings">Ethernet</string>
+    <string name="ethernet_connect">Connect</string>
+    <string name="ethernet_cancel">Cancel</string>
+    <!--Wireless controls screen, settings summary for the item tot ake you to the ethernet settings screen -->
+    <string name="ethernet_settings_summary">Manager ethernet</string>
+    <!-- ethernet hw address  -->
+    <string name="ethernet_hw_addr">MAC</string>
+    <!-- ethernet ip address  -->
+    <string name="ethernet_ip_addr">IP address</string>
+    <!-- ethernet netmask  -->
+    <string name="ethernet_netmask">netmask</string>
+    <!-- ethernet gateway  -->
+    <string name="ethernet_gateway">gateway</string>
+    <!-- ethernet dns1  -->
+    <string name="ethernet_dns1">dns1</string>
+    <!-- ethernet dns2 -->
+    <string name="ethernet_dns2">dns2</string>
+    <string name="category_ethernet">Static IP Setttings</string>
+    <string name="usedhcp">dhcp</string>
+    <string name="usestatic">static</string>
+    <string name="ethernet_use_static_ip">Use static IP</string>
+    <string name="ethernet_ip_address">IP address</string>
+    <string name="staticip_save">Save</string>
+    <string name="staticip_cancel">Cancel</string>
+    <string name="str_ok">OK</string>
+    <string name="str_cancel">Cancel</string>
+    <string name="str_about">Important</string>
+    <string name="str_mesg">Whether save Settings?</string>
+    <string name="save_failed">Save failed!</string>
+    <string name="ethernet_ip_settings_invalid_ip">Please type a valid IP address.</string>
+    <string name="eth_ip_settings_please_complete_settings">Please give complete static IP settings!</string>
+    <string name="ethernet_quick_toggle_title">Ethernet</string>
+    <!-- Ethernet settings check box summary for turning on ethernet -->
+    <string name="ethernet_quick_toggle_summary_off">Ethernet is disabled</string>
+    <!--Used as title on second screen after selecting Ethernet settings -->
+    <string name="ethernet_quick_toggle_summary_on">Ethernet is enabled</string>
+    <!--Used as title on second screen after selecting Ethernet settings -->
+    <string name="ethernet_mode_title">Ethernet Ip mode</string>
+    <string name="ethernet_info_getting">"getting IP info..."</string>
+    <string name="disabled_low_ram_device">This feature is not available on this device</string>
+    <string name="add_network_cable">Check whether the network cable is connected first</string>
+    <!--<dengli>@<20230412> for <add Ethernet> end -->
 </resources>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/ethernet_settings.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/ethernet_settings.xml
new file mode 100755
index 00000000000..31899a82791
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/ethernet_settings.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+    android:title="@string/ethernet_settings" >
+
+    <!-- $_rbox_$_modify_$_lijiehong: change to support bluetooth checkbox -->
+<!--
+    <SwitchPreference
+        android:key="ethernet"
+        android:title="@string/ethernet_quick_toggle_title"
+        android:summaryOff="@string/ethernet_quick_toggle_summary_off"
+        android:summaryOn="@string/ethernet_quick_toggle_summary_on"
+        android:persistent="false"
+        android:disableDependentsState="true" />
+  -->
+  <!--
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_hw_addr"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_hw_addr" />
+  -->
+    <!-- ethernet ip address -->
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_ip_addr"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_ip_addr" />
+
+    <!-- ethernet netmask -->
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_netmask"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_netmask" />
+
+    <!-- ethernet gateway -->
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_gateway"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_gateway" />
+
+    <!-- ethernet dns1 -->
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_dns1"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_dns1" />
+
+    <!-- ethernet dns2 -->
+    <Preference
+        style="?android:preferenceInformationStyle"
+        android:key="ethernet_dns2"
+        android:summary="@string/device_info_default"
+        android:title="@string/ethernet_dns2" />
+
+    <ListPreference
+            android:entries="@array/ethernet_mode_location"
+            android:entryValues="@array/ethernet_mode_values"
+            android:key="ethernet_mode_select"
+            android:persistent="true"
+            android:title="@string/ethernet_mode_title" />
+
+ <!--
+    <CheckBoxPreference
+        android:key="static_ethernet"
+        android:title="@string/usestatic" />
+    <CheckBoxPreference
+        android:key="dhcp_ethernet"
+        android:title="@string/usedhcp" />
+ -->
+</PreferenceScreen>
+
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/network_provider_internet.xml b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/network_provider_internet.xml
old mode 100644
new mode 100755
index 9e7086cef91..e0a7b7990b0
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/network_provider_internet.xml
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/network_provider_internet.xml
@@ -131,5 +131,14 @@
         android:order="30">
         <intent android:action="com.mediatek.security.NETWORK_DATA_CONTROLLER" />
      </Preference>
+    <!--<dengli>@<20230412> for <add Ethernet>-->
+    <com.android.settingslib.RestrictedPreference
+        android:fragment="com.android.settings.ethernet.EthernetSettings"
+        android:icon="@drawable/ic_ethernet"
+        android:key="ethernet_settings"
+        android:title="@string/ethernet_settings_title"
+        android:order="35"
+        settings:useAdminDisabledSummary="true"
+        settings:userRestriction="no_ethernet_settings" />
 
 </PreferenceScreen>
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Settings.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Settings.java
old mode 100644
new mode 100755
index 9c8794de699..cfe90c01682
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Settings.java
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Settings.java
@@ -328,6 +328,8 @@ public class Settings extends SettingsActivity {
     }
 
     public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class EthernetSettingsActivity extends SettingsActivity { /* empty */ }//<dengli>@<20230412> for <add Ethernet>
+
     public static class WifiCallingSettingsActivity extends SettingsActivity {
         /// M: Add for revising the action bar for WFC setting. @{
         @Override
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
old mode 100644
new mode 100755
index 9a325e587dc..1c2151201ed
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
@@ -68,6 +68,7 @@ import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.homepage.DeepLinkHomepageActivityInternal;
 import com.android.settings.homepage.SettingsHomepageActivity;
+import com.android.settings.ethernet.EthernetSettings;//<dengli>@<20230412> for <add Ethernet>
 import com.android.settings.homepage.TopLevelSettings;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.PasswordUtils;
@@ -866,7 +867,12 @@ public class SettingsActivity extends SettingsBaseActivity
         somethingChanged = UtilsExt.getMiscPlugin(this).doUpdateTilesList(
                 this, isAdmin, somethingChanged);
         /// @}
-
+        //<dengli>@<20230412> for <add Ethernet>
+        somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
+                        Settings.EthernetSettingsActivity.class.getName()),
+                EthernetSettings.isAvailable(), isAdmin)
+                || somethingChanged;
+        //<dengli>@<20230412> for <add Ethernet> end
         if (UserHandle.MU_ENABLED && !isAdmin) {
             // When on restricted users, disable all extra categories (but only the settings ones).
             final List<DashboardCategory> categories = mDashboardFeatureProvider.getAllCategories();
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/core/gateway/SettingsGateway.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/core/gateway/SettingsGateway.java
old mode 100644
new mode 100755
index bc982e7759f..69653567126
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -100,6 +100,7 @@ import com.android.settings.display.SmartAutoRotatePreferenceFragment;
 import com.android.settings.display.darkmode.DarkModeSettingsFragment;
 import com.android.settings.dream.DreamSettings;
 import com.android.settings.enterprise.EnterprisePrivacySettings;
+import com.android.settings.ethernet.EthernetSettings;//<dengli>@<20230412> for <add Ethernet>
 import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.fuelgauge.batterysaver.BatterySaverScheduleSettings;
@@ -212,6 +213,7 @@ public class SettingsGateway {
             WifiTetherSettings.class.getName(),
             BackgroundCheckSummary.class.getName(),
             VpnSettings.class.getName(),
+            EthernetSettings.class.getName(),//<dengli>@<20230412> for <add Ethernet>
             DataSaverSummary.class.getName(),
             DateTimeSettings.class.getName(),
             LocaleListEditor.class.getName(),
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EtherentStaticIpDialog.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EtherentStaticIpDialog.java
new file mode 100755
index 00000000000..321dfde567b
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EtherentStaticIpDialog.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.ethernet;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+
+import com.android.settings.R;
+
+import java.util.regex.Pattern;
+
+import android.content.Context;
+import android.preference.EditTextPreference;
+import android.provider.Settings.System;
+import android.app.AlertDialog;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.provider.Settings.System;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Button;
+
+import android.net.EthernetManager;
+
+class ethernet_static_ip_dialog extends AlertDialog implements TextWatcher {
+
+    public getStaticIpInfo mGetStaticInfo;
+    private TextView mIpAddressView;
+    private TextView mIPgateway;
+    private TextView ipnetmask;
+    private TextView mdns1;
+    private TextView mdns2;
+
+    public EditText ip_address;
+    public EditText ip_gateway;
+    public EditText gateway;
+    public EditText dns1;
+    public EditText dns2;
+
+    static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE;
+    static final int BUTTON_FORGET = DialogInterface.BUTTON_NEUTRAL;
+
+    private final static String nullIpInfo = "0.0.0.0";
+
+    // private final boolean mEdit;
+    private final DialogInterface.OnClickListener mListener;
+
+    private View mView;
+    Context mcontext;
+    EthernetManager mEthManager;
+    private String mIfaceName;
+
+    // private boolean mHideSubmitButton;
+
+    public ethernet_static_ip_dialog(Context context, boolean cancelable,
+                                     DialogInterface.OnClickListener listener, getStaticIpInfo GetgetStaticIpInfo,
+                                     String ifaceName) {
+        super(context);
+        mcontext = context;
+        mListener = listener;
+        mGetStaticInfo = GetgetStaticIpInfo;
+        mIfaceName = ifaceName;
+        // TODO Auto-generated constructor stub
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        mView = getLayoutInflater().inflate(R.layout.static_ip_dialog, null);
+        setView(mView);
+        setInverseBackgroundForced(true);
+
+        mIpAddressView = (TextView) mView.findViewById(R.id.ipaddress);
+        ipnetmask = (TextView) mView.findViewById(R.id.network_prefix_length);
+        mIPgateway = (TextView) mView.findViewById(R.id.gateway);
+        mdns1 = (TextView) mView.findViewById(R.id.dns1);
+        mdns2 = (TextView) mView.findViewById(R.id.dns2);
+
+        mIpAddressView.addTextChangedListener(this);
+        ipnetmask.addTextChangedListener(this);
+        mIPgateway.addTextChangedListener(this);
+        mdns1.addTextChangedListener(this);
+        mdns2.addTextChangedListener(this);
+
+        setButton(BUTTON_SUBMIT, mcontext.getString(R.string.ethernet_connect), mListener);
+        setButton(BUTTON_NEGATIVE, mcontext.getString(R.string.ethernet_cancel), mListener);
+        setTitle(mcontext.getString(R.string.ethernet_settings));
+
+        mEthManager = (EthernetManager) mcontext.getSystemService(Context.ETHERNET_SERVICE);
+
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        updateIpSettingsInfo();
+        checkIPValue();
+    }
+
+    private void updateIpSettingsInfo() {
+        Log.d("blb", "Static IP status updateIpSettingsInfo");
+        ContentResolver contentResolver = mcontext.getContentResolver();
+        String staticip = /*System.getString(contentResolver,System.ETHERNET_STATIC_IP);*/
+                mEthManager.getIpAddress(mIfaceName);
+        if (!TextUtils.isEmpty(staticip))
+            mIpAddressView.setText(staticip);
+
+        String ipmask = /*System.getString(contentResolver,System.ETHERNET_STATIC_NETMASK);*/
+                mEthManager.getNetmask(mIfaceName);
+        if (!TextUtils.isEmpty(ipmask))
+            ipnetmask.setText(ipmask);
+
+        String gateway = /*System.getString(contentResolver,System.ETHERNET_STATIC_GATEWAY);*/
+                mEthManager.getGateway(mIfaceName);
+        if (!TextUtils.isEmpty(gateway))
+            mIPgateway.setText(gateway);
+
+        String dns = /*System.getString(contentResolver,System.ETHERNET_STATIC_DNS1);*/
+                mEthManager.getDns(mIfaceName);
+        String mDns1 = nullIpInfo;
+        String mDns2 = nullIpInfo;
+        if ((dns != null) && (!dns.equals(""))) {
+            String data[] = dns.split(",");
+            mDns1 = data[0];
+            if (data.length > 1)
+                mDns2 = data[1];
+        }
+        if (!TextUtils.isEmpty(mDns1))
+            mdns1.setText(mDns1);
+        if (!TextUtils.isEmpty(mDns2))
+            mdns2.setText(mDns2);
+    }
+
+    public void saveIpSettingInfo() {
+        ContentResolver contentResolver = mcontext.getContentResolver();
+        String ipAddr = mIpAddressView.getText().toString();
+        String gateway = mIPgateway.getText().toString();
+        String netMask = ipnetmask.getText().toString();
+        String dns1 = mdns1.getText().toString();
+        String dns2 = mdns2.getText().toString();
+        int network_prefix_length = 24;// Integer.parseInt(ipnetmask.getText().toString());
+        mGetStaticInfo.getStaticIp(ipAddr);
+        mGetStaticInfo.getStaticNetMask(netMask);
+        mGetStaticInfo.getStaticGateway(gateway);
+        mGetStaticInfo.getStaticDns1(dns1);
+        mGetStaticInfo.getStaticDns2(dns2);
+    }
+
+    /*
+     * 返回 指定的 String 是否是 有效的 IP 地址.
+     */
+    private boolean isValidIpAddress(String value) {
+        int start = 0;
+        int end = value.indexOf('.');
+        int numBlocks = 0;
+
+        while (start < value.length()) {
+
+            if (-1 == end) {
+                end = value.length();
+            }
+
+            try {
+                int block = Integer.parseInt(value.substring(start, end));
+                if ((block > 255) || (block < 0)) {
+                    Log.w("EthernetIP",
+                            "isValidIpAddress() : invalid 'block', block = "
+                                    + block);
+                    return false;
+                }
+            } catch (NumberFormatException e) {
+                Log.w("EthernetIP", "isValidIpAddress() : e = " + e);
+                return false;
+            }
+
+            numBlocks++;
+
+            start = end + 1;
+            end = value.indexOf('.', start);
+        }
+        return numBlocks == 4;
+    }
+
+    public void checkIPValue() {
+
+        boolean enable = false;
+        String ipAddr = mIpAddressView.getText().toString();
+        String gateway = mIPgateway.getText().toString();
+        String dns1 = mdns1.getText().toString();
+        String dns2 = mdns2.getText().toString();
+        String netMask = ipnetmask.getText().toString();
+        Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$"); /*check subnet mask*/
+        if (isValidIpAddress(ipAddr) && isValidIpAddress(gateway)
+                && isValidIpAddress(dns1) && (pattern.matcher(netMask).matches())) {
+            if (TextUtils.isEmpty(dns2)) { // 为空可以不考虑
+                enable = true;
+            } else {
+                if (isValidIpAddress(dns2)) {
+                    enable = true;
+                } else {
+                    enable = false;
+                }
+            }
+        } else {
+            enable = false;
+        }
+        getButton(BUTTON_SUBMIT).setEnabled(enable);
+
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        checkIPValue();
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count,
+                                  int after) {
+        // work done in afterTextChanged
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+        // work done in afterTextChanged
+    }
+
+}
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettings.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettings.java
new file mode 100755
index 00000000000..ff7760974f3
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettings.java
@@ -0,0 +1,703 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.ethernet;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.net.InetAddresses;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.content.Intent;
+
+import androidx.preference.SwitchPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import java.util.regex.Pattern;
+import java.lang.Integer;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+
+import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+
+/*for 5.0*/
+import android.net.EthernetManager;
+import android.net.IpConfiguration;
+import android.net.IpConfiguration.IpAssignment;
+import android.net.IpConfiguration.ProxySettings;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.StaticIpConfiguration;
+//import android.net.NetworkUtils;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.widget.Toast;
+//import android.preference.ListPreference;
+//import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+
+import com.android.settings.ethernet.ethernet_static_ip_dialog;
+
+public class EthernetSettings extends SettingsPreferenceFragment
+        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener {
+    private static final String TAG = "EthernetSettings";
+
+    public enum ETHERNET_STATE {
+        ETHER_STATE_DISCONNECTED,
+        ETHER_STATE_CONNECTING,
+        ETHER_STATE_CONNECTED
+    }
+
+    private static final String KEY_ETH_IP_ADDRESS = "ethernet_ip_addr";
+    private static final String KEY_ETH_HW_ADDRESS = "ethernet_hw_addr";
+    private static final String KEY_ETH_NET_MASK = "ethernet_netmask";
+    private static final String KEY_ETH_GATEWAY = "ethernet_gateway";
+    private static final String KEY_ETH_DNS1 = "ethernet_dns1";
+    private static final String KEY_ETH_DNS2 = "ethernet_dns2";
+    private static final String KEY_ETH_MODE = "ethernet_mode_select";
+
+
+    private static String mEthHwAddress = null;
+    private static String mEthIpAddress = null;
+    private static String mEthNetmask = null;
+    private static String mEthGateway = null;
+    private static String mEthdns1 = null;
+    private static String mEthdns2 = null;
+    private final static String nullIpInfo = "0.0.0.0";
+
+    private ListPreference mkeyEthMode;
+    //    private SwitchPreference mEthCheckBox;
+    private CheckBoxPreference staticEthernet;
+
+    private final IntentFilter mIntentFilter;
+    IpConfiguration mIpConfiguration;
+    EthernetManager mEthManager;
+    StaticIpConfiguration mStaticIpConfiguration;
+    Context mContext;
+    private ethernet_static_ip_dialog mDialog;
+    private String mIfaceName;
+    private long mChangeTime;
+    private static final int SHOW_RENAME_DIALOG = 0;
+    private static final int ETHER_IFACE_STATE_DOWN = 0;
+    private static final int ETHER_IFACE_STATE_UP = 1;
+
+    private static final String FILE = "/sys/class/net/eth0/flags";
+    private static final int MSG_GET_ETHERNET_STATE = 0;
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            if (MSG_GET_ETHERNET_STATE == msg.what) {
+                handleEtherStateChange((ETHERNET_STATE) msg.obj);
+            }
+        }
+    };
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.WIFI_TETHER_SETTINGS;
+    }
+
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case SHOW_RENAME_DIALOG:
+                return MetricsEvent.WIFI_TETHER_SETTINGS;
+            default:
+                return 0;
+        }
+    }
+
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            log("Action " + action);
+            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
+                NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
+                Log.v(TAG, "===" + info.toString());
+                if (null != info && ConnectivityManager.TYPE_ETHERNET == info.getType()) {
+                    long currentTime = System.currentTimeMillis();
+                    int delayTime = 0;
+                    if (currentTime - mChangeTime < 1000) {
+                        delayTime = 2000;
+                    }
+                    if (NetworkInfo.State.CONNECTED == info.getState()) {
+                        handleEtherStateChange(ETHERNET_STATE.ETHER_STATE_CONNECTED, delayTime);
+                    } else if (NetworkInfo.State.DISCONNECTED == info.getState()) {
+                        handleEtherStateChange(ETHERNET_STATE.ETHER_STATE_DISCONNECTED, delayTime);
+                    }
+                }
+            }
+        }
+    };
+
+    public EthernetSettings() {
+        mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+    }
+
+    private void handleEtherStateChange(ETHERNET_STATE EtherState, long delayMillis) {
+        mHandler.removeMessages(MSG_GET_ETHERNET_STATE);
+        if (delayMillis > 0) {
+            Message msg = new Message();
+            msg.what = MSG_GET_ETHERNET_STATE;
+            msg.obj = EtherState;
+            mHandler.sendMessageDelayed(msg, delayMillis);
+        } else {
+            handleEtherStateChange(EtherState);
+        }
+    }
+
+    private void handleEtherStateChange(ETHERNET_STATE EtherState) {
+        log("curEtherState" + EtherState);
+
+        switch (EtherState) {
+            case ETHER_STATE_DISCONNECTED:
+                mEthHwAddress = nullIpInfo;
+                mEthIpAddress = nullIpInfo;
+                mEthNetmask = nullIpInfo;
+                mEthGateway = nullIpInfo;
+                mEthdns1 = nullIpInfo;
+                mEthdns2 = nullIpInfo;
+                break;
+            case ETHER_STATE_CONNECTING:
+                String mStatusString = this.getResources().getString(R.string.ethernet_info_getting);
+                mEthHwAddress = mStatusString;
+                mEthIpAddress = mStatusString;
+                mEthNetmask = mStatusString;
+                mEthGateway = mStatusString;
+                mEthdns1 = mStatusString;
+                mEthdns2 = mStatusString;
+                break;
+            case ETHER_STATE_CONNECTED:
+                getEthInfo();
+                break;
+        }
+
+        refreshUI();
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.ethernet_settings);
+
+        mContext = this.getActivity().getApplicationContext();
+        mEthManager = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
+
+        if (mEthManager == null) {
+            Log.e(TAG, "get ethernet manager failed");
+            Toast.makeText(mContext, R.string.disabled_low_ram_device, Toast.LENGTH_SHORT).show();
+            finish();
+            return;
+        }
+        String[] ifaces = mEthManager.getAvailableInterfaces();
+        if (ifaces.length > 0) {
+            mIfaceName = ifaces[0];//"eth0";
+        }
+        if (null == mIfaceName) {
+            Log.e(TAG, "get ethernet ifaceName failed");
+            Toast.makeText(mContext, R.string.add_network_cable, Toast.LENGTH_SHORT).show();
+            finish();
+        }
+    }
+
+    private Inet4Address getIPv4Address(String text) {
+        try {
+            return (Inet4Address)InetAddresses.parseNumericAddress(text);
+        } catch (IllegalArgumentException | ClassCastException e) {
+            return null;
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (null == mIfaceName) {
+            return;
+        }
+        if (mkeyEthMode == null) {
+            mkeyEthMode = (ListPreference) findPreference(KEY_ETH_MODE);
+            mkeyEthMode.setOnPreferenceChangeListener(this);
+        }
+    /*
+        if (mEthCheckBox== null) {
+            mEthCheckBox = (SwitchPreference) findPreference("ethernet");
+            mEthCheckBox.setOnPreferenceChangeListener(this);
+        }
+    */
+        //handleEtherStateChange(1 == getEthernetCarrierState(mIfaceName)? EthernetManager.ETHER_STATE_CONNECTED/*mEthManager.getEthernetConnectState()*/);
+        refreshUI();
+        log("resume");
+        mContext.registerReceiver(mReceiver, mIntentFilter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (null == mIfaceName) {
+            return;
+        }
+        mContext.unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mHandler.removeMessages(MSG_GET_ETHERNET_STATE);
+        log("destory");
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        log("stop");
+    }
+
+    private void setStringSummary(String preference, String value) {
+        try {
+            findPreference(preference).setSummary(value);
+        } catch (RuntimeException e) {
+            findPreference(preference).setSummary("");
+            log("can't find " + preference);
+        }
+    }
+
+    private String getStringFromPref(String preference) {
+        try {
+            return findPreference(preference).getSummary().toString();
+        } catch (RuntimeException e) {
+            return null;
+        }
+    }
+
+    private void refreshUI() {
+
+        //    setStringSummary(KEY_ETH_HW_ADDRESS,mEthHwAddress);
+
+        setStringSummary(KEY_ETH_IP_ADDRESS, mEthIpAddress);
+        setStringSummary(KEY_ETH_NET_MASK, mEthNetmask);
+        setStringSummary(KEY_ETH_GATEWAY, mEthGateway);
+        setStringSummary(KEY_ETH_DNS1, mEthdns1);
+        setStringSummary(KEY_ETH_DNS2, mEthdns2);
+        updateCheckbox();
+    }
+
+    private void updateCheckbox() {  //
+
+        if (mEthManager == null) {
+            mkeyEthMode.setSummary("null");
+        } else {
+            IpAssignment mode = mEthManager.getConfiguration(mIfaceName).getIpAssignment();
+            if (mode == IpAssignment.DHCP || mode == IpAssignment.UNASSIGNED) {
+                mkeyEthMode.setValue("DHCP");
+                mkeyEthMode.setSummary(R.string.usedhcp);
+            } else {
+                mkeyEthMode.setValue("StaticIP");
+                mkeyEthMode.setSummary(R.string.usestatic);
+            }
+/*            int isEnable = mEthManager.getEthernetIfaceState();
+            if(isEnable == ETHER_IFACE_STATE_UP) {
+                mEthCheckBox.setChecked(true);
+            }else{
+                mEthCheckBox.setChecked(false);
+            }
+*/
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        log("onPreferenceChange");
+        if (preference == mkeyEthMode) {
+            String value = (String) newValue;
+            if (value.equals("DHCP")) {
+                mChangeTime = System.currentTimeMillis();
+                handleEtherStateChange(ETHERNET_STATE.ETHER_STATE_CONNECTING);
+                IpConfiguration ipConfiguration = new IpConfiguration();
+                ipConfiguration.setIpAssignment(IpAssignment.DHCP);
+                ipConfiguration.setProxySettings(ProxySettings.NONE);
+                mEthManager.setConfiguration(mIfaceName, ipConfiguration);
+                SystemProperties.set("persist.xxxxx.ethernet_static","0");
+                SystemProperties.set("persist.xxxxx.ethernet_static_ip","");
+                SystemProperties.set("persist.xxxxx.ethernet_static_gateway","");
+                SystemProperties.set("persist.xxxxx.ethernet_static_mask","");
+                SystemProperties.set("persist.xxxxx.ethernet_static_dns1","");
+                SystemProperties.set("persist.xxxxx.ethernet_static_dns2","");
+                log("switch to dhcp");
+            } else if (value.equals("StaticIP")) {
+                log("static editor");
+                this.showDialog(SHOW_RENAME_DIALOG);
+            }
+
+        }
+        return true;
+    }
+
+    //将子网掩码转换成ip子网掩码形式,比如输入32输出为255.255.255.255
+    public String interMask2String(int prefixLength) {
+        String netMask = null;
+        int inetMask = prefixLength;
+
+        int part = inetMask / 8;
+        int remainder = inetMask % 8;
+        int sum = 0;
+
+        for (int i = 8; i > 8 - remainder; i--) {
+            sum = sum + (int) Math.pow(2, i - 1);
+        }
+
+        if (part == 0) {
+            netMask = sum + ".0.0.0";
+        } else if (part == 1) {
+            netMask = "255." + sum + ".0.0";
+        } else if (part == 2) {
+            netMask = "255.255." + sum + ".0";
+        } else if (part == 3) {
+            netMask = "255.255.255." + sum;
+        } else if (part == 4) {
+            netMask = "255.255.255.255";
+        }
+
+        return netMask;
+    }
+
+    /*
+     * convert subMask string to prefix length
+     */
+    private int maskStr2InetMask(String maskStr) {
+        StringBuffer sb;
+        String str;
+        int inetmask = 0;
+        int count = 0;
+        /*
+         * check the subMask format
+         */
+        Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$");
+        if (pattern.matcher(maskStr).matches() == false) {
+            Log.e(TAG, "subMask is error");
+            return 0;
+        }
+
+        String[] ipSegment = maskStr.split("\\.");
+        for (int n = 0; n < ipSegment.length; n++) {
+            sb = new StringBuffer(Integer.toBinaryString(Integer.parseInt(ipSegment[n])));
+            str = sb.reverse().toString();
+            count = 0;
+            for (int i = 0; i < str.length(); i++) {
+                i = str.indexOf("1", i);
+                if (i == -1)
+                    break;
+                count++;
+            }
+            inetmask += count;
+        }
+        return inetmask;
+    }
+
+    private boolean setStaticIpConfiguration() {
+        /*
+         * get ip address, netmask,dns ,gw etc.
+         */
+        Inet4Address inetAddr = getIPv4Address(this.mEthIpAddress);
+        int prefixLength = maskStr2InetMask(this.mEthNetmask);
+        InetAddress gatewayAddr = getIPv4Address(this.mEthGateway);
+        InetAddress dnsAddr = getIPv4Address(this.mEthdns1);
+
+        if (null == inetAddr || inetAddr.getAddress().toString().isEmpty()
+                || prefixLength == 0
+                || gatewayAddr.toString().isEmpty()
+                || dnsAddr.toString().isEmpty()) {
+            log("ip,mask or dnsAddr is wrong");
+            return false;
+        }
+
+        String dnsStr2 = this.mEthdns2;
+        ArrayList<InetAddress> dnsAddrs = new ArrayList<InetAddress>();
+        dnsAddrs.add(dnsAddr);
+        if (!dnsStr2.isEmpty()) {
+            dnsAddrs.add(getIPv4Address(dnsStr2));
+        }
+        mStaticIpConfiguration = new StaticIpConfiguration.Builder()
+                .setIpAddress(new LinkAddress(inetAddr, prefixLength))
+                .setGateway(gatewayAddr)
+                .setDnsServers(dnsAddrs)
+                .build();
+
+        mIpConfiguration = new IpConfiguration();
+        mIpConfiguration.setIpAssignment(IpAssignment.STATIC);
+        mIpConfiguration.setProxySettings(ProxySettings.NONE);
+        mIpConfiguration.setStaticIpConfiguration(mStaticIpConfiguration);
+        SystemProperties.set("persist.xxxxx.ethernet_static_ip",mEthIpAddress);
+        SystemProperties.set("persist.xxxxx.ethernet_static_gateway",mEthGateway);
+        SystemProperties.set("persist.xxxxx.ethernet_static_mask",mEthNetmask);
+        SystemProperties.set("persist.xxxxx.ethernet_static_dns1",mEthdns1);
+        SystemProperties.set("persist.xxxxx.ethernet_static_dns2",mEthdns2);
+        return true;
+    }
+
+    public void getEthInfoFromDhcp() {
+        String tempIpInfo;
+
+        tempIpInfo = /*SystemProperties.get("dhcp."+ iface +".ipaddress");*/
+                mEthManager.getIpAddress(mIfaceName);
+
+        if ((tempIpInfo != null) && (!tempIpInfo.equals(""))) {
+            mEthIpAddress = tempIpInfo;
+        } else {
+            mEthIpAddress = nullIpInfo;
+        }
+
+        tempIpInfo = /*SystemProperties.get("dhcp."+ iface +".mask");*/
+                mEthManager.getNetmask(mIfaceName);
+        if ((tempIpInfo != null) && (!tempIpInfo.equals(""))) {
+            mEthNetmask = tempIpInfo;
+        } else {
+            mEthNetmask = nullIpInfo;
+        }
+
+        tempIpInfo = /*SystemProperties.get("dhcp."+ iface +".gateway");*/
+                mEthManager.getGateway(mIfaceName);
+        if ((tempIpInfo != null) && (!tempIpInfo.equals(""))) {
+            mEthGateway = tempIpInfo;
+        } else {
+            mEthGateway = nullIpInfo;
+        }
+
+        tempIpInfo = /*SystemProperties.get("dhcp."+ iface +".dns1");*/
+                mEthManager.getDns(mIfaceName);
+        if ((tempIpInfo != null) && (!tempIpInfo.equals(""))) {
+            String data[] = tempIpInfo.split(",");
+            mEthdns1 = data[0];
+            if (data.length <= 1) {
+                mEthdns2 = nullIpInfo;
+            } else {
+                mEthdns2 = data[1];
+            }
+        } else {
+            mEthdns1 = nullIpInfo;
+        }
+    }
+
+    public void getEthInfoFromStaticIp() {
+        StaticIpConfiguration staticIpConfiguration = mEthManager.getConfiguration(mIfaceName).getStaticIpConfiguration();
+
+        if (staticIpConfiguration == null) {
+            return;
+        }
+        LinkAddress ipAddress = staticIpConfiguration.getIpAddress();
+        InetAddress gateway = staticIpConfiguration.getGateway();
+        List<InetAddress> dnsServers = staticIpConfiguration.getDnsServers();
+
+        if (ipAddress != null) {
+            mEthIpAddress = ipAddress.getAddress().getHostAddress();
+            mEthNetmask = interMask2String(ipAddress.getPrefixLength());
+        }
+        if (gateway != null) {
+            mEthGateway = gateway.getHostAddress();
+        }
+        mEthdns1 = dnsServers.get(0).getHostAddress();
+
+        if (dnsServers.size() > 1) { /* 只保留两个*/
+            mEthdns2 = dnsServers.get(1).getHostAddress();
+        }
+    }
+
+    /*
+     * TODO:
+     */
+    public void getEthInfo() {
+        /*
+        mEthHwAddress = mEthManager.getEthernetHwaddr(mEthManager.getEthernetIfaceName());
+        if (mEthHwAddress == null) mEthHwAddress = nullIpInfo;
+        */
+        IpAssignment mode = mEthManager.getConfiguration(mIfaceName).getIpAssignment();
+
+
+        if (mode == IpAssignment.DHCP || mode == IpAssignment.UNASSIGNED) {
+            /*
+             * getEth from dhcp
+             */
+            getEthInfoFromDhcp();
+        } else if (mode == IpAssignment.STATIC) {
+            /*
+             * TODO: get static IP
+             */
+            getEthInfoFromStaticIp();
+        }
+    }
+
+    /*
+     * tools
+     */
+    private void log(String s) {
+        Log.d(TAG, s);
+    }
+
+    @Override
+    public void onClick(DialogInterface dialogInterface, int button) {
+        if (button == ethernet_static_ip_dialog.BUTTON_SUBMIT) {
+            mDialog.saveIpSettingInfo(); //从Dialog获取静态数据
+            if (setStaticIpConfiguration()) {
+                mChangeTime = System.currentTimeMillis();
+                handleEtherStateChange(ETHERNET_STATE.ETHER_STATE_CONNECTING);
+                mEthManager.setConfiguration(mIfaceName, mIpConfiguration);
+                SystemProperties.set("persist.xxxxx.ethernet_static_kte","0");
+                SystemProperties.set("persist.xxxxx.ethernet_static","1");
+            } else {
+                Log.e(TAG, mIpConfiguration.toString());
+            }
+        }
+        updateCheckbox();
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        log("onCreateDialog " + dialogId);
+        switch (dialogId) {
+            case SHOW_RENAME_DIALOG:
+
+                mDialog = new ethernet_static_ip_dialog(getActivity(), false, this, mGetStaticIpInfo, mIfaceName);
+                return mDialog;
+        }
+        return super.onCreateDialog(dialogId);
+    }
+
+    /*interface*/
+
+    public getStaticIpInfo mGetStaticIpInfo = new getStaticIpInfo() {
+
+        public boolean getStaticIp(String ipAddr) {
+            mEthIpAddress = ipAddr;
+
+            log("ipAddr: " + ipAddr);
+            return true;
+        }
+
+        public boolean getStaticNetMask(String netMask) {
+            mEthNetmask = netMask;
+
+            log("netMask: " + netMask);
+            return true;
+        }
+
+        public boolean getStaticGateway(String gateway) {
+            mEthGateway = gateway;
+
+            log("gateway: " + gateway);
+            return true;
+        }
+
+        public boolean getStaticDns1(String dns1) {
+            mEthdns1 = dns1;
+
+            log("dns1: " + dns1);
+            return true;
+        }
+
+        public boolean getStaticDns2(String dns2) {
+            mEthdns2 = dns2;
+
+            log("dns2: " + dns2);
+            return true;
+        }
+    };
+
+    private String ReadFromFile(File file) {
+        if ((file != null) && file.exists()) {
+            try {
+                FileInputStream fin = new FileInputStream(file);
+                BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
+                String flag = reader.readLine();
+                fin.close();
+                return flag;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    private int getEthernetCarrierState(String iface) {
+        if (iface != "") {
+            try {
+                File file = new File("/sys/class/net/" + iface + "/carrier");
+                String carrier = ReadFromFile(file);
+                return Integer.parseInt(carrier);
+            } catch (Exception e) {
+                e.printStackTrace();
+                return 0;
+            }
+        } else {
+            return 0;
+        }
+    }
+
+    public static boolean isAvailable() {
+        return "true".equals(SystemProperties.get("ro.xxxxx.ethernet_settings"));
+    }
+}
\ No newline at end of file
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettingsPreferenceController.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettingsPreferenceController.java
new file mode 100755
index 00000000000..c9793e46b85
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/EthernetSettingsPreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.ethernet;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+public class EthernetSettingsPreferenceController extends AbstractPreferenceController implements
+        PreferenceControllerMixin {
+
+    private final String mEthernetSettingsKey;
+
+    public EthernetSettingsPreferenceController(Context context, String key) {
+        super(context);
+        mEthernetSettingsKey = key;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return EthernetSettings.isAvailable();
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return mEthernetSettingsKey;
+    }
+
+}
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/getStaticIpInfo.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/getStaticIpInfo.java
new file mode 100755
index 00000000000..396482af689
--- /dev/null
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/ethernet/getStaticIpInfo.java
@@ -0,0 +1,9 @@
+package com.android.settings.ethernet;
+
+public interface getStaticIpInfo {
+    public boolean getStaticIp(String ipAddr);
+    public boolean getStaticNetMask(String netMask);
+    public boolean getStaticGateway(String gateway);
+    public boolean getStaticDns1(String dns1);
+    public boolean getStaticDns2(String dns2);
+}
diff --git a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/NetworkDashboardFragment.java b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/NetworkDashboardFragment.java
old mode 100644
new mode 100755
index 197baae82a2..eb155879fea
--- a/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/system/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -46,7 +46,8 @@ import com.mediatek.settings.network.NetworkDataControllerPreferenceController;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
+//<dengli>@<20230412> for <add Ethernet>
+import com.android.settings.ethernet.EthernetSettings;
 @SearchIndexable
 public class NetworkDashboardFragment extends DashboardFragment implements
         MobilePlanPreferenceHost, OnActivityResultListener {
@@ -80,6 +81,11 @@ public class NetworkDashboardFragment extends DashboardFragment implements
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
         use(AllInOneTetherPreferenceController.class).initEnabler(getSettingsLifecycle());
+        //<dengli>@<20230412> for <add Ethernet>
+        if(!EthernetSettings.isAvailable()){
+           getPreferenceScreen().removePreference(findPreference("ethernet_settings"));
+        }
+        //<dengli>@<20230412> for <add Ethernet>
     }
 
     @Override

以上就是一个整体的修改,其中ro.xxxxx 和persist.xxxxx开头属性可以按需修改

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值