Skip to content

Commit

Permalink
更新V1.3.73
Browse files Browse the repository at this point in the history
- 修复无WIFI连接时,使用gateway标识符造成连接自身的问题
- 增加扫描局域网无线设备地址功能
- 增加取消激活功能
- 修复部分bug,提高体验
  • Loading branch information
mingzhixian committed Feb 15, 2024
1 parent d1c134f commit f2e60e3
Show file tree
Hide file tree
Showing 21 changed files with 334 additions and 144 deletions.
4 changes: 2 additions & 2 deletions easycontrol/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId "top.saymzx.easycontrol.app"
minSdk 21
targetSdk 34
versionCode 10372
versionName "1.3.72"
versionCode 10373
versionName "1.3.73"
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
}
Expand Down
3 changes: 1 addition & 2 deletions easycontrol/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
android:roundIcon="${app_icon_round}"
android:supportsRtl="true"
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar"
android:usesCleartextTraffic="true"
tools:targetApi="31">
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import android.util.Pair;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import top.saymzx.easycontrol.app.databinding.ActivityActiveBinding;
import top.saymzx.easycontrol.app.entity.AppData;
Expand All @@ -23,7 +22,8 @@ protected void onCreate(Bundle savedInstanceState) {
ViewTools.setLocale(this);
activeActivity = ActivityActiveBinding.inflate(this.getLayoutInflater());
setContentView(activeActivity.getRoot());
AppData.setting.setIsActive(false);
// 取消激活
if (AppData.setting.getIsActive()) deactivate();
setButtonListener();
// 绘制UI
drawUi();
Expand All @@ -42,20 +42,36 @@ private void setButtonListener() {
Pair<View, WindowManager.LayoutParams> loading = ViewTools.createLoading(this);
AppData.windowManager.addView(loading.first, loading.second);
new Thread(() -> {
boolean isOk = ActiveHelper.checkOk(activeKey);
boolean isOk = ActiveHelper.active(activeKey);
AppData.windowManager.removeView(loading.first);
AppData.uiHandler.post(() -> {
if (isOk) {
finish();
AppData.setting.setIsActive(true);
Toast.makeText(this, getString(R.string.active_button_success), Toast.LENGTH_SHORT).show();
PublicTools.startUrl(this, "https://gitee.com/mingzhixianweb/easycontrol/blob/master/HOW_TO_USE.md");
} else Toast.makeText(this, getString(R.string.active_button_error), Toast.LENGTH_SHORT).show();
PublicTools.logToast("active", getString(R.string.active_button_success), true);
} else PublicTools.logToast("active", getString(R.string.active_button_error), true);
});
}).start();
});
}

// 取消激活
private void deactivate() {
Pair<View, WindowManager.LayoutParams> loading = ViewTools.createLoading(this);
AppData.windowManager.addView(loading.first, loading.second);
new Thread(() -> {
boolean isOk = ActiveHelper.deactivate(AppData.setting.getActiveKey());
AppData.windowManager.removeView(loading.first);
AppData.uiHandler.post(() -> {
if (isOk) {
AppData.setting.setIsActive(false);
PublicTools.logToast("deactivate", getString(R.string.active_deactivate_success), true);
} else PublicTools.logToast("deactivate", getString(R.string.active_deactivate_error), true);
});
}).start();
}

