From 9bd4e41d3dc074f76ded28a119f85d1bcee78e3c Mon Sep 17 00:00:00 2001 From: bt Date: Fri, 5 Jun 2026 17:50:26 +0200 Subject: Add scanner service --- app/src/main/AndroidManifest.xml | 8 ++- app/src/main/java/net/rctt/netmon/MainActivity.kt | 59 ++++++++++++++++++++-- app/src/main/java/net/rctt/netmon/MainFragment.kt | 59 ---------------------- app/src/main/java/net/rctt/netmon/ScanFragment.kt | 59 ++++++++++++++++++++++ .../main/java/net/rctt/netmon/ScannerService.kt | 55 ++++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 6 +-- app/src/main/res/layout/fragment_main.xml | 14 ----- app/src/main/res/layout/fragment_scan.xml | 28 ++++++++++ app/src/main/res/menu/nav_menu.xml | 2 +- 9 files changed, 206 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/net/rctt/netmon/MainFragment.kt create mode 100644 app/src/main/java/net/rctt/netmon/ScanFragment.kt create mode 100644 app/src/main/java/net/rctt/netmon/ScannerService.kt delete mode 100644 app/src/main/res/layout/fragment_main.xml create mode 100644 app/src/main/res/layout/fragment_scan.xml (limited to 'app/src') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 05bd126..6541e4c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,23 +9,27 @@ - + + + diff --git a/app/src/main/java/net/rctt/netmon/MainActivity.kt b/app/src/main/java/net/rctt/netmon/MainActivity.kt index 5a25086..3974c48 100644 --- a/app/src/main/java/net/rctt/netmon/MainActivity.kt +++ b/app/src/main/java/net/rctt/netmon/MainActivity.kt @@ -1,13 +1,23 @@ package net.rctt.netmon +import android.content.ComponentName +import android.content.Intent +import android.content.ServiceConnection import android.os.Bundle -import androidx.appcompat.app/**/.AppCompatActivity +import android.os.IBinder +import android.telephony.CellInfo +import android.util.Log +import android.view.View +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.google.android.material.bottomnavigation.BottomNavigationView + class MainActivity : AppCompatActivity() { - lateinit var bottomNav : BottomNavigationView + lateinit var bottomNav: BottomNavigationView + lateinit var scanerService: ScannerService + var scannerServiceBound: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -24,9 +34,50 @@ class MainActivity : AppCompatActivity() { true } } - private fun loadFragment(fragment: Fragment){ + + override fun onStart() { + super.onStart() + val intentBind = Intent(this, ScannerService::class.java) + bindService(intentBind, connection, BIND_AUTO_CREATE) + } + + override fun onStop() { + super.onStop() + unbindService(connection) + scannerServiceBound = false + } + + private fun loadFragment(fragment: Fragment) { val transaction = supportFragmentManager.beginTransaction() - transaction.replace(R.id.container,fragment) + transaction.replace(R.id.container, fragment) transaction.commit() } + + private val connection = object : ServiceConnection { + override fun onServiceConnected(className: ComponentName, service: IBinder) { + val binder = service as ScannerService.LocalBinder + scanerService = binder.getService() + scannerServiceBound = true + + binder.addListener(object : ScannerService.Callback { + override fun onCalled(list: List) { + Log.d("AAAA", list.toString()) + } + }) + } + + override fun onServiceDisconnected(arg0: ComponentName) { + scannerServiceBound = false + } + } + + fun startGetCellService(v: View) { + val service = Intent(baseContext, ScannerService::class.java) + scanerService.run = true + startService(service) + } + + fun stopGetCellService(v: View) { + scanerService.run = false + } } \ No newline at end of file diff --git a/app/src/main/java/net/rctt/netmon/MainFragment.kt b/app/src/main/java/net/rctt/netmon/MainFragment.kt deleted file mode 100644 index 4a6e01b..0000000 --- a/app/src/main/java/net/rctt/netmon/MainFragment.kt +++ /dev/null @@ -1,59 +0,0 @@ -package net.rctt.netmon - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [MainFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class MainFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_main, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment MainFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - MainFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/net/rctt/netmon/ScanFragment.kt b/app/src/main/java/net/rctt/netmon/ScanFragment.kt new file mode 100644 index 0000000..4df7199 --- /dev/null +++ b/app/src/main/java/net/rctt/netmon/ScanFragment.kt @@ -0,0 +1,59 @@ +package net.rctt.netmon + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [MainFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class MainFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_scan, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment MainFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + MainFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/rctt/netmon/ScannerService.kt b/app/src/main/java/net/rctt/netmon/ScannerService.kt new file mode 100644 index 0000000..77a43bf --- /dev/null +++ b/app/src/main/java/net/rctt/netmon/ScannerService.kt @@ -0,0 +1,55 @@ +package net.rctt.netmon + +import android.Manifest +import android.app.IntentService +import android.content.Intent +import android.os.Binder +import android.os.Handler +import android.os.IBinder +import android.telephony.CellInfo +import android.telephony.TelephonyManager +import android.util.Log +import androidx.annotation.RequiresPermission + +class ScannerService : IntentService(ScannerService::class.simpleName) { + interface Callback { + fun onCalled(list: List) + } + + inner class LocalBinder : Binder() { + var callback: Callback? = null + fun getService(): ScannerService = this@ScannerService + fun addListener(listener: Callback?) { + callback = listener + } + } + + val binder = LocalBinder() + val handler: Handler = Handler() + var run: Boolean = true + + override fun onBind(intent: Intent): IBinder { + return binder + } + + @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION) + override fun onHandleIntent(p0: Intent?) { + val tel = getSystemService(TELEPHONY_SERVICE) as TelephonyManager + + while (run) { + handler.post { refresh(tel) } + Thread.sleep(1000) + } + Log.d("GetCellsService", "Stopping scan service") + } + + @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION) + fun refresh(tel: TelephonyManager) { + Log.d("GetCellsService", "Refreshing cells list") + tel.requestCellInfoUpdate(mainExecutor, object : TelephonyManager.CellInfoCallback() { + override fun onCellInfo(cellList: List) { + binder.callback?.onCalled(cellList) + } + }) + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c78970c..221d2e9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,6 +2,7 @@ - - - + android:layout_above="@+id/bottomNav" /> - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_scan.xml b/app/src/main/res/layout/fragment_scan.xml new file mode 100644 index 0000000..ee91e17 --- /dev/null +++ b/app/src/main/res/layout/fragment_scan.xml @@ -0,0 +1,28 @@ + + + + + +