Loading legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/ViewIntentFinder.kt +24 −23 Original line number Diff line number Diff line Loading @@ -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 /** Loading @@ -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 } } Loading
legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/ViewIntentFinder.kt +24 −23 Original line number Diff line number Diff line Loading @@ -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 /** Loading @@ -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 } }