话不多说直接上补丁:
packages/modules/Connectivity/...目录下
//这里是能自定义IP补丁
diff --git a/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java b/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
index 4f616cdff..e1d370b9d 100644
--- a/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
+++ b/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
@@ -50,7 +50,9 @@ import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
-
+import android.util.Log;
+import android.os.SystemProperties;
+import java.net.UnknownHostException;
/**
* This class coordinate IP addresses conflict problem.
*
@@ -125,7 +127,7 @@ public class PrivateAddressCoordinator {
final ArrayList<IpPrefix> list = new ArrayList<>();
for (LinkAddress address : linkAddresses) {
if (!address.isIpv4()) continue;
-
+Log.i("myz","===PrivateAddressCoordinator.java=getIpv4Prefixes()==");
list.add(asIpPrefix(address));
}
@@ -186,6 +188,7 @@ public class PrivateAddressCoordinator {
final LinkAddress newAddress = chooseDownstreamAddress(prefixRange);
if (newAddress != null) {
mDownstreams.add(ipServer);
+ Log.i("myz","====PrivateAddressCoordinator.java===requestDownstreamAddress()=");
mCachedAddresses.put(ipServer.interfaceType(), newAddress);
return newAddress;
}
@@ -280,16 +283,33 @@ public class PrivateAddressCoordinator {
private LinkAddress getLinkAddress(final IpPrefix prefix, final int subAddress) {
if (prefix == null) return null;
-
- final InetAddress address = intToInet4AddressHTH(getPrefixBaseAddress(prefix) | subAddress);
+ Log.i("myz","====PrivateAddressCoordinator.java===getLinkAddress= subAddress11 = "+subAddress);
+ InetAddress address = intToInet4AddressHTH(getPrefixBaseAddress(prefix) | subAddress);
+ try {
+ String ChangeIp = SystemProperties.get("persist.tether.default.ipway", "192.168.20.1");
+ address=InetAddress.getByName(ChangeIp);
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Invalid address, shouldn't happen.", e);
+ }
+ Log.i("myz","====PrivateAddressCoordinator.java===getLinkAddress= subAddress222 = "+address.toString());
return new LinkAddress(address, PREFIX_LENGTH);
}
private IpPrefix findAvailablePrefixFromRange(final int start, final int end,
final int baseAddress, final int prefixRangeMask) {
+ Log.i("myz","===PrivateAddressCoordinator.java ==findAvailablePrefixFromRange()--start:"+start+"--end:"+end+"--baseAddress:"+baseAddress+"--prefixRangeMask:"+prefixRangeMask);
int newSubPrefix = start;
- while (newSubPrefix < end) {
- final InetAddress address = intToInet4AddressHTH(baseAddress | newSubPrefix);
+
+ // while (newSubPrefix < end) {
+ Log.i("myz","===PrivateAddressCoordinator.java ==findAvailablePrefixFromRange()=========");
+ InetAddress address = intToInet4AddressHTH(baseAddress | newSubPrefix);
+ try {
+ String ChangeIp = SystemProperties.get("persist.tether.default.ipway", "192.168.20.1");
+ address=InetAddress.getByName(ChangeIp);
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Invalid address, shouldn't happen.", e);
+ }
+ Log.i("myz","===PrivateAddressCoordinator.java ==findAvailablePrefixFromRange()=======address1111=="+address.toString());
final IpPrefix prefix = new IpPrefix(address, PREFIX_LENGTH);
final IpPrefix conflictPrefix = getConflictPrefix(prefix);
@@ -297,7 +317,7 @@ public class PrivateAddressCoordinator {
if (conflictPrefix == null) return prefix;
newSubPrefix = getNextSubPrefix(conflictPrefix, prefixRangeMask);
- }
+ // }
return null;
}
这里是设置的地方:
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5e4a2e6c43..ac8b0df624 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13785,4 +13785,14 @@
<!--add by lbb start,support backlight image-->
<string name="backlight_image">Backage Image</string>
<!--add by lbb start,support backlight image-->
+ <!-- 4G Route begin -->
+ <string name="g4_route_mode">4G Route</string>
+ <string name="g4_route_mode_open">Open</string>
+ <string name="g4_route_mode_close">Close</string>
+ <string name="g4_route_ip">4G Route Gateway</string>
+ <string name="g4_route_mask">4G Route Mask</string>
+ <string name="g4_route_mask_value">255.255.255.0</string>
+ <string name="g4_route_ip_value">192.168.20.1</string>
+ <string name="input_route_ip_title">Input Route Gateway</string>
+ <!-- 4G Route end -->
xml文件:
+ <SwitchPreference
+ android:key="g4_route"
+ android:title="@string/g4_route_mode"
+ android:summaryOff="@string/g4_route_mode_close"
+ android:summaryOn="@string/g4_route_mode_open"
+ android:persistent="false"
+ />
+ <Preference
+ android:key="g4_route_ip"
+ android:persistent="false"
+ android:summary="@string/g4_route_ip_value"
+ android:title="@string/g4_route_ip"
+ android:dependency="g4_route"/>
+
</PreferenceScreen>
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 1a21b5582a..189cde0eff 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -65,7 +65,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
-
+import android.util.Log;
/*
* Displays preferences for Tethering.
*/
@@ -102,7 +102,7 @@ public class TetherSettings extends RestrictedSettingsFragment
private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<>();
private Handler mHandler = new Handler();
- private OnStartTetheringCallback mStartTetheringCallback;
+ public OnStartTetheringCallback mStartTetheringCallback;
private ConnectivityManager mCm;
private EthernetManager mEm;
private TetheringEventCallback mTetheringEventCallback;
@@ -508,7 +508,7 @@ public class TetherSettings extends RestrictedSettingsFragment
}
}
- private void startTethering(int choice) {
+ public void startTethering(int choice) {
if (choice == TETHERING_BLUETOOTH) {
// Turn on Bluetooth first.
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -611,11 +611,11 @@ public class TetherSettings extends RestrictedSettingsFragment
}
};
- private static final class OnStartTetheringCallback extends
+ public static final class OnStartTetheringCallback extends
ConnectivityManager.OnStartTetheringCallback {
final WeakReference<TetherSettings> mTetherSettings;
- OnStartTetheringCallback(TetherSettings settings) {
+ public OnStartTetheringCallback(TetherSettings settings) {
mTetherSettings = new WeakReference<>(settings);
}
@@ -637,7 +637,7 @@ public class TetherSettings extends RestrictedSettingsFragment
}
}
- private final class TetheringEventCallback implements TetheringManager.TetheringEventCallback {
+ public final class TetheringEventCallback implements TetheringManager.TetheringEventCallback {
@Override
public void onTetheredInterfacesChanged(List<String> interfaces) {
Log.d(TAG, "onTetheredInterfacesChanged() interfaces : " + interfaces.toString());
diff --git a/src/com/android/settings/ethernet/EthernetSettings.java b/src/com/android/settings/ethernet/EthernetSettings.java
index 143e4762b0..0e649bb3f5 100644
--- a/src/com/android/settings/ethernet/EthernetSettings.java
+++ b/src/com/android/settings/ethernet/EthernetSettings.java
@@ -99,6 +99,24 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.ethernet.ethernet_static_ip_dialog;
+
+import java.io.DataOutputStream;
+import java.nio.charset.Charset;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.telephony.TelephonyManager;
+import android.net.wifi.WifiManager;
+import java.lang.reflect.Method;
+import android.annotation.SuppressLint;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import com.android.settings.TetherSettings;
+import android.net.ConnectivityManager;
+import android.content.DialogInterface;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.os.PowerManager;
+/*4G Route end */
public class EthernetSettings extends SettingsPreferenceFragment
implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener {
@@ -145,7 +163,17 @@ public class EthernetSettings extends SettingsPreferenceFragment
private static final String FILE = "/sys/class/net/eth0/flags";
private static final int MSG_GET_ETHERNET_STATE = 0;
-
+
+ /** 4g roue begin */
+ private static final String KEY_4G_ROUTE = "g4_route";
+ private static final String KEY_4G_ROUTE_IP = "g4_route_ip";
+ private SwitchPreference m4GRouteCheckBox;
+ Preference m4GRouteIp = null;
+ private TetherSettings mTetherSettings;
+ private TetherSettings.OnStartTetheringCallback mStartTetheringCallback;
+ private ConnectivityManager mCm;
+ /** 4g roue end */
+
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -247,7 +275,13 @@ public class EthernetSettings extends SettingsPreferenceFragment
addPreferencesFromResource(R.xml.ethernet_settings);
mContext = this.getActivity().getApplicationContext();
- mEthManager = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
+ /** 4G Route begin */
+ m4GRouteIp = (Preference) findPreference(KEY_4G_ROUTE_IP);
+ m4GRouteIp.setSummary(SystemProperties.get("persist.tether.default.ipway"));
+ //getPreferenceScreen().removePreference(m4GRouteIp);
+ mStartTetheringCallback = new TetherSettings.OnStartTetheringCallback(mTetherSettings);
+ /** 4G Route end */
+ mEthManager = (EthernetManager) getSystemService(mContext.ETHERNET_SERVICE);
if (mEthManager == null) {
Log.e(TAG, "get ethernet manager failed");
@@ -259,11 +293,16 @@ public class EthernetSettings extends SettingsPreferenceFragment
if (ifaces.length > 0) {
mIfaceName = ifaces[0];//"eth0";
}
+ String mode_a = SystemProperties.get("persist.net.ethernet.mode");
+ if(!mode_a.equals("normal")){
+ mIfaceName = "eth0";
+ }
if (null == mIfaceName) {
Log.e(TAG, "get ethernet ifaceName failed");
Toast.makeText(mContext, R.string.disabled_feature, Toast.LENGTH_SHORT).show();
finish();
}
+ mCm = (ConnectivityManager) getSystemService(mContext.CONNECTIVITY_SERVICE);
}
private Inet4Address getIPv4Address(String text) {
@@ -284,12 +323,20 @@ public class EthernetSettings extends SettingsPreferenceFragment
mkeyEthMode = (ListPreference) findPreference(KEY_ETH_MODE);
mkeyEthMode.setOnPreferenceChangeListener(this);
}
- /*
- if (mEthCheckBox== null) {
- mEthCheckBox = (SwitchPreference) findPreference("ethernet");
- mEthCheckBox.setOnPreferenceChangeListener(this);
- }
- */
+
+
+
+ /** 4G Route begin */
+ if (m4GRouteCheckBox == null) {
+ m4GRouteCheckBox = (SwitchPreference) findPreference(KEY_4G_ROUTE);
+ m4GRouteCheckBox.setOnPreferenceChangeListener(this);
+ Log.i("myz","==onResume()=");
+ //getPreferenceScreen().removePreference(m4GRouteCheckBox);
+ }
+ /** 4G Route end */
+
+ /*add by lrm end,surport for ethernet switch button and show eth mac address. 2021-06-12*/
+
//handleEtherStateChange(1 == getEthernetCarrierState(mIfaceName)? EthernetManager.ETHER_STATE_CONNECTED/*mEthManager.getEthernetConnectState()*/);
refreshUI();
log("resume");
@@ -337,7 +384,6 @@ public class EthernetSettings extends SettingsPreferenceFragment
private void refreshUI() {
- // setStringSummary(KEY_ETH_HW_ADDRESS,mEthHwAddress);
setStringSummary(KEY_ETH_IP_ADDRESS, mEthIpAddress);
setStringSummary(KEY_ETH_NET_MASK, mEthNetmask);
@@ -360,14 +406,22 @@ public class EthernetSettings extends SettingsPreferenceFragment
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);
- }
-*/
- }
+
+
+ }
+ /** 4G Route begin */
+ if (m4GRouteCheckBox != null) {
+ String mode = SystemProperties.get("persist.net.ethernet.mode");
+ if (mode.equals("normal")) {
+ m4GRouteCheckBox.setChecked(false);
+ Log.i("myz","==updateCheckbox()===normal===");
+ } else {
+ m4GRouteCheckBox.setChecked(true);
+ Log.i("myz","==updateCheckbox()======");
+ }
+ }
+ /** 4G Route end */
+
}
@Override
@@ -391,7 +445,107 @@ public class EthernetSettings extends SettingsPreferenceFragment
}
return true;
}
-
+ /*add by lrm start,surport for ethernet switch button and show eth mac address. 2021-06-12*/
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+
+ /** 4G Route begin */
+ if (preference == m4GRouteCheckBox) {
+ boolean newState = m4GRouteCheckBox.isChecked();
+ handleClickRoute(newState);
+ Log.i("myz","==onPreferenceTreeClick()======");
+ }
+ if (preference == m4GRouteIp) {
+ showCustomizeDialog();
+ }
+ /** 4G Route end */
+ return super.onPreferenceTreeClick(preference);
+ }
+ /*add by lrm end,surport for ethernet switch button and show eth mac address. 2021-06-12*/
+ @SuppressLint("WrongConstant")
+ private void showCustomizeDialog() {
+ AlertDialog.Builder customizeDialog = new AlertDialog.Builder(getActivity());
+ final View dialogView = LayoutInflater.from(getActivity())
+ .inflate(R.layout.dialog_customize,null);
+ EditText edit_text = (EditText) dialogView.findViewById(R.id.edit_text);
+ edit_text.setHint(SystemProperties.get("persist.tether.default.ipway"));
+ customizeDialog.setTitle(getActivity().getResources().getString(R.string.input_route_ip_title));
+ customizeDialog.setView(dialogView);
+ customizeDialog.setCancelable(false);
+ customizeDialog.setPositiveButton(getActivity().getResources().getString(R.string.update_system_dialog_ok),
+ (dialog, which) -> {
+ String inputIp = edit_text.getText().toString();
+ Log.i("MainActivity", "mIsLegitimate: " + ipCheck(inputIp));
+ if (ipCheck(inputIp)) {
+ //SystemProperties.set("persist.tether.default.ipway", inputIp);
+ //m4GRouteIp.setSummary(inputIp);
+ /*mCm.stopTethering(TETHERING_ETHERNET);
+ //mEthManager.setEthernetEnabled(false);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ //mEthManager.setEthernetEnabled(true);
+ mCm.startTethering(TETHERING_ETHERNET, true, mStartTetheringCallback, null);
+ */
+ showRebootDialog(inputIp);
+ }
+ });
+ customizeDialog.setNegativeButton(getActivity().getResources().getString(R.string.update_system_dialog_cancel), (dialogInterface, i) -> {
+
+ });
+ customizeDialog.show();
+ }
+
+ Dialog rebootDialog;
+ private void showRebootDialog(String inputIp) {
+ if (rebootDialog != null) {
+ rebootDialog.dismiss();
+ }
+ rebootDialog = new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.dlg_confirm_reboot_title)
+ .setMessage(R.string.dlg_confirm_reboot_text)
+ .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ SystemProperties.set("persist.tether.default.ipway", inputIp);
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ pm.reboot("resolution");
+ }})
+ .setNegativeButton(R.string.cancel, null).create();
+ rebootDialog.show();
+ }
+
+
+
+ public boolean ipCheck(String text) {
+ if (text != null && !text.isEmpty()) {
+ String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
+ if (text.matches(regex)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /** 4G Route begin */
+ private void handleClickRoute(boolean newState) {
+ SystemProperties.set("persist.net.ethernet.mode", newState ? "bridge" : "normal");
+ if(newState){
+ Log.i("myz","==handleClickRoute()======");
+ mCm.startTethering(TETHERING_ETHERNET, true, mStartTetheringCallback, null);
+ }else{
+ Log.i("myz","==handleClickRoute()======");
+ mCm.stopTethering(TETHERING_ETHERNET);
+ }
+ }
+
//将子网掩码转换成ip子网掩码形式,比如输入32输出为255.255.255.255
public String interMask2String(int prefixLength) {
String netMask = null;
diff --git a/src/com/android/settings/receivers/OtaBroadcastReceiver.java b/src/com/android/settings/receivers/OtaBroadcastReceiver.java
index b051c73103..bbadc9497a 100755
--- a/src/com/android/settings/receivers/OtaBroadcastReceiver.java
+++ b/src/com/android/settings/receivers/OtaBroadcastReceiver.java
@@ -12,14 +12,16 @@ import android.provider.Settings;
import android.provider.Settings;
import java.io.File;
import android.util.Log;
-
+import android.os.SystemProperties;
// add by lbb, support for U disk update 2021,07,15
import java.util.List;
import java.lang.reflect.Method;
import android.os.storage.StorageManager;
import android.app.Activity;
-
-
+import com.android.settings.ethernet.EthernetSettings;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import com.android.settings.TetherSettings;
+import android.net.ConnectivityManager;
public class OtaBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "OtaBroadcastReceiver";
@@ -30,11 +32,17 @@ public class OtaBroadcastReceiver extends BroadcastReceiver {
private final static String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
private Context mContext;
+ private EthernetSettings mEthernetSetting;
+ private TetherSettings mTetherSettings;
+ private TetherSettings.OnStartTetheringCallback mStartTetheringCallback;
+ private ConnectivityManager mCm;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
mContext = context;
+ mStartTetheringCallback = new TetherSettings.OnStartTetheringCallback(mTetherSettings);
+ mCm = (ConnectivityManager) context.getSystemService(mContext.CONNECTIVITY_SERVICE);
// add by lbb start, get U disk path 2021,07,15
File USBupdateFile = new File(getUSBPath(context) + "/update.zip");
String USBPath = getUSBPath(context) + "/update.zip";
@@ -44,6 +52,18 @@ public class OtaBroadcastReceiver extends BroadcastReceiver {
Log.i(TAG, "----action: " + action);
if (BOOT_COMPLETED.equals(action)) {
// add by lrm start, Support to delete the upgrade package after the upgrade
+ String mode_1 = SystemProperties.get("persist.net.ethernet.mode");
+ if (mode_1.equals("normal")) {
+ mCm.stopTethering(TETHERING_ETHERNET);
+ } else {
+ /* mCm.stopTethering(TETHERING_ETHERNET);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }*/
+ mCm.startTethering(TETHERING_ETHERNET, true, mStartTetheringCallback, null);
+ }
int update_state = Settings.System.getInt(mContext.getContentResolver(), "update_state", 0);
Log.i(TAG, "----update_state: " + update_state);
if (update_state == 1) {