@Override
public void onBackPressed() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,17 @@ public void onCreate(Bundle savedInstanceState) {
private void drawUi() {
// 添加IP
Pair<ArrayList<String>, ArrayList<String>> listPair = PublicTools.getIp();
Context context = this;
for (String i : listPair.first) {
ItemTextBinding text = ViewTools.createTextCard(context, i, () -> {
ItemTextBinding text = ViewTools.createTextCard(this, i, () -> {
AppData.clipBoard.setPrimaryClip(ClipData.newPlainText(ClipDescription.MIMETYPE_TEXT_PLAIN, i));
Toast.makeText(context, getString(R.string.ip_copy), Toast.LENGTH_SHORT).show();
Toast.makeText(this, getString(R.string.ip_copy), Toast.LENGTH_SHORT).show();
});
ipActivity.ipv4.addView(text.getRoot());
}
for (String i : listPair.second) {
ItemTextBinding text = ViewTools.createTextCard(context, i, () -> {
ItemTextBinding text = ViewTools.createTextCard(this, i, () -> {
AppData.clipBoard.setPrimaryClip(ClipData.newPlainText(ClipDescription.MIMETYPE_TEXT_PLAIN, i));
Toast.makeText(context, getString(R.string.ip_copy), Toast.LENGTH_SHORT).show();
Toast.makeText(this, getString(R.string.ip_copy), Toast.LENGTH_SHORT).show();
});
ipActivity.ipv6.addView(text.getRoot());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,32 @@

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Intent;
import android.media.MediaCodec;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.UUID;

import top.saymzx.easycontrol.app.client.decode.DecodecTools;
import top.saymzx.easycontrol.app.databinding.ActivityMainBinding;
import top.saymzx.easycontrol.app.databinding.ItemRequestPermissionBinding;
import top.saymzx.easycontrol.app.databinding.ItemScanAddressListBinding;
import top.saymzx.easycontrol.app.databinding.ItemTextBinding;
import top.saymzx.easycontrol.app.entity.AppData;
import top.saymzx.easycontrol.app.entity.Device;
import top.saymzx.easycontrol.app.helper.DeviceListAdapter;
import top.saymzx.easycontrol.app.helper.MyBroadcastReceiver;
import top.saymzx.easycontrol.app.helper.PublicTools;
import top.saymzx.easycontrol.app.helper.ViewTools;

public class MainActivity extends Activity {
Expand All @@ -40,6 +48,20 @@ public void onCreate(Bundle savedInstanceState) {
ViewTools.setLocale(this);
mainActivity = ActivityMainBinding.inflate(this.getLayoutInflater());
setContentView(mainActivity.getRoot());
// 检测权限
if (!checkPermission()) createAlert();
else startApp();
super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
myBroadcastReceiver.unRegister(this);
super.onDestroy();
}

// 启动步骤
private void startApp() {
// 检测激活
checkActive();
// 设置设备列表适配器
Expand All @@ -54,20 +76,8 @@ public void onCreate(Bundle savedInstanceState) {
myBroadcastReceiver.checkConnectedUsb(this);
// 启动默认设备
AppData.uiHandler.postDelayed(() -> myBroadcastReceiver.startDefault(this), 1000);
super.onCreate(savedInstanceState);
}

@Override
protected void onResume() {
// 检查权限
checkPermission();
super.onResume();
}

@Override
protected void onDestroy() {
myBroadcastReceiver.unRegister(this);
super.onDestroy();
// 开始扫描
if (AppData.setting.getAutoScanAddressOnStart()) scanAddress();
}

// 检测激活
Expand All @@ -76,23 +86,67 @@ private void checkActive() {
}

// 检查权限
private void checkPermission() {
private boolean checkPermission() {
// 检查悬浮窗权限,防止某些设备如鸿蒙不兼容
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.canDrawOverlays(this);
} catch (Exception ignored) {
return true;
}
}

// 创建Client加载框
private void createAlert() {
ItemRequestPermissionBinding requestPermissionView = ItemRequestPermissionBinding.inflate(LayoutInflater.from(this));
requestPermissionView.buttonGoToSet.setOnClickListener(v -> {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:$packageName"));
startActivity(intent);
Toast.makeText(this, getString(R.string.main_float_permission), Toast.LENGTH_SHORT).show();
}
} catch (Exception ignored) {
}
});
Dialog dialog = ViewTools.createDialog(this, false, requestPermissionView.getRoot());
dialog.show();
checkPermissionDelay(dialog);
}

// 定时检查
private void checkPermissionDelay(Dialog dialog) {
AppData.uiHandler.postDelayed(() -> {
if (checkPermission()) {
dialog.cancel();
startApp();
} else checkPermissionDelay(dialog);
}, 1000);
}

// 设置按钮监听
private void setButtonListener() {
mainActivity.buttonAdd.setOnClickListener(v -> ViewTools.createAddDeviceView(this, Device.getDefaultDevice(UUID.randomUUID().toString(), Device.TYPE_NORMAL), deviceListAdapter).show());
mainActivity.buttonScan.setOnClickListener(v -> scanAddress());
mainActivity.buttonAdd.setOnClickListener(v -> ViewTools.createDeviceDetailView(this, Device.getDefaultDevice(UUID.randomUUID().toString(), Device.TYPE_NORMAL), deviceListAdapter).show());
mainActivity.buttonSet.setOnClickListener(v -> startActivity(new Intent(this, SetActivity.class)));
}

// 扫描局域网地址
private void scanAddress() {
Pair<View, WindowManager.LayoutParams> loading = ViewTools.createLoading(this);
AppData.windowManager.addView(loading.first, loading.second);
new Thread(() -> {
ArrayList<String> scannedAddresses = PublicTools.scanAddress();
AppData.windowManager.removeView(loading.first);
AppData.uiHandler.post(() -> {
ItemScanAddressListBinding scanAddressListView = ItemScanAddressListBinding.inflate(LayoutInflater.from(this));
Dialog dialog = ViewTools.createDialog(this, true, scanAddressListView.getRoot());
for (String i : scannedAddresses) {
ItemTextBinding text = ViewTools.createTextCard(this, i, () -> {
AppData.clipBoard.setPrimaryClip(ClipData.newPlainText(ClipDescription.MIMETYPE_TEXT_PLAIN, i));
Toast.makeText(this, getString(R.string.ip_copy), Toast.LENGTH_SHORT).show();
});
scanAddressListView.list.addView(text.getRoot());
}
dialog.show();
});
}).start();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ private void drawDefault() {

// 绘制启动时操作
private void drawOnStart() {
setDetailActivity.setDetail.addView(ViewTools.createSwitchCard(this, getString(R.string.set_auto_back_on_start_default), getString(R.string.set_auto_back_on_start_default_detail), AppData.setting.getAutoBackOnStart(), isChecked -> AppData.setting.setAutoBackOnStart(isChecked)).getRoot());
setDetailActivity.setDetail.addView(ViewTools.createSwitchCard(this, getString(R.string.set_auto_back_after_start_default_on_start), getString(R.string.set_auto_back_after_start_default_on_start_detail), AppData.setting.getAutoBackOnStart(), isChecked -> AppData.setting.setAutoBackOnStart(isChecked)).getRoot());
setDetailActivity.setDetail.addView(ViewTools.createTextCard(this, getString(R.string.set_auto_clear_default), () -> {
AppData.setting.setDefaultDevice("");
Toast.makeText(this, getString(R.string.set_auto_clear_default_code), Toast.LENGTH_SHORT).show();
}).getRoot());
setDetailActivity.setDetail.addView(ViewTools.createSwitchCard(this, getString(R.string.set_auto_scan_address_on_start), getString(R.string.set_auto_scan_address_on_start_detail), AppData.setting.getAutoScanAddressOnStart(), isChecked -> AppData.setting.setAutoScanAddressOnStart(isChecked)).getRoot());
}

// 绘制连接时操作
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@ public void setAutoBackOnStart(boolean value) {
editor.apply();
}

public boolean getAutoScanAddressOnStart() {
return sharedPreferences.getBoolean("autoScanAddressStart", false);
}

public void setAutoScanAddressOnStart(boolean value) {
editor.putBoolean("autoScanAddressStart", value);
editor.apply();
}

public boolean getKeepAwake() {
return sharedPreferences.getBoolean("keepAwake", true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private void onLongClickCard(Device device) {
});
itemSetDeviceBinding.buttonChange.setOnClickListener(v -> {
dialog.cancel();
ViewTools.createAddDeviceView(context, device, this).show();
ViewTools.createDeviceDetailView(context, device, this).show();
});
itemSetDeviceBinding.buttonDelete.setOnClickListener(v -> {
AppData.dbHelper.delete(device);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import android.content.Context;
import android.content.Intent;
import android.net.DhcpInfo;
import android.net.Uri;
import android.util.Base64;
import android.util.DisplayMetrics;
Expand All @@ -16,9 +15,14 @@
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -99,20 +103,16 @@ public static Pair<ArrayList<String>, ArrayList<String>> getIp() {

// 获取网关地址
public static String getGateway() {
return decodeIntToIp(AppData.wifiManager.getDhcpInfo().gateway, 4);
int ip = AppData.wifiManager.getDhcpInfo().gateway;
// 没有wifi时,设置为1.1.1.1
if (ip == 0) ip = 16843009;
return decodeIntToIp(ip, 4);
}

// 获取子网地址
public static String getNetAddress() {
DhcpInfo dhcpInfo = AppData.wifiManager.getDhcpInfo();
int gateway = dhcpInfo.gateway;
int ipAddress = dhcpInfo.ipAddress;
// 因为dhcpInfo.netmask兼容性不好,部分设备获取值为0,所以此处使用对比方法
int len;
if (((gateway >> 8) & 0xff) == ((ipAddress >> 8) & 0xff)) len = 3;
else if (((gateway >> 16) & 0xff) == ((ipAddress >> 16) & 0xff)) len = 2;
else len = 1;
return decodeIntToIp(gateway, len);
// 因为此标识符使用场景有限,为了节省资源,默认地址为24位掩码地址
return decodeIntToIp(AppData.wifiManager.getDhcpInfo().gateway, 3);
}

// 解析地址
Expand Down Expand Up @@ -200,4 +200,30 @@ public static DisplayMetrics getScreenSize() {
return screenSize;
}

// 扫描局域网设备
public static ArrayList<String> scanAddress() {
ArrayList<String> scannedAddresses = new ArrayList<>();
String subnet = getNetAddress();
ExecutorService executor = Executors.newFixedThreadPool(128);
for (int i = 1; i <= 255; i++) {
String host = subnet + "." + i;
executor.execute(() -> {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, 5555), 1000);
socket.close();
scannedAddresses.add(host + ":5555");
} catch (Exception ignored) {
}
});
}
executor.shutdown();
try {
while (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
}
} catch (InterruptedException ignored) {
}
return scannedAddresses;
}

}
Loading

0 comments on commit f2e60e3

Please sign in to comment.