Skip to content

Commit f21e27c

Browse files
Simplify observer classes.
1 parent c2decb2 commit f21e27c

3 files changed

Lines changed: 60 additions & 71 deletions

File tree

app/src/main/java/com/syncloudsoft/mobserve/spy/BaseObserver.kt

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.syncloudsoft.mobserve.spy
22

33
import android.content.Context
4+
import android.content.SharedPreferences
45
import android.database.ContentObserver
6+
import android.database.Cursor
7+
import android.net.Uri
58
import android.os.Handler
9+
import androidx.preference.PreferenceManager
610
import androidx.work.OneTimeWorkRequestBuilder
711
import androidx.work.WorkManager
812
import androidx.work.WorkRequest
@@ -11,13 +15,53 @@ import com.syncloudsoft.mobserve.data.ForwardingRule
1115
import com.syncloudsoft.mobserve.ui.ForwardingRuleViewModel
1216
import kotlinx.serialization.encodeToString
1317
import kotlinx.serialization.json.Json
18+
import timber.log.Timber
19+
import java.lang.Exception
1420
import java.util.regex.Pattern
1521

1622
abstract class BaseObserver(
17-
private val appContext: Context,
18-
handler: Handler
23+
handler: Handler,
24+
private val context: Context,
25+
private val uri: Uri,
26+
private val projection: Array<String>,
27+
private val lastTsColumn: String,
28+
private val lastTsPreference: String,
1929
) : ContentObserver(handler) {
2030

31+
private val sharedPreferences: SharedPreferences
32+
get() = PreferenceManager.getDefaultSharedPreferences(context)
33+
34+
private var lastTsInPreferences: Long
35+
get() = sharedPreferences.getLong(lastTsPreference, System.currentTimeMillis())
36+
set(value) {
37+
sharedPreferences.edit()
38+
.putLong(lastTsPreference, value)
39+
.apply()
40+
}
41+
42+
override fun onChange(selfChange: Boolean) {
43+
Timber.v("Looks like something changed in %s", PhoneCallContentObserver.URI)
44+
var lastTs = lastTsInPreferences;
45+
try {
46+
Timber.v("Last TS %d; current TS %d.", lastTs, System.currentTimeMillis())
47+
context.contentResolver.query(
48+
uri, projection, "$lastTsColumn > ?", arrayOf("$lastTs"),
49+
"$lastTsColumn DESC"
50+
).use { cursor ->
51+
if (cursor != null && cursor.moveToFirst()) {
52+
lastTs = cursor.getLong(cursor.getColumnIndexOrThrow(lastTsColumn))
53+
do processRow(cursor) while (cursor.moveToNext())
54+
} else {
55+
Timber.w("No new data found in %s.", PhoneCallContentObserver.URI)
56+
}
57+
}
58+
} catch (e: Exception) {
59+
Timber.e(e, "Could not observe change in %s.", PhoneCallContentObserver.URI)
60+
}
61+
62+
lastTsInPreferences = lastTs
63+
}
64+
2165
protected fun matchesRule(forwardingRule: ForwardingRule, event: Event) : Boolean {
2266
if (forwardingRule.event != ForwardingRuleViewModel.EVENT_ALL
2367
&& forwardingRule.event != event.event) {
@@ -52,7 +96,9 @@ abstract class BaseObserver(
5296
))
5397
.build()
5498
WorkManager
55-
.getInstance(appContext)
99+
.getInstance(context)
56100
.enqueue(request)
57101
}
102+
103+
abstract fun processRow(cursor: Cursor)
58104
}

app/src/main/java/com/syncloudsoft/mobserve/spy/PhoneCallContentObserver.kt

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,19 @@ package com.syncloudsoft.mobserve.spy
22

33
import android.content.Context
44
import android.database.Cursor
5-
import android.net.Uri
65
import android.os.Handler
76
import android.provider.CallLog
8-
import androidx.preference.PreferenceManager
97
import com.syncloudsoft.mobserve.data.ForwardingRule
108
import com.syncloudsoft.mobserve.ui.ForwardingRuleViewModel
119
import timber.log.Timber
12-
import java.lang.Exception
1310

