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

Commit 63bdbf51 authored by cketti's avatar cketti
Browse files

Clean up `ViewIntentFinder`

parent d063668f
Loading
Loading
Loading
Loading
+24 −23
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import android.content.pm.PackageManager
import android.net.Uri
import androidx.annotation.WorkerThread
import com.fsck.k9.helper.MimeTypeUtil
import com.fsck.k9.helper.MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE
import com.fsck.k9.provider.AttachmentTempFileProvider

/**
@@ -16,57 +17,57 @@ internal class ViewIntentFinder(private val context: Context) {
    fun getBestViewIntent(contentUri: Uri, displayName: String?, mimeType: String): Intent {
        val inferredMimeType = MimeTypeUtil.getMimeTypeByExtension(displayName)

        var resolvedIntentInfo: IntentAndResolvedActivitiesCount
        var resolvedIntentInfo: QueryIntentResult
        if (MimeTypeUtil.isDefaultMimeType(mimeType)) {
            resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType)
        } else {
            resolvedIntentInfo = getViewIntentForMimeType(contentUri, mimeType)
            if (!resolvedIntentInfo.hasResolvedActivities() && inferredMimeType != mimeType) {
            if (resolvedIntentInfo.hasNoResolvedActivities() && inferredMimeType != mimeType) {
                resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType)
            }
        }

        if (!resolvedIntentInfo.hasResolvedActivities()) {
            resolvedIntentInfo = getViewIntentForMimeType(contentUri, MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE)
        if (resolvedIntentInfo.hasNoResolvedActivities()) {
            resolvedIntentInfo = getViewIntentForMimeType(contentUri, DEFAULT_ATTACHMENT_MIME_TYPE)
        }

        return resolvedIntentInfo.intent
    }

    private fun getViewIntentForMimeType(contentUri: Uri, mimeType: String): IntentAndResolvedActivitiesCount {
        val contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType)
        val contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent)
    private fun getViewIntentForMimeType(contentUri: Uri, mimeType: String): QueryIntentResult {
        val intent = createViewIntentForAttachmentProviderUri(contentUri, mimeType)
        val activitiesCount = getResolvedIntentActivitiesCount(intent)

        return IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount)
        return QueryIntentResult(intent, activitiesCount)
    }

    private fun createViewIntentForAttachmentProviderUri(contentUri: Uri, mimeType: String): Intent {
        val uri = AttachmentTempFileProvider.getMimeTypeUri(contentUri, mimeType)

        val intent = Intent(Intent.ACTION_VIEW)
        intent.setDataAndType(uri, mimeType)
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        addUiIntentFlags(intent)

        return intent
        return Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(uri, mimeType)
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            addUiIntentFlags()
        }
    }

    private fun addUiIntentFlags(intent: Intent) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
    private fun Intent.addUiIntentFlags() {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
    }

    private fun getResolvedIntentActivitiesCount(intent: Intent): Int {
        val packageManager = context.packageManager

        val resolveInfos =
            packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
        val resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)

        return resolveInfos.size
    }

    private class IntentAndResolvedActivitiesCount(val intent: Intent, private val activitiesCount: Int) {
        fun hasResolvedActivities(): Boolean {
            return activitiesCount > 0
}

private class QueryIntentResult(
    val intent: Intent,
    private val activitiesCount: Int,
) {
    fun hasNoResolvedActivities(): Boolean {
        return activitiesCount == 0
    }
}