diff options
Diffstat (limited to 'packages/meshbay-android/app/src/full')
3 files changed, 0 insertions, 86 deletions
diff --git a/packages/meshbay-android/app/src/full/AndroidManifest.xml b/packages/meshbay-android/app/src/full/AndroidManifest.xml deleted file mode 100644 index 552902a..0000000 --- a/packages/meshbay-android/app/src/full/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- Messages backup, `full` build only: asked for when the person turns it - on, never at start. The `play` build has no such permission. --> - <uses-permission android:name="android.permission.READ_SMS" /> -</manifest> diff --git a/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/Flavor.kt b/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/Flavor.kt deleted file mode 100644 index 20882a5..0000000 --- a/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/Flavor.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.meshbay.client.phonesync - -import android.content.Context - -/** What this build backs up beyond photos and contacts: the `full` build reads messages. */ -object Flavor { - fun messageSource(context: Context): DocSource? = SmsSource(context) -} diff --git a/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/SmsSource.kt b/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/SmsSource.kt deleted file mode 100644 index c24ef1f..0000000 --- a/packages/meshbay-android/app/src/full/kotlin/org/meshbay/client/phonesync/SmsSource.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.meshbay.client.phonesync - -import android.Manifest -import android.content.Context -import android.content.pm.PackageManager -import android.net.Uri -import android.provider.ContactsContract -import android.provider.Telephony -import java.io.File -import java.util.TimeZone - -/** - * The phone's text messages, from the platform's SMS provider (not MMS). - * - * Each run writes the messages added since the last file the node took: - * `marker` is the highest provider id it held, and ids only grow, so a - * message restored onto the phone later counts as new and is sent too. The - * first file holds the whole history. Files go under the year they were - * written in, `<account>-messages/YYYY/`. - * - * Only in the `full` build: Play's policy keeps READ_SMS for the default SMS - * application, so the `play` build has neither the permission nor this. - */ -class SmsSource(private val context: Context) : DocSource { - override val permissions = arrayOf(Manifest.permission.READ_SMS) - override val suffix = "messages" - - override fun export(marker: String?, dir: File, now: Long, zone: TimeZone): Export? { - val after = marker?.toLongOrNull() ?: 0L - val names = Names(context) - val out = ArrayList<Sms>() - val cols = arrayOf( - Telephony.Sms._ID, Telephony.Sms.ADDRESS, Telephony.Sms.DATE, Telephony.Sms.DATE_SENT, - Telephony.Sms.TYPE, Telephony.Sms.BODY, Telephony.Sms.READ, Telephony.Sms.STATUS, - Telephony.Sms.LOCKED, Telephony.Sms.PROTOCOL, Telephony.Sms.SUBJECT, Telephony.Sms.SERVICE_CENTER, - ) - context.contentResolver.query(Telephony.Sms.CONTENT_URI, cols, "${Telephony.Sms._ID} > ?", - arrayOf(after.toString()), "${Telephony.Sms.DATE} ASC")?.use { c -> - fun str(i: Int) = if (c.isNull(i)) null else c.getString(i) - fun int(i: Int, d: Int) = if (c.isNull(i)) d else c.getInt(i) - while (c.moveToNext()) { - val address = str(1) ?: "" - out += Sms(c.getLong(0), address, c.getLong(2), if (c.isNull(3)) 0 else c.getLong(3), - int(4, 1), str(5) ?: "", int(6, 1), int(7, -1), int(8, 0), int(9, 0), - str(10), str(11), names.of(address)) - } - } - if (out.isEmpty()) return null - val file = File(dir, "sms.xml") - file.bufferedWriter(Charsets.UTF_8).use { SmsXml.write(out, it, zone) } - return Export(file, DocPlan.nameFor("sms", "xml", now, zone), "application/xml", - out.maxOf { it.id }.toString(), out.size, DocPlan.yearOf(now, zone)) - } - - /** Who a number is, when the person also let the application read contacts; once per number. */ - private class Names(private val context: Context) { - private val allowed = context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == - PackageManager.PERMISSION_GRANTED - private val known = HashMap<String, String?>() - - fun of(address: String): String? { - if (!allowed || address.isBlank()) return null - return known.getOrPut(address) { - try { - val uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address)) - context.contentResolver.query(uri, arrayOf(ContactsContract.PhoneLookup.DISPLAY_NAME), - null, null, null)?.use { c -> if (c.moveToFirst()) c.getString(0) else null } - } catch (e: Exception) { null } - } - } - } -} |