Loading app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.kt +61 −32 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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()}") Loading @@ -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)") ) } } Loading build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -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}" Loading Loading
app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.kt +61 −32 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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()}") Loading @@ -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)") ) } } Loading
build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -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}" Loading