Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fb4e305 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Debug info: show number of events, contacts, tasks for each account (to know...

Debug info: show number of events, contacts, tasks for each account (to know whether sync is working)
parent e96f8a62
Loading
Loading
Loading
Loading
+61 −32
Original line number Diff line number Diff line
@@ -11,12 +11,11 @@ package at.bitfire.davdroid.ui
import android.accounts.Account
import android.accounts.AccountManager
import android.app.Application
import android.content.ContentResolver
import android.content.ContentUris
import android.content.Intent
import android.content.*
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.LocaleList
@@ -51,7 +50,7 @@ import at.bitfire.davdroid.model.AppDatabase
import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.ical4android.TaskProvider
import at.bitfire.ical4android.MiscUtils.ContentProviderClientHelper.closeCompat
import at.bitfire.ical4android.TaskProvider.ProviderName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -506,24 +505,7 @@ class DebugInfoActivity: AppCompatActivity() {
            val context = getApplication<Application>()

            writer.append(" - Account: ${account.name}\n")
            val table = TextTable("Authority", "isSyncable", "getSyncAutomatically", "Sync interval")

            for (authority in arrayOf(
                    context.getString(R.string.address_books_authority),
                    CalendarContract.AUTHORITY,
                    ContactsContract.AUTHORITY,     // Should never be set! Main accounts shall not contain contacts.
                    TaskProvider.ProviderName.OpenTasks.authority
            ))
                table.addLine(
                        authority,
                        ContentResolver.getIsSyncable(account, authority),
                        ContentResolver.getSyncAutomatically(account, authority),
                        ContentResolver.getPeriodicSyncs(account, authority).firstOrNull()?.let { periodicSync ->
                            "${periodicSync.period/60} min"
                        }
                )
            writer.append(table.toString())

            writer.append(dumpAccount(account, AccountDumpInfo.mainAccount(context)))
            try {
                val accountSettings = AccountSettings(context, account)
                writer.append("  WiFi only: ${accountSettings.getSyncWifiOnly()}")
@@ -543,17 +525,64 @@ class DebugInfoActivity: AppCompatActivity() {

        private fun dumpAddressBookAccount(account: Account, accountManager: AccountManager, writer: Writer) {
            writer.append("  * Address book: ${account.name}\n")
            val table = TextTable("isSyncable", "getSyncAutomatically", "Sync interval")
            val table = dumpAccount(account, AccountDumpInfo.addressBookAccount())
            writer  .append(TextTable.indent(table, 4))
                    .append("URL: ${accountManager.getUserData(account, LocalAddressBook.USER_DATA_URL)}\n")
                    .append("    Read-only: ${accountManager.getUserData(account, LocalAddressBook.USER_DATA_READ_ONLY) ?: 0}\n\n")
        }

        private fun dumpAccount(account: Account, infos: Iterable<AccountDumpInfo>): String {
            val table = TextTable("Authority", "Syncable", "Auto-sync", "Interval", "Entries")
            for (info in infos) {
                var nrEntries = "—"
                var client: ContentProviderClient? = null
                if (info.countUri != null)
                    try {
                        client = context.contentResolver.acquireContentProviderClient(info.authority)
                        if (client != null) {
                            client.query(info.countUri, null, "account_name=? AND account_type=?", arrayOf(account.name, account.type), null)?.use { cursor ->
                                nrEntries = "${cursor.count} ${info.countStr}"
                            }
                        }
                    } catch(ignored: Exception) {
                    } finally {
                        client?.closeCompat()
                    }
                table.addLine(
                    ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY),
                    ContentResolver.getSyncAutomatically(account, ContactsContract.AUTHORITY),
                    ContentResolver.getPeriodicSyncs(account, ContactsContract.AUTHORITY).firstOrNull()?.let { periodicSync ->
                        info.authority,
                        ContentResolver.getIsSyncable(account, info.authority),
                        ContentResolver.getSyncAutomatically(account, info.authority),
                        ContentResolver.getPeriodicSyncs(account, info.authority).firstOrNull()?.let { periodicSync ->
                            "${periodicSync.period / 60} min"
                        },
                        nrEntries
                )
            }
            return table.toString()
        }

    }


    data class AccountDumpInfo(
            val authority: String,
            val countUri: Uri?,
            val countStr: String?) {

        companion object {

            fun mainAccount(context: Context) = listOf(
                    AccountDumpInfo(context.getString(R.string.address_books_authority), null, null),
                    AccountDumpInfo(CalendarContract.AUTHORITY, CalendarContract.Events.CONTENT_URI, "event(s)"),
                    AccountDumpInfo(ProviderName.OpenTasks.authority, TaskContract.Tasks.getContentUri(ProviderName.OpenTasks.authority), "OpenTasks task(s)"),
                    AccountDumpInfo(ProviderName.TasksOrg.authority, TaskContract.Tasks.getContentUri(ProviderName.TasksOrg.authority), "tasks.org task(s)"),
                    AccountDumpInfo(ContactsContract.AUTHORITY, ContactsContract.RawContacts.CONTENT_URI, "wrongly assigned contact(s)")
            )
            writer  .append(TextTable.indent(table.toString(), 3))
                    .append("    URL: ${accountManager.getUserData(account, LocalAddressBook.USER_DATA_URL)}\n")
                    .append("    Read-only: ${accountManager.getUserData(account, LocalAddressBook.USER_DATA_READ_ONLY) ?: 0}\n\n")

            fun addressBookAccount() = listOf(
                    AccountDumpInfo(ContactsContract.AUTHORITY, ContactsContract.RawContacts.CONTENT_URI, "contact(s)")
            )

        }

    }
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ buildscript {
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.1'
        classpath 'com.android.tools.build:gradle:4.1.2'
        classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${versions.aboutLibraries}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
        classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"