summaryrefslogtreecommitdiffstats
path: root/app/src
diff options
context:
space:
mode:
authorbt <bt@rctt.net>2026-06-05 17:50:26 +0200
committerbt <bt@rctt.net>2026-06-05 20:35:33 +0200
commit71e0e0ca0bef5de52316e22cd331741ace4d9c04 (patch)
treea88057ff3c9b77a365499e73b9793ab78c8fad19 /app/src
parentcea9b1101a7197be413060a1b4cdd34a81b67d2f (diff)
downloadnetmon-71e0e0ca0bef5de52316e22cd331741ace4d9c04.tar.gz
netmon-71e0e0ca0bef5de52316e22cd331741ace4d9c04.zip
Add scanner service
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/AndroidManifest.xml8
-rw-r--r--app/src/main/java/net/rctt/netmon/MainActivity.kt63
-rw-r--r--app/src/main/java/net/rctt/netmon/MainFragment.kt59
-rw-r--r--app/src/main/java/net/rctt/netmon/ScanFragment.kt23
-rw-r--r--app/src/main/java/net/rctt/netmon/ScannerService.kt55
-rw-r--r--app/src/main/res/layout/activity_main.xml6
-rw-r--r--app/src/main/res/layout/fragment_main.xml14
-rw-r--r--app/src/main/res/layout/fragment_scan.xml50
-rw-r--r--app/src/main/res/menu/nav_menu.xml2
9 files changed, 194 insertions, 86 deletions
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 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
- android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
+ android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Base.Theme.Netmon">
+ <service
+ android:name=".ScannerService"
+ android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
diff --git a/app/src/main/java/net/rctt/netmon/MainActivity.kt b/app/src/main/java/net/rctt/netmon/MainActivity.kt
index 5a25086..211295c 100644
--- a/app/src/main/java/net/rctt/netmon/MainActivity.kt
+++ b/app/src/main/java/net/rctt/netmon/MainActivity.kt
@@ -1,32 +1,83 @@
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 scannerService: ScannerService
+ var scannerServiceBound: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- loadFragment(MainFragment())
+ loadFragment(ScanFragment())
bottomNav = findViewById(R.id.bottomNav)!!
bottomNav.setOnItemSelectedListener {
when (it.itemId) {
- R.id.main -> loadFragment(MainFragment())
+ R.id.main -> loadFragment(ScanFragment())
R.id.log -> loadFragment(LogFragment())
R.id.map -> loadFragment(MapFragment())
}
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
+ scannerService = binder.getService()
+ scannerServiceBound = true
+
+ binder.addListener(object : ScannerService.Callback {
+ override fun onCalled(list: List<CellInfo?>) {
+ Log.d("AAAA", list.toString())
+ }
+ })
+ }
+
+ override fun onServiceDisconnected(arg0: ComponentName) {
+ scannerServiceBound = false
+ }
+ }
+
+ fun startGetCellService(v: View) {
+ val service = Intent(baseContext, ScannerService::class.java)
+ scannerService.run = true
+ startService(service)
+ }
+
+ fun stopGetCellService(v: View) {
+ scannerService.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..3e44a93
--- /dev/null
+++ b/app/src/main/java/net/rctt/netmon/ScanFragment.kt
@@ -0,0 +1,23 @@
+package net.rctt.netmon
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import androidx.fragment.app.Fragment
+
+
+class ScanFragment : Fragment() {
+ lateinit var cellsListView: LinearLayout
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_scan, container, false)
+ cellsListView = view.findViewById(R.id.cells_list)
+ cellsListView.addView(CellView(requireContext(), 1))
+ return view
+ }
+} \ 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<CellInfo?>)
+ }
+
+ 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<CellInfo?>) {
+ 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 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
@@ -11,10 +12,7 @@
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_above="@+id/bottomNav" >
-
- </FrameLayout>
-
+ android:layout_above="@+id/bottomNav" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav"
diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml
deleted file mode 100644
index 366cbbe..0000000
--- a/app/src/main/res/layout/fragment_main.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainFragment">
-
- <!-- TODO: Update blank fragment layout -->
- <TextView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="@string/hello_blank_fragment" />
-
-</FrameLayout> \ 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..b2ccdba
--- /dev/null
+++ b/app/src/main/res/layout/fragment_scan.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginHorizontal="5dp"
+ tools:context=".ScanFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight=".70">
+
+ <LinearLayout
+ android:id="@+id/cells_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
+ </ScrollView>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginBottom="20dp"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="10dp"
+ android:onClick="startGetCellService"
+ android:text="Start" />
+
+ <Button
+ android:id="@+id/button2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="stopGetCellService"
+ android:text="Stop" />
+ </LinearLayout>
+ </LinearLayout>
+
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/menu/nav_menu.xml b/app/src/main/res/menu/nav_menu.xml
index 5c42815..a4332ae 100644
--- a/app/src/main/res/menu/nav_menu.xml
+++ b/app/src/main/res/menu/nav_menu.xml
@@ -3,7 +3,7 @@
<item
android:id="@+id/main"
android:icon="@drawable/rounded_bar_chart_24"
- android:title="Main" />
+ android:title="Scan" />
<item
android:id="@+id/log"
android:icon="@drawable/outline_database_24"