diff options
| author | bt <bt@rctt.net> | 2026-06-05 17:50:26 +0200 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-06-05 20:35:33 +0200 |
| commit | 71e0e0ca0bef5de52316e22cd331741ace4d9c04 (patch) | |
| tree | a88057ff3c9b77a365499e73b9793ab78c8fad19 /app/src | |
| parent | cea9b1101a7197be413060a1b4cdd34a81b67d2f (diff) | |
| download | netmon-71e0e0ca0bef5de52316e22cd331741ace4d9c04.tar.gz netmon-71e0e0ca0bef5de52316e22cd331741ace4d9c04.zip | |
Add scanner service
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/main/AndroidManifest.xml | 8 | ||||
| -rw-r--r-- | app/src/main/java/net/rctt/netmon/MainActivity.kt | 63 | ||||
| -rw-r--r-- | app/src/main/java/net/rctt/netmon/MainFragment.kt | 59 | ||||
| -rw-r--r-- | app/src/main/java/net/rctt/netmon/ScanFragment.kt | 23 | ||||
| -rw-r--r-- | app/src/main/java/net/rctt/netmon/ScannerService.kt | 55 | ||||
| -rw-r--r-- | app/src/main/res/layout/activity_main.xml | 6 | ||||
| -rw-r--r-- | app/src/main/res/layout/fragment_main.xml | 14 | ||||
| -rw-r--r-- | app/src/main/res/layout/fragment_scan.xml | 50 | ||||
| -rw-r--r-- | app/src/main/res/menu/nav_menu.xml | 2 |
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" |
