This commit is contained in:
Your Name
2024-03-04 01:09:00 -06:00
parent c7272190a8
commit 54c32d7526
94 changed files with 83 additions and 35 deletions

View File

@@ -29,6 +29,11 @@ import android.content.Intent
import android.os.Handler
import android.os.Looper
import android.net.ConnectivityManager
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import androidx.core.app.NotificationCompat
// added by hansonxyz
@@ -61,35 +66,72 @@ class MyBroadcastReceiver : BroadcastReceiver(), TetheringManager.StartTethering
// */
// override fun onTetheringFailed(error: Int? = null) { }
private fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "Tethering Notification"
val descriptionText = "Notifications for tethering status"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel("TETHERING_STATUS", name, importance).apply {
description = descriptionText
}
val notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
private fun showNotification(context: Context, title: String, message: String) {
createNotificationChannel(context)
val notificationBuilder = NotificationCompat.Builder(context, "TETHERING_STATUS")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(title)
.setContentText(message)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
val notificationManager = ContextCompat.getSystemService(context, NotificationManager::class.java)
notificationManager?.notify(System.currentTimeMillis().toInt(), notificationBuilder.build())
}
override fun onReceive(context: Context, intent: Intent) {
if (intent.action.toString().contains("BT_TETHER_START")) {
TetheringManager.startTethering(TetheringManager.TETHERING_BLUETOOTH, false, this)
}
if (intent.action.toString().contains("BT_TETHER_STOP")) {
TetheringManager.stopTethering(TetheringManager.TETHERING_BLUETOOTH)
}
if (intent.action.toString().contains("WIFI_TETHER_START")) {
val config = synchronized(BootReceiver) { BootReceiver.config }
if (!(config == null || config.startables.isEmpty())) {
for (startable in config.startables.values) startable.start(App.app)
when (intent.action) {
"BT_TETHER_START" -> {
TetheringManager.startTethering(TetheringManager.TETHERING_BLUETOOTH, false, this)
}
TetheringManager.startTethering(TetheringManager.TETHERING_WIFI, false, this)
Toast.makeText(context, "Started tethering", Toast.LENGTH_SHORT).show()
}
if (intent.action.toString().contains("WIFI_TETHER_STOP")) {
TetheringManager.stopTethering(TetheringManager.TETHERING_WIFI)
}
if (intent.action.toString().contains("android.net.conn.TETHER_STATE_CHANGED")) {
@Suppress("UNCHECKED_CAST")
val tetheredInterfaces = intent.getStringArrayListExtra("tetherArray")
Toast.makeText(context, "Tethering interfaces changed", Toast.LENGTH_SHORT).show()
tetheredInterfaces?.forEach { iface ->
Intent(context, TetheringService::class.java).apply {
putExtra(TetheringService.EXTRA_ADD_INTERFACES, arrayOf(iface))
context.startForegroundService(this)
"BT_TETHER_STOP" -> {
TetheringManager.stopTethering(TetheringManager.TETHERING_BLUETOOTH)
}
"WIFI_TETHER_START" -> {
val config = synchronized(BootReceiver) { BootReceiver.config }
if (!(config == null || config.startables.isEmpty())) {
for (startable in config.startables.values) startable.start(App.app)
}
TetheringManager.startTethering(TetheringManager.TETHERING_WIFI, false, this)
showNotification(context, "Tethering Status", "Wi-Fi tethering started")
}
"WIFI_TETHER_STOP" -> {
TetheringManager.stopTethering(TetheringManager.TETHERING_WIFI)
}
TetheringManager.ACTION_TETHER_STATE_CHANGED -> {
val tetheredInterfaces = intent.getStringArrayListExtra(TetheringManager.EXTRA_ACTIVE_TETHER)
val message = if (tetheredInterfaces != null && tetheredInterfaces.isNotEmpty()) {
"Tethering interfaces changed. Monitoring service called for ${tetheredInterfaces.joinToString(", ")}"
} else {
"No active tethering interfaces found"
}
showNotification(context, "Tethering Status", message)
if (tetheredInterfaces != null && tetheredInterfaces.isNotEmpty()) {
Toast.makeText(context, "Tethering interfaces changed", Toast.LENGTH_SHORT).show()
tetheredInterfaces.forEach { iface ->
Intent(context, TetheringService::class.java).apply {
putExtra(TetheringService.EXTRA_ADD_INTERFACES, arrayOf(iface))
context.startForegroundService(this)
}
Toast.makeText(context, "Monitoring service called for $iface", Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(context, "No active tethering interfaces found", Toast.LENGTH_SHORT).show()
}
Toast.makeText(context, "Monitoring service called for $iface", Toast.LENGTH_SHORT).show()
}
}
}

View File

@@ -109,7 +109,7 @@ object TetheringManager {
* gives a String[] listing all the interfaces currently tethered
* (ie, has DHCPv4 support and packets potentially forwarded/NATed)
*/
private const val EXTRA_ACTIVE_TETHER = "tetherArray"
public const val EXTRA_ACTIVE_TETHER = "tetherArray"
/**
* gives a String[] listing all the interfaces we tried to tether and
* failed. Use [getLastTetherError] to find the error code