1411
class PhoneCallContentObserver(
15-
private val appContext: Context,
12+
context: Context,
1613
private val forwardingRules: Array<ForwardingRule>,
1714
handler: Handler
18-
) : BaseObserver(appContext, handler) {
15+
) : BaseObserver(handler, context, URI, PROJECTION, LAST_TS_COLUMN, LAST_TS_PREFERENCE) {
1916

20-
override fun onChange(selfChange: Boolean) {
21-
Timber.v("Looks like something changed in %s", URI)
22-
val sharedPreferences =
23-
PreferenceManager.getDefaultSharedPreferences(appContext)
24-
var lastTs = sharedPreferences.getLong(LAST_TS_PREF, System.currentTimeMillis())
25-
try {
26-
Timber.v("Last TS %d; current TS %d.", lastTs, System.currentTimeMillis())
27-
appContext.contentResolver.query(
28-
URI, PROJECTION, "date > ?", arrayOf("$lastTs"),
29-
"date DESC"
30-
).use { cursor ->
31-
if (cursor != null && cursor.moveToFirst()) {
32-
lastTs = cursor.getLong(3)
33-
do processRow(cursor) while (cursor.moveToNext())
34-
} else {
35-
Timber.w("No new data found in %s.", URI)
36-
}
37-
}
38-
} catch (e: Exception) {
39-
Timber.e(e, "Could not observe change in %s.", URI)
40-
}
41-
42-
sharedPreferences.edit()
43-
.putLong(LAST_TS_PREF, lastTs)
44-
.apply();
45-
}
46-
47-
private fun processRow(cursor: Cursor) {
17+
override fun processRow(cursor: Cursor) {
4818
val direction = when (cursor.getInt(0)) {
4919
CallLog.Calls.INCOMING_TYPE -> ForwardingRuleViewModel.DIRECTION_INCOMING
5020
CallLog.Calls.OUTGOING_TYPE -> ForwardingRuleViewModel.DIRECTION_OUTGOING
@@ -64,13 +34,14 @@ class PhoneCallContentObserver(
6434

6535
companion object {
6636

67-
const val LAST_TS_PREF = "lastPhoneCallTs"
37+
const val LAST_TS_COLUMN = CallLog.Calls.DATE
38+
const val LAST_TS_PREFERENCE = "lastPhoneCallTs"
6839
val PROJECTION = arrayOf(
6940
CallLog.Calls.TYPE,
7041
CallLog.Calls.NUMBER,
7142
CallLog.Calls.DURATION,
7243
CallLog.Calls.DATE,
7344
)
74-
val URI: Uri = CallLog.Calls.CONTENT_URI
45+
val URI = CallLog.Calls.CONTENT_URI
7546
}
7647
}

app/src/main/java/com/syncloudsoft/mobserve/spy/TextMessageContentObserver.kt

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,17 @@ import android.content.Context
44
import android.database.Cursor
55
import android.net.Uri
66
import android.os.Handler
7-
import androidx.preference.PreferenceManager
87
import com.syncloudsoft.mobserve.data.ForwardingRule
98
import com.syncloudsoft.mobserve.ui.ForwardingRuleViewModel
109
import timber.log.Timber
11-
import java.lang.Exception
1210

1311
class TextMessageContentObserver(
14-
private val appContext: Context,
12+
private val context: Context,
1513
private val forwardingRules: Array<ForwardingRule>,
1614
handler: Handler
17-
) : BaseObserver(appContext, handler) {
15+
) : BaseObserver(handler, context, URI, PROJECTION, LAST_TS_COLUMN, LAST_TS_PREFERENCE) {
1816

19-
override fun onChange(selfChange: Boolean) {
20-
Timber.v("Looks like something changed in %s", URI)
21-
val sharedPreferences =
22-
PreferenceManager.getDefaultSharedPreferences(appContext)
23-
var lastTs = sharedPreferences.getLong(LAST_TS_PREF, System.currentTimeMillis())
24-
try {
25-
Timber.v("Last TS %d; current TS %d.", lastTs, System.currentTimeMillis())
26-
appContext.contentResolver.query(
27-
URI, PROJECTION, "date > ?", arrayOf("$lastTs"),
28-
"date DESC"
29-
).use { cursor ->
30-
if (cursor != null && cursor.moveToFirst()) {
31-
lastTs = cursor.getLong(3)
32-
do processRow(cursor) while (cursor.moveToNext())
33-
} else {
34-
Timber.w("No new data found in %s.", URI)
35-
}
36-
}
37-
} catch (e: Exception) {
38-
Timber.e(e, "Could not observe change in %s.", URI)
39-
}
40-
41-
sharedPreferences.edit()
42-
.putLong(LAST_TS_PREF, lastTs)
43-
.apply();
44-
}
45-
46-
private fun processRow(cursor: Cursor) {
17+
override fun processRow(cursor: Cursor) {
4718
val direction = if (cursor.getInt(0) == 1)
4819
ForwardingRuleViewModel.DIRECTION_INCOMING
4920
else
@@ -62,7 +33,8 @@ class TextMessageContentObserver(
6233

6334
companion object {
6435

65-
const val LAST_TS_PREF = "lastTextMessageTs"
36+
const val LAST_TS_COLUMN = "date"
37+
const val LAST_TS_PREFERENCE = "lastTextMessageTs"
6638
val PROJECTION = arrayOf("type", "address", "body", "date")
6739
val URI: Uri = Uri.parse("content://sms")
6840
}

0 commit comments

Comments
 (0)