diff --git a/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalJtxICalObject.kt b/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalJtxICalObject.kt index b6a5b38cc..f492e4f0e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalJtxICalObject.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalJtxICalObject.kt @@ -10,10 +10,14 @@ import at.bitfire.ical4android.JtxCollection import at.bitfire.ical4android.JtxICalObject import at.bitfire.ical4android.JtxICalObjectFactory import at.techbee.jtx.JtxContract +import at.techbee.jtx.JtxContract.JtxICalObject.getViewIntentUriFor import com.google.common.base.MoreObjects import java.util.Optional import kotlin.jvm.optionals.getOrNull +/** + * Represents a Journal, Note or Task entry + */ class LocalJtxICalObject( collection: JtxCollection<*>, fileName: String?, @@ -84,6 +88,6 @@ class LocalJtxICalObject( .add("flags", flags) .toString() - override fun getViewUri(context: Context) = null + override fun getViewUri(context: Context) = getViewIntentUriFor(id) } \ No newline at end of file diff --git a/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalTask.kt b/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalTask.kt index 2148c19c4..60b19c36d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalTask.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/resource/LocalTask.kt @@ -15,10 +15,14 @@ import at.bitfire.ical4android.DmfsTaskList import at.bitfire.ical4android.Task import at.bitfire.ical4android.TaskProvider import at.bitfire.synctools.storage.BatchOperation +import at.techbee.jtx.JtxContract import com.google.common.base.MoreObjects import org.dmfs.tasks.contract.TaskContract.Tasks import java.util.Optional +/** + * Represents a Dmfs Task (OpenTasks and Tasks.org) entry + */ class LocalTask: DmfsTask, LocalResource { companion object { @@ -131,13 +135,16 @@ class LocalTask: DmfsTask, LocalResource { )*/ .toString() - override fun getViewUri(context: Context): Uri? { - val idNotNull = id ?: return null - if (taskList.providerName == TaskProvider.ProviderName.OpenTasks) { - val contentUri = Tasks.getContentUri(taskList.providerName.authority) - return ContentUris.withAppendedId(contentUri, idNotNull) + override fun getViewUri(context: Context): Uri? = id?.let { id -> + when (taskList.providerName) { + TaskProvider.ProviderName.OpenTasks -> { + val contentUri = Tasks.getContentUri(taskList.providerName.authority) + ContentUris.withAppendedId(contentUri, id) + } + // Tasks.org can't handle view content URIs (missing intent-filter) + // Jtx Board tasks are [LocalJtxICalObject]s + else -> null } - return null } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt index 5e913ebda..5e69a4f14 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt @@ -23,6 +23,8 @@ import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.R import at.bitfire.davdroid.sync.SyncDataType import at.bitfire.davdroid.sync.TasksAppManager +import at.bitfire.ical4android.TaskProvider +import at.techbee.jtx.JtxContract import com.google.common.base.Ascii import dagger.Lazy import dagger.hilt.android.AndroidEntryPoint @@ -147,25 +149,31 @@ class DebugInfoActivity: AppCompatActivity() { } /** - * Builds intent to view the problematic local event, task or contact at given Uri. + * Builds intent to view the problematic local resource at given Uri. * - * Note that only OpenTasks is supported as tasks provider. TasksOrg and jtxBoard - * do not support viewing tasks via intent-filter (yet). See also [at.bitfire.davdroid.sync.SyncNotificationManager.getLocalResourceUri] + * Note that the TasksOrg app does not support viewing tasks via intent-filter. + * @see [at.bitfire.davdroid.resource.LocalResource.getViewUri] */ - private fun buildViewLocalResourceIntent(uri: Uri): Intent? { - val activeTasksAuthority = tasksAppManager.get().currentProvider()?.authority - return when (uri.authority) { - ContactsContract.AUTHORITY -> - Intent(Intent.ACTION_VIEW).apply { + private fun buildViewLocalResourceIntent(uri: Uri): Intent? = + when (uri.authority) { + // Support ACTION_VIEW + in listOf( + CalendarContract.AUTHORITY, // any calendar app + JtxContract.JtxICalObject.VIEW_INTENT_HOST // jtx Board for journals, notes, tasks + ) -> Intent(Intent.ACTION_VIEW, uri) + + // Need ACTION_EDIT (OpenTasks crashes on using ACTION_VIEW) + TaskProvider.ProviderName.OpenTasks.authority // OpenTasks app + -> Intent(Intent.ACTION_EDIT, uri) + + // Need CONTENT_ITEM_TYPE to be set + ContactsContract.AUTHORITY // any contacts app + -> Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, ContactsContract.Contacts.CONTENT_ITEM_TYPE) } - CalendarContract.AUTHORITY, activeTasksAuthority -> - Intent(Intent.ACTION_VIEW, uri) - else -> null - } - } + }?.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) /** * Builder for [DebugInfoActivity] intents @@ -215,7 +223,6 @@ class DebugInfoActivity: AppCompatActivity() { if (uri == null) return this intent.putExtra(EXTRA_LOCAL_RESOURCE_URI, uri) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) return this } @@ -257,7 +264,7 @@ class DebugInfoActivity: AppCompatActivity() { internal const val EXTRA_LOCAL_RESOURCE_SUMMARY = "localResourceSummary" /** [Uri] of local resource related to the problem (as [android.os.Parcelable]) */ - internal const val EXTRA_LOCAL_RESOURCE_URI = "localResourceId" + internal const val EXTRA_LOCAL_RESOURCE_URI = "localResourceUri" /** logs related to the problem (plain-text [String]) */ private const val EXTRA_LOGS = "logs"