├── app ├── .gitignore ├── .DS_Store ├── src │ ├── main │ │ ├── .DS_Store │ │ ├── ic_launcher-web.png │ │ ├── res │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── icon_back.png │ │ │ │ ├── icon_menu.png │ │ │ │ ├── icon_next.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── icon_cancel.png │ │ │ │ ├── icon_connect.png │ │ │ │ ├── icon_folder.png │ │ │ │ ├── icon_select.png │ │ │ │ ├── icon_setting.png │ │ │ │ ├── icon_last_page.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_launcher_web.png │ │ │ │ ├── icon_disconnect.png │ │ │ │ ├── icon_new_folder.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── styles.xml │ │ │ │ ├── colors.xml │ │ │ │ └── strings.xml │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── icon_down.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable │ │ │ │ ├── ripple_bg.xml │ │ │ │ └── socket_spinner_bg.xml │ │ │ ├── layout │ │ │ │ ├── item_socket_spinner.xml │ │ │ │ ├── activity_history.xml │ │ │ │ ├── item_history.xml │ │ │ │ ├── item_file.xml │ │ │ │ ├── activity_setting.xml │ │ │ │ ├── activity_select_folder.xml │ │ │ │ ├── activity_tcp_server_setting.xml │ │ │ │ ├── activity_ping.xml │ │ │ │ ├── activity_main.xml │ │ │ │ └── activity_tcp_client_setting.xml │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ └── values-en │ │ │ │ └── strings.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── dlong │ │ │ │ └── networkdebugassistant │ │ │ │ ├── bean │ │ │ │ ├── TcpServerConfiguration.kt │ │ │ │ ├── TcpClientConfiguration.kt │ │ │ │ ├── UdpBroadConfiguration.kt │ │ │ │ ├── FolderInfo.kt │ │ │ │ ├── UdpMultiConfiguration.kt │ │ │ │ ├── ReceiveInfo.kt │ │ │ │ ├── HistoryInfo.kt │ │ │ │ └── BaseConfiguration.kt │ │ │ │ ├── app │ │ │ │ ├── MyApp.kt │ │ │ │ └── BaseHandler.kt │ │ │ │ ├── db │ │ │ │ ├── dao │ │ │ │ │ └── HistoryDao.kt │ │ │ │ └── HistoryDB.kt │ │ │ │ ├── utils │ │ │ │ ├── SpfUtils.kt │ │ │ │ ├── NetUtils.kt │ │ │ │ ├── AssetsUtils.kt │ │ │ │ ├── AppUtils.kt │ │ │ │ ├── ByteUtils.kt │ │ │ │ ├── StringUtils.kt │ │ │ │ ├── DateUtils.kt │ │ │ │ └── FileProviderUtils.java │ │ │ │ ├── model │ │ │ │ └── HistoryModel.kt │ │ │ │ ├── activity │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── UdpBroadActivity.kt │ │ │ │ ├── TcpClientActivity.kt │ │ │ │ ├── UdpMultiActivity.kt │ │ │ │ ├── SettingActivity.kt │ │ │ │ ├── PingActivity.kt │ │ │ │ ├── TcpServerActivity.kt │ │ │ │ ├── TcpServerSettingActivity.kt │ │ │ │ ├── HistoryActivity.kt │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── TcpClientSettingActivity.kt │ │ │ │ ├── BaseSettingActivity.kt │ │ │ │ ├── UdpBroadSettingActivity.kt │ │ │ │ └── UdpMultiSettingActivity.kt │ │ │ │ ├── adapter │ │ │ │ ├── FolderAdapter.kt │ │ │ │ └── HistoryAdapter.kt │ │ │ │ └── constant │ │ │ │ └── DBConstant.kt │ │ ├── assets │ │ │ └── readme.json │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── dlong │ │ │ └── networkdebugassistant │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── dlong │ │ └── networkdebugassistant │ │ └── ExampleInstrumentedTest.kt ├── dlong0232372.keystore ├── build.gradle └── proguard-rules.pro ├── dl10netassistant ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── java │ └── com │ └── d10ng │ └── net │ └── assistant │ ├── NetUtils.kt │ ├── TcpClientThread.kt │ ├── UdpBroadThread.kt │ ├── UdpMultiThread.kt │ ├── BaseNetThread.kt │ └── TcpServerThread.kt ├── dlong.keystore ├── private_key.pepk ├── networkdebugassistant-logo.png ├── networkdebugassistant-logo.psd ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── networkdebugassistant-logo-512.png ├── .gitignore ├── settings.gradle.kts ├── gradle.properties ├── gradlew.bat ├── gradlew └── README.md /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /dl10netassistant/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/.DS_Store -------------------------------------------------------------------------------- /dlong.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/dlong.keystore -------------------------------------------------------------------------------- /private_key.pepk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/private_key.pepk -------------------------------------------------------------------------------- /app/src/main/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/.DS_Store -------------------------------------------------------------------------------- /app/dlong0232372.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/dlong0232372.keystore -------------------------------------------------------------------------------- /networkdebugassistant-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/networkdebugassistant-logo.png -------------------------------------------------------------------------------- /networkdebugassistant-logo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/networkdebugassistant-logo.psd -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /networkdebugassistant-logo-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/networkdebugassistant-logo-512.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_back.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_menu.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_next.png -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/icon_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/drawable-xxxhdpi/icon_down.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_cancel.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_connect.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_folder.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_select.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_setting.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_last_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_last_page.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_web.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_disconnect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_disconnect.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/icon_new_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/icon_new_folder.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D10NGYANG/NetworkDebugAssistant/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #AAAAAA 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | local.properties 11 | /*/build 12 | /*/.idea 13 | /*/.gradle 14 | /*/release 15 | /*/debug 16 | /app/*/release 17 | /app/*/debug 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jul 27 14:57:12 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/TcpServerConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.jsonentitylib.annotation.DLField 4 | 5 | /** 6 | * tcp 服务器配置 7 | * 8 | * @author D10NG 9 | * @date on 2019-12-10 10:48 10 | */ 11 | data class TcpServerConfiguration( 12 | /** 本地端口 */ 13 | @DLField 14 | var localPort: Int = 8089 15 | ) : BaseConfiguration() { 16 | } -------------------------------------------------------------------------------- /app/src/test/java/com/dlong/networkdebugassistant/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_socket_spinner.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | jcenter() 14 | maven("https://jitpack.io") 15 | } 16 | } 17 | 18 | rootProject.name = "NetworkDebugAssistant" 19 | include(":app") 20 | include(":dl10netassistant") 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/TcpClientConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.jsonentitylib.annotation.DLField 4 | 5 | /** 6 | * Tcp 客户端配置 7 | * 8 | * @author D10NG 9 | * @date on 2019-12-09 14:44 10 | */ 11 | data class TcpClientConfiguration( 12 | 13 | /** 服务器地址 */ 14 | @DLField 15 | var serverIpAddress: String = "192.168.1.11", 16 | 17 | /** 服务器端口 */ 18 | @DLField 19 | var serverPort: Int = 8126 20 | ) : BaseConfiguration() { 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/app/MyApp.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.app 2 | 3 | import android.app.Application 4 | import com.dlong.networkdebugassistant.R 5 | import com.simple.spiderman.SpiderMan 6 | 7 | /** 8 | * @author D10NG 9 | * @date on 2019-12-05 10:17 10 | */ 11 | class MyApp : Application() { 12 | 13 | override fun onCreate() { 14 | super.onCreate() 15 | 16 | //调试工具初始化 17 | SpiderMan.init(this) //设置主题样式,内置了两种主题样式light和dark 18 | .setTheme(R.style.SpiderManTheme_Dark) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/UdpBroadConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.jsonentitylib.annotation.DLField 4 | 5 | /** 6 | * Udp广播配置 7 | * 8 | * @author D10NG 9 | * @date on 2019-12-05 15:11 10 | */ 11 | data class UdpBroadConfiguration ( 12 | 13 | /** 本地端口 */ 14 | @DLField 15 | var localPort: Int = 8089, 16 | 17 | /** 目标地址 */ 18 | @DLField 19 | var targetIpAddress: String = "255.255.255.255", 20 | 21 | /** 目标端口 */ 22 | @DLField 23 | var targetPort: Int = 8089 24 | 25 | ) : BaseConfiguration() { 26 | } -------------------------------------------------------------------------------- /app/src/main/assets/readme.json: -------------------------------------------------------------------------------- 1 | {"0.0.1":{"content":["创建工程;"],"author":"dlong","time":"2019.12.05"},"0.1.2":{"content":["适配Android10深色模式;"],"author":"dlong","time":"2020.03.18"},"0.1.4":{"content":["优化代码;","修复BUG;"],"author":"dlong","time":"2020.08.12"},"0.1.6":{"content":["TCP服务器增加单独Socket断开方法;","增加PING功能;","优化IP地址刷新;"],"author":"dlong","time":"2021.02.24"},"0.1.1":{"content":["完成全部功能与测试;","修改UI布局;","优化架构;","调整TCP的连接状态响应逻辑;"],"author":"dlong","time":"2019.12.10"},"0.1.3":{"content":["优化发送数据功能;","抽离UDP、TCP功能为单独库;"],"author":"dlong","time":"2020.07.27"},"0.1.5":{"content":["优化代码;","修复TCP服务器关闭后无法再打开的问题;"],"author":"dlong","time":"2020.10.17"}} -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/FolderInfo.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.networkdebugassistant.R 4 | import java.io.Serializable 5 | 6 | /** 7 | * 文件夹信息 8 | * 9 | * @author D10NG 10 | * @date on 2019-12-06 10:04 11 | */ 12 | data class FolderInfo( 13 | /** 图标 */ 14 | var iconRes: Int = R.mipmap.icon_folder, 15 | /** 名称 */ 16 | var name: String = "", 17 | /** 子文件个数 */ 18 | var sonNum: Long = 0L, 19 | /** 最后修改时间 */ 20 | var lastEditTime: String = "", 21 | /** 路径 */ 22 | var path: String = "" 23 | ) : Serializable { 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/UdpMultiConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.jsonentitylib.annotation.DLField 4 | 5 | /** 6 | * Udp 组播配置 7 | * 8 | * @author D10NG 9 | * @date on 2019-12-09 10:49 10 | */ 11 | data class UdpMultiConfiguration( 12 | /** 本地端口 */ 13 | @DLField 14 | var localPort: Int = 4032, 15 | 16 | /** 目标多播地址 224.0.0.0 ~ 239.255.255.255 */ 17 | @DLField 18 | var targetIpAddress: String = "234.255.255.255", 19 | 20 | /** 目标端口 */ 21 | @DLField 22 | var targetPort: Int = 4032 23 | 24 | ) : BaseConfiguration() { 25 | } -------------------------------------------------------------------------------- /dl10netassistant/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.jetbrains.kotlin.jvm") 3 | id(Kotlin.Plugin.ID.kapt) 4 | id(Maven.Plugin.public) 5 | } 6 | 7 | group = "com.github.D10NGYANG" 8 | version = "1.0" 9 | 10 | java { 11 | sourceCompatibility = JavaVersion.VERSION_1_8 12 | targetCompatibility = JavaVersion.VERSION_1_8 13 | } 14 | 15 | dependencies { 16 | implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_ver") 17 | 18 | // 协程 19 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") 20 | } 21 | 22 | publishing { 23 | publications { 24 | create("release", MavenPublication::class) { 25 | from(components.getByName("java")) 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/db/dao/HistoryDao.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.db.dao 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.room.* 5 | import com.dlong.networkdebugassistant.bean.HistoryInfo 6 | 7 | /** 8 | * @author D10NG 9 | * @date on 2019-12-07 11:13 10 | */ 11 | @Dao 12 | interface HistoryDao { 13 | 14 | // 查询所有数据 15 | @Query("SELECT * FROM history_table ORDER BY time desc") 16 | fun getAllData() : LiveData> 17 | 18 | // 插入 19 | @Insert(onConflict = OnConflictStrategy.REPLACE) 20 | suspend fun insert(info: HistoryInfo): Long 21 | 22 | // 修改 23 | @Update(onConflict = OnConflictStrategy.REPLACE) 24 | suspend fun update(info: HistoryInfo) 25 | 26 | // 删除 27 | @Delete 28 | suspend fun delete(info: HistoryInfo) 29 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/dlong/networkdebugassistant/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.dlong.networkdebugassistant", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/app/BaseHandler.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.app 2 | 3 | import android.os.Handler 4 | import android.os.Message 5 | 6 | import androidx.appcompat.app.AppCompatActivity 7 | 8 | import java.lang.ref.WeakReference 9 | 10 | /** 11 | * 封装Handler子类 12 | * $ 解决handler内存泄漏问题 13 | * 14 | * @author D10NG 15 | * @date on 2019-09-28 11:11 16 | */ 17 | class BaseHandler(c: AppCompatActivity, private val callBack: BaseHandlerCallBack) : Handler() { 18 | 19 | private val act: WeakReference = WeakReference(c) 20 | 21 | override fun handleMessage(msg: Message) { 22 | super.handleMessage(msg) 23 | val c = act.get() 24 | if (c != null) { 25 | callBack.callBack(msg) 26 | } 27 | } 28 | 29 | interface BaseHandlerCallBack { 30 | fun callBack(msg: Message) 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/utils/SpfUtils.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.utils 2 | 3 | import android.content.Context 4 | import android.content.SharedPreferences 5 | 6 | /** 7 | * 轻量键值参数存储 8 | * 9 | * @author D10NG 10 | * @date on 2019-11-07 15:26 11 | */ 12 | class SpfUtils constructor(context: Context) { 13 | 14 | private val mSpf = context.getSharedPreferences("config_data", Context.MODE_PRIVATE) 15 | 16 | companion object { 17 | 18 | @Volatile 19 | private var INSTANCE: SpfUtils? = null 20 | 21 | @JvmStatic 22 | fun getInstance(context: Context) : SpfUtils = 23 | INSTANCE?: synchronized(this) { 24 | INSTANCE?: SpfUtils(context).also { 25 | INSTANCE = it 26 | } 27 | } 28 | } 29 | 30 | fun getSpf() : SharedPreferences { 31 | return mSpf 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/socket_spinner_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #CC3333 4 | #CC3333 5 | #4D88FF 6 | 7 | #aaaaaa 8 | #dddddd 9 | #ffffff 10 | 11 | #BF000000 12 | 13 | 14 | #4D88FF 15 | #222222 16 | #444444 17 | #666666 18 | #FF0000 19 | #ffff00 20 | 21 | 22 | #eeeeee 23 | #cccccc 24 | #eeeeee 25 | #cccccc 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/ReceiveInfo.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import java.io.Serializable 4 | 5 | /** 6 | * 接收到的信息实体类 7 | * 8 | * @author D10NG 9 | * @date on 2019-12-06 15:03 10 | */ 11 | data class ReceiveInfo( 12 | /** 字节数据 */ 13 | var byteData: ByteArray = byteArrayOf(), 14 | /** 时间 */ 15 | var time: Long = 0L, 16 | /** 地址 */ 17 | var ipAddress: String = "", 18 | /** 端口 */ 19 | var port: Int = 0 20 | ) : Serializable { 21 | 22 | 23 | override fun equals(other: Any?): Boolean { 24 | if (this === other) return true 25 | if (javaClass != other?.javaClass) return false 26 | 27 | other as ReceiveInfo 28 | 29 | if (!byteData.contentEquals(other.byteData)) return false 30 | if (time != other.time) return false 31 | if (ipAddress != other.ipAddress) return false 32 | if (port != other.port) return false 33 | return true 34 | } 35 | 36 | override fun hashCode(): Int { 37 | return (byteData.contentHashCode() + time + ipAddress.hashCode() + port).toInt() 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #8F2424 4 | #8F2424 5 | #4D88FF 6 | 7 | #111111 8 | #333333 9 | #ffffff 10 | 11 | #BF000000 12 | 13 | 14 | #4D88FF 15 | #ffffff 16 | #dddddd 17 | #aaaaaa 18 | #FF0000 19 | #ffff00 20 | 21 | 22 | #333333 23 | #444444 24 | #555555 25 | #666666 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/utils/NetUtils.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.utils 2 | 3 | import java.net.Inet4Address 4 | import java.net.InetAddress 5 | import java.net.NetworkInterface 6 | import java.util.* 7 | 8 | 9 | /** 10 | * @author D10NG 11 | * @date on 2019-12-10 14:37 12 | */ 13 | object NetUtils { 14 | 15 | /** 16 | * 获取内网IP地址 17 | */ 18 | val localIPAddress: String 19 | get() { 20 | val en: Enumeration = NetworkInterface.getNetworkInterfaces() 21 | while (en.hasMoreElements()) { 22 | val intf: NetworkInterface = en.nextElement() 23 | val enumIpAddr: Enumeration = intf.inetAddresses 24 | while (enumIpAddr.hasMoreElements()) { 25 | val inetAddress: InetAddress = enumIpAddr.nextElement() 26 | if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) { 27 | return inetAddress.hostAddress.toString() 28 | } 29 | } 30 | } 31 | return "null" 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/utils/AssetsUtils.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.utils 2 | 3 | import android.content.Context 4 | import java.io.BufferedReader 5 | import java.io.InputStreamReader 6 | 7 | /** 8 | * Assets资源读取工具 9 | * 10 | * @author D10NG 11 | * @date on 2019-10-31 09:54 12 | */ 13 | object AssetsUtils { 14 | 15 | /** 16 | * 读取成字符串 17 | * @param context 18 | * @param fileName 19 | * @return 20 | */ 21 | fun getJsonString(context: Context, fileName: String): String { 22 | val stringBuilder = StringBuilder() 23 | //获取assets资源管理器 24 | val assetManager = context.assets 25 | //通过管理器打开文件并读取 26 | val bf = BufferedReader( 27 | InputStreamReader( 28 | assetManager.open(fileName) 29 | ) 30 | ) 31 | var line: String? 32 | do { 33 | line = bf.readLine() 34 | if (line != null) { 35 | stringBuilder.append(line) 36 | } else { 37 | break 38 | } 39 | } while (true) 40 | bf.close() 41 | return stringBuilder.toString() 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/HistoryInfo.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import android.widget.TextView 4 | import androidx.databinding.BindingAdapter 5 | import androidx.room.Entity 6 | import androidx.room.Index 7 | import androidx.room.PrimaryKey 8 | import com.dlong.jsonentitylib.BaseJsonEntity 9 | import com.dlong.jsonentitylib.annotation.DLField 10 | import com.dlong.networkdebugassistant.utils.DateUtils 11 | 12 | /** 13 | * 历史发送 14 | * 15 | * @author D10NG 16 | * @date on 2019-12-07 11:05 17 | */ 18 | @Entity(tableName = "history_table", indices = [Index(value = ["text"], unique = true)]) 19 | data class HistoryInfo( 20 | 21 | // ID,主键,自增长 22 | @PrimaryKey(autoGenerate = true) 23 | @DLField 24 | var hId : Long = 0, 25 | 26 | /** 发送文本 */ 27 | @DLField 28 | var text: String = "", 29 | 30 | /** 发送时间 */ 31 | @DLField 32 | var time: Long = 0L 33 | ) : BaseJsonEntity() { 34 | 35 | companion object{ 36 | @JvmStatic 37 | @BindingAdapter("setTime") 38 | fun setTime(textView: TextView, time: Long) { 39 | textView.text = DateUtils.getDateStr(time, "yyyy-MM-dd hh:mm:ss") 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/model/HistoryModel.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.model 2 | 3 | import android.app.Application 4 | import androidx.lifecycle.AndroidViewModel 5 | import androidx.lifecycle.LiveData 6 | import androidx.lifecycle.viewModelScope 7 | import com.dlong.networkdebugassistant.bean.HistoryInfo 8 | import com.dlong.networkdebugassistant.db.HistoryDB 9 | import kotlinx.coroutines.launch 10 | 11 | /** 12 | * @author D10NG 13 | * @date on 2019-12-07 14:47 14 | */ 15 | class HistoryModel(application: Application) : AndroidViewModel(application) { 16 | 17 | private val db = HistoryDB.getDatabase(application) 18 | private var allData: LiveData> 19 | 20 | init { 21 | allData = db.getHistoryDao().getAllData() 22 | } 23 | 24 | fun getAllData() = allData 25 | 26 | fun insertHistory(info : HistoryInfo) = viewModelScope.launch{ 27 | db.getHistoryDao().insert(info) 28 | } 29 | 30 | fun updateHistory(info: HistoryInfo) = viewModelScope.launch { 31 | db.getHistoryDao().update(info) 32 | } 33 | 34 | fun deleteHistory(info: HistoryInfo) = viewModelScope.launch { 35 | db.getHistoryDao().delete(info) 36 | } 37 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/bean/BaseConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.bean 2 | 3 | import com.dlong.jsonentitylib.BaseJsonEntity 4 | import com.dlong.jsonentitylib.annotation.DLField 5 | 6 | /** 7 | * 基础配置信息 8 | * 9 | * @author D10NG 10 | * @date on 2019-12-09 14:59 11 | */ 12 | open class BaseConfiguration constructor( 13 | 14 | /** 发送 是否以16进制格式 */ 15 | @DLField 16 | var isSendHex: Boolean = false, 17 | 18 | /** 发送 是否自动添加最后一位校验位 */ 19 | @DLField 20 | var isAutoAddHexCheck: Boolean = false, 21 | 22 | /** 发送 自动循环发送时间间隔 毫秒 */ 23 | @DLField 24 | var autoSendTime: Long = 1000L, 25 | 26 | /** 接收 是否以16进制格式 */ 27 | @DLField 28 | var isReceiveHex: Boolean = false, 29 | 30 | /** 接收 是否显示接收时间 */ 31 | @DLField 32 | var isReceiveShowTime: Boolean = false, 33 | 34 | /** 接收 是否显示IP地址 */ 35 | @DLField 36 | var isReceiveShowIpAddress: Boolean = false, 37 | 38 | /** 接收 是否显示端口 */ 39 | @DLField 40 | var isReceiveShowPort: Boolean = false, 41 | 42 | /** 接收 是否自动保存到本地 */ 43 | @DLField 44 | var isAutoSaveToLocal: Boolean = false, 45 | 46 | /** 接收 存储本地地址 */ 47 | @DLField 48 | var receiveSaveLocalPath: String = "NULL" 49 | ) : BaseJsonEntity() { 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.databinding.DataBindingUtil 6 | import com.dlong.networkdebugassistant.R 7 | import com.dlong.networkdebugassistant.databinding.ActivityMainBinding 8 | 9 | class MainActivity : BaseActivity() { 10 | 11 | private lateinit var binding: ActivityMainBinding 12 | 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | binding = DataBindingUtil.setContentView(this, R.layout.activity_main) 16 | 17 | // 左上角点击事件 18 | setSupportActionBar(binding.toolbar) 19 | binding.toolbar.setNavigationOnClickListener { clearGoTo(SettingActivity::class.java) } 20 | } 21 | 22 | fun goAct(view: View) { 23 | when(view.id) { 24 | R.id.btn_udp -> clearGoTo(UdpBroadActivity::class.java) 25 | R.id.btn_udp_multi -> clearGoTo(UdpMultiActivity::class.java) 26 | R.id.btn_tcp_client -> clearGoTo(TcpClientActivity::class.java) 27 | R.id.btn_tcp_server -> clearGoTo(TcpServerActivity::class.java) 28 | R.id.btn_ping -> clearGoTo(PingActivity::class.java) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/db/HistoryDB.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.db 2 | 3 | import android.content.Context 4 | import androidx.room.Database 5 | import androidx.room.Room 6 | import androidx.room.RoomDatabase 7 | import com.dlong.networkdebugassistant.bean.HistoryInfo 8 | import com.dlong.networkdebugassistant.db.dao.HistoryDao 9 | 10 | /** 11 | * @author D10NG 12 | * @date on 2019-12-07 11:12 13 | */ 14 | @Database(entities = [HistoryInfo::class], version = 1, exportSchema = false) 15 | abstract class HistoryDB : RoomDatabase() { 16 | 17 | abstract fun getHistoryDao() : HistoryDao 18 | 19 | companion object { 20 | 21 | // 单例 22 | @Volatile 23 | private var INSTANCE : HistoryDB? = null 24 | 25 | @JvmStatic 26 | fun getDatabase(context : Context) : HistoryDB { 27 | val temp = INSTANCE 28 | if (null != temp) { 29 | return temp 30 | } 31 | synchronized(this) { 32 | val instance = Room.databaseBuilder( 33 | context.applicationContext, 34 | HistoryDB::class.java, 35 | "history_db" 36 | ).build() 37 | INSTANCE = instance 38 | return instance 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/UdpBroadActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import com.d10ng.net.assistant.UdpBroadThread 5 | import com.dlong.networkdebugassistant.R 6 | import com.dlong.networkdebugassistant.bean.UdpBroadConfiguration 7 | import com.dlong.networkdebugassistant.constant.DBConstant 8 | 9 | class UdpBroadActivity : BaseSendReceiveActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setTittle(resources.getString(R.string.main_udp_broad)) 14 | binding.isShowSocketList = false 15 | } 16 | 17 | override fun initConfig() { 18 | super.initConfig() 19 | config = DBConstant.getInstance(this).getUdpBroadConfiguration() 20 | } 21 | 22 | override fun initThread() { 23 | super.initThread() 24 | val cc = config as UdpBroadConfiguration 25 | thread = UdpBroadThread( cc.localPort, netListener) 26 | } 27 | 28 | override fun openSetting() { 29 | super.openSetting() 30 | clearGoTo(UdpBroadSettingActivity::class.java) 31 | } 32 | 33 | override fun sendData(data: ByteArray) { 34 | super.sendData(data) 35 | val cc = config as UdpBroadConfiguration 36 | thread?.send(cc.targetIpAddress, cc.targetPort, data) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/TcpClientActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import com.d10ng.net.assistant.TcpClientThread 5 | import com.dlong.networkdebugassistant.R 6 | import com.dlong.networkdebugassistant.bean.TcpClientConfiguration 7 | import com.dlong.networkdebugassistant.constant.DBConstant 8 | 9 | /** 10 | * @author D10NG 11 | * @date on 2019-12-09 14:49 12 | */ 13 | class TcpClientActivity : BaseSendReceiveActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setTittle(resources.getString(R.string.main_tcp_client)) 18 | binding.isShowSocketList = false 19 | } 20 | 21 | override fun initConfig() { 22 | super.initConfig() 23 | config = DBConstant.getInstance(this).getTcpClientConfiguration() 24 | } 25 | 26 | override fun initThread() { 27 | super.initThread() 28 | val cc = config as TcpClientConfiguration 29 | thread = TcpClientThread(cc.serverIpAddress, cc.serverPort, netListener) 30 | } 31 | 32 | override fun openSetting() { 33 | super.openSetting() 34 | clearGoTo(TcpClientSettingActivity::class.java) 35 | } 36 | 37 | override fun sendData(data: ByteArray) { 38 | super.sendData(data) 39 | thread?.send(data) 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/UdpMultiActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import com.d10ng.net.assistant.UdpMultiThread 5 | import com.dlong.networkdebugassistant.R 6 | import com.dlong.networkdebugassistant.bean.UdpMultiConfiguration 7 | import com.dlong.networkdebugassistant.constant.DBConstant 8 | 9 | /** 10 | * @author D10NG 11 | * @date on 2019-12-09 11:09 12 | */ 13 | class UdpMultiActivity : BaseSendReceiveActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setTittle(resources.getString(R.string.main_udp_multi)) 18 | binding.isShowSocketList = false 19 | } 20 | 21 | override fun initConfig() { 22 | super.initConfig() 23 | config = DBConstant.getInstance(this).getUdpMultiConfiguration() 24 | } 25 | 26 | override fun initThread() { 27 | super.initThread() 28 | val cc = config as UdpMultiConfiguration 29 | thread = UdpMultiThread(cc.targetIpAddress, cc.localPort, netListener) 30 | } 31 | 32 | override fun openSetting() { 33 | super.openSetting() 34 | clearGoTo(UdpMultiSettingActivity::class.java) 35 | } 36 | 37 | override fun sendData(data: ByteArray) { 38 | super.sendData(data) 39 | val cc = config as UdpMultiConfiguration 40 | thread?.send(cc.targetIpAddress, cc.targetPort, data) 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/SettingActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.databinding.DataBindingUtil 6 | import com.dlong.dialog.* 7 | import com.dlong.networkdebugassistant.R 8 | import com.dlong.networkdebugassistant.databinding.ActivitySettingBinding 9 | import com.dlong.networkdebugassistant.utils.AppUtils 10 | 11 | class SettingActivity : BaseActivity() { 12 | 13 | private lateinit var binding: ActivitySettingBinding 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | binding = DataBindingUtil.setContentView(this, R.layout.activity_setting) 18 | 19 | // 设置返回按钮 20 | setSupportActionBar(binding.toolbar) 21 | binding.toolbar.setNavigationOnClickListener { finish() } 22 | 23 | // 显示版本号 24 | binding.txtVersion = AppUtils.getAppVersion(this) 25 | } 26 | 27 | /** 28 | * 显示版本信息弹窗 29 | */ 30 | fun openVersionDialog(view: View) { 31 | val info = AppUtils.getVersionReadMe(this, binding.txtVersion?: "") 32 | VersionInfoDialog(this).create() 33 | .setTittle(resources.getString(R.string.setting_version)) 34 | .setIcon(R.mipmap.ic_launcher_web) 35 | .addVersionInfo(info.version, info.time, info.author, info.content) 36 | .addAction(resources.getString(R.string.sure), ButtonStyle.THEME) 37 | .show() 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dl10netassistant/src/main/java/com/d10ng/net/assistant/NetUtils.kt: -------------------------------------------------------------------------------- 1 | package com.d10ng.net.assistant 2 | 3 | import kotlinx.coroutines.CoroutineScope 4 | import kotlinx.coroutines.Dispatchers 5 | import kotlinx.coroutines.flow.Flow 6 | import kotlinx.coroutines.flow.catch 7 | import kotlinx.coroutines.flow.flow 8 | import kotlinx.coroutines.flow.flowOn 9 | import kotlinx.coroutines.launch 10 | import java.io.BufferedReader 11 | import java.io.InputStreamReader 12 | import kotlin.coroutines.resume 13 | import kotlin.coroutines.suspendCoroutine 14 | 15 | /** 16 | * PING 17 | * @param address String 地址 18 | * @param count Int 测试次数 19 | * @return Flow 20 | */ 21 | fun ping(address: String, count: Int = 6): Flow { 22 | return flow { 23 | val process = Runtime.getRuntime().exec("ping -c $count $address") 24 | val inS = process.inputStream 25 | val reader = BufferedReader(InputStreamReader(inS)) 26 | var line: String? 27 | do { 28 | line = reader.readLine() 29 | if (line != null) { 30 | emit("$line\n") 31 | } else { 32 | break 33 | } 34 | } while (true) 35 | }.flowOn(Dispatchers.IO) 36 | .catch { t: Throwable -> 37 | emit("catch error ${t.message}\n") 38 | } 39 | } 40 | 41 | /** 42 | * PING 一次 43 | * @param address String 44 | * @return Boolean 45 | */ 46 | suspend fun pingOnce(address: String): Boolean { 47 | return suspendCoroutine { cont -> 48 | CoroutineScope(Dispatchers.IO).launch { 49 | try { 50 | val process = Runtime.getRuntime().exec("ping -c 1 $address") 51 | cont.resume(process.waitFor() == 0) 52 | } catch (e: Exception) { 53 | e.printStackTrace() 54 | cont.resume(false) 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/activity/PingActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.activity 2 | 3 | import android.os.Bundle 4 | import android.text.method.ScrollingMovementMethod 5 | import android.view.View 6 | import androidx.databinding.DataBindingUtil 7 | import com.d10ng.net.assistant.ping 8 | import com.d10ng.net.assistant.pingOnce 9 | import com.dlong.networkdebugassistant.R 10 | import com.dlong.networkdebugassistant.databinding.ActivityPingBinding 11 | import kotlinx.coroutines.Dispatchers 12 | import kotlinx.coroutines.GlobalScope 13 | import kotlinx.coroutines.launch 14 | import kotlinx.coroutines.withContext 15 | 16 | /** 17 | * PING 18 | * @Author: D10NG 19 | * @Time: 2021/2/24 11:21 上午 20 | */ 21 | class PingActivity : BaseActivity() { 22 | 23 | private lateinit var binding: ActivityPingBinding 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | binding = DataBindingUtil.setContentView(this, R.layout.activity_ping) 28 | 29 | // 接收文本滚动方式 30 | binding.txtReceive.movementMethod = ScrollingMovementMethod.getInstance() 31 | 32 | // 点击返回 33 | binding.toolbar.setNavigationOnClickListener { finish() } 34 | } 35 | 36 | fun sure(view: View) { 37 | val address = binding.edtAddress.text?.toString() 38 | if (address.isNullOrEmpty()) { 39 | return 40 | } 41 | GlobalScope.launch { 42 | ping(address).collect { 43 | withContext(Dispatchers.Main) { 44 | binding.txtReceive.append(it) 45 | } 46 | } 47 | val isSuccess = pingOnce(address) 48 | withContext(Dispatchers.Main) { 49 | showToast("PING测试结果=$isSuccess") 50 | } 51 | } 52 | } 53 | 54 | fun clean(view: View) { 55 | binding.txtReceive.text = "" 56 | binding.txtReceive.scrollTo(0, 0) 57 | } 58 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 30 | 31 | 39 | 40 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/adapter/FolderAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.adapter 2 | 3 | import android.os.Handler 4 | import android.os.Message 5 | import android.view.LayoutInflater 6 | import android.view.ViewGroup 7 | import androidx.databinding.DataBindingUtil 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.dlong.networkdebugassistant.R 10 | import com.dlong.networkdebugassistant.bean.FolderInfo 11 | import com.dlong.networkdebugassistant.databinding.ItemFileBinding 12 | 13 | /** 14 | * 文件夹列表适配器 15 | * 16 | * @author D10NG 17 | * @date on 2019-12-06 10:29 18 | */ 19 | class FolderAdapter constructor( 20 | private val mHandler: Handler, 21 | private var mList: MutableList 22 | ) : RecyclerView.Adapter() { 23 | 24 | companion object{ 25 | const val FOLDER_SELECT = 100 26 | const val FOLDER_EDIT = 101 27 | } 28 | 29 | fun update(list: MutableList) { 30 | this.mList.clear() 31 | this.mList.addAll(list) 32 | notifyDataSetChanged() 33 | } 34 | 35 | inner class ViewHolder constructor( 36 | val binding: ItemFileBinding 37 | ) : RecyclerView.ViewHolder(binding.root) { 38 | 39 | fun bind(info: FolderInfo) { 40 | binding.folderInfo = info 41 | binding.executePendingBindings() 42 | } 43 | } 44 | 45 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 46 | val binding: ItemFileBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), 47 | R.layout.item_file, parent, false) 48 | return ViewHolder(binding) 49 | } 50 | 51 | override fun getItemCount(): Int = this.mList.size 52 | 53 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 54 | holder.bind(this.mList[position]) 55 | holder.binding.llContent.setOnClickListener { 56 | val m = Message.obtain() 57 | m.what = FOLDER_SELECT 58 | m.obj = this.mList[position] 59 | mHandler.sendMessage(m) 60 | } 61 | holder.binding.llContent.setOnLongClickListener { 62 | val m = Message.obtain() 63 | m.what = FOLDER_EDIT 64 | m.obj = this.mList[position] 65 | mHandler.sendMessage(m) 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dlong/networkdebugassistant/utils/AppUtils.kt: -------------------------------------------------------------------------------- 1 | package com.dlong.networkdebugassistant.utils 2 | 3 | import android.content.ClipData 4 | import android.content.ClipboardManager 5 | import android.content.Context 6 | import org.json.JSONArray 7 | import org.json.JSONObject 8 | import java.io.Serializable 9 | 10 | /** 11 | * @author D10NG 12 | * @date on 2019-11-27 11:32 13 | */ 14 | object AppUtils { 15 | 16 | /** 17 | * 获取当前应用的版本号 18 | * 19 | * @return 20 | */ 21 | fun getAppVersion(context: Context): String { 22 | // 获取packagemanager的实例 23 | val packageManager = context.packageManager 24 | // getPackageName()是你当前类的包名,0代表是获取版本信息 25 | val packInfo = packageManager.getPackageInfo(context.packageName, 0) 26 | return packInfo.versionName 27 | } 28 | 29 | /** 30 | * 版本信息实体 31 | */ 32 | data class VersionReadMe( 33 | var version: String = "", 34 | var author: String = "", 35 | var time: String = "", 36 | var content: String = "" 37 | ) : Serializable { 38 | 39 | fun parseFromJson(json: JSONObject, version: String) { 40 | this.version = version 41 | this.author = json.optString("author") 42 | this.time = json.optString("time") 43 | val array = json.optJSONArray("content")?: JSONArray() 44 | val builder = StringBuilder() 45 | for (i in 0 until array.length()) { 46 | builder.append("${i + 1}、").append(array.getString(i)).append("\n") 47 | } 48 | this.content = builder.toString() 49 | } 50 | } 51 | 52 | /** 53 | * 获取版本信息 54 | */ 55 | fun getVersionReadMe(context: Context, version: String) : VersionReadMe { 56 | val jsonObject = JSONObject(AssetsUtils.getJsonString(context, "readme.json")) 57 | val versionObj = jsonObject.optJSONObject(version)?: return VersionReadMe() 58 | val vrm = VersionReadMe() 59 | vrm.parseFromJson(versionObj, version) 60 | return vrm 61 | } 62 | 63 | /** 64 | * 复制字符串到系统剪贴板 65 | */ 66 | fun copyToClipboard(context: Context, text: String) { 67 | val clip = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 68 | val data = ClipData.newPlainText("receive", text) 69 | clip.setPrimaryClip(data) 70 | } 71 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 35 | 38 | 39 | 42 | 43 | 46 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | 15 | 16 | 28 | 29 | 40 | 41 | 50 | 51 |