Loading legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/ViewIntentFinder.kt +40 −64 Original line number Diff line number Diff line package com.fsck.k9.ui.messageview; import java.util.List; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import androidx.annotation.WorkerThread; import com.fsck.k9.helper.MimeTypeUtil; import com.fsck.k9.provider.AttachmentTempFileProvider; package com.fsck.k9.ui.messageview import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.annotation.WorkerThread import com.fsck.k9.helper.MimeTypeUtil import com.fsck.k9.provider.AttachmentTempFileProvider /** * Tries to find an {@link Intent#ACTION_VIEW} Intent that can be used to view an attachment. * Tries to find an [Intent.ACTION_VIEW] Intent that can be used to view an attachment. */ class ViewIntentFinder { private final Context context; public ViewIntentFinder(Context context) { this.context = context; } internal class ViewIntentFinder(private val context: Context) { @WorkerThread public Intent getBestViewIntent(Uri contentUri, String displayName, String mimeType) { String inferredMimeType = MimeTypeUtil.getMimeTypeByExtension(displayName); fun getBestViewIntent(contentUri: Uri, displayName: String?, mimeType: String): Intent { val inferredMimeType = MimeTypeUtil.getMimeTypeByExtension(displayName) IntentAndResolvedActivitiesCount resolvedIntentInfo; var resolvedIntentInfo: IntentAndResolvedActivitiesCount if (MimeTypeUtil.isDefaultMimeType(mimeType)) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType); resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType) } else { resolvedIntentInfo = getViewIntentForMimeType(contentUri, mimeType); if (!resolvedIntentInfo.hasResolvedActivities() && !inferredMimeType.equals(mimeType)) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType); resolvedIntentInfo = getViewIntentForMimeType(contentUri, mimeType) if (!resolvedIntentInfo.hasResolvedActivities() && inferredMimeType != mimeType) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType) } } if (!resolvedIntentInfo.hasResolvedActivities()) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE); resolvedIntentInfo = getViewIntentForMimeType(contentUri, MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE) } return resolvedIntentInfo.getIntent(); return resolvedIntentInfo.intent } private IntentAndResolvedActivitiesCount getViewIntentForMimeType(Uri contentUri, String mimeType) { Intent contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType); int contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent); private fun getViewIntentForMimeType(contentUri: Uri, mimeType: String): IntentAndResolvedActivitiesCount { val contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType) val contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent) return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); return IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount) } private Intent createViewIntentForAttachmentProviderUri(Uri contentUri, String mimeType) { Uri uri = AttachmentTempFileProvider.getMimeTypeUri(contentUri, mimeType); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); addUiIntentFlags(intent); private fun createViewIntentForAttachmentProviderUri(contentUri: Uri, mimeType: String): Intent { val uri = AttachmentTempFileProvider.getMimeTypeUri(contentUri, mimeType) return intent; } val intent = Intent(Intent.ACTION_VIEW) intent.setDataAndType(uri, mimeType) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addUiIntentFlags(intent) private void addUiIntentFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); return intent } private int getResolvedIntentActivitiesCount(Intent intent) { PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return resolveInfos.size(); private fun addUiIntentFlags(intent: Intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) } private static class IntentAndResolvedActivitiesCount { private Intent intent; private int activitiesCount; private fun getResolvedIntentActivitiesCount(intent: Intent): Int { val packageManager = context.packageManager IntentAndResolvedActivitiesCount(Intent intent, int activitiesCount) { this.intent = intent; this.activitiesCount = activitiesCount; } val resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) public Intent getIntent() { return intent; return resolveInfos.size } public boolean hasResolvedActivities() { return activitiesCount > 0; private class IntentAndResolvedActivitiesCount(val intent: Intent, private val activitiesCount: Int) { fun hasResolvedActivities(): Boolean { return activitiesCount > 0 } } } Loading
legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/ViewIntentFinder.kt +40 −64 Original line number Diff line number Diff line package com.fsck.k9.ui.messageview; import java.util.List; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import androidx.annotation.WorkerThread; import com.fsck.k9.helper.MimeTypeUtil; import com.fsck.k9.provider.AttachmentTempFileProvider; package com.fsck.k9.ui.messageview import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.annotation.WorkerThread import com.fsck.k9.helper.MimeTypeUtil import com.fsck.k9.provider.AttachmentTempFileProvider /** * Tries to find an {@link Intent#ACTION_VIEW} Intent that can be used to view an attachment. * Tries to find an [Intent.ACTION_VIEW] Intent that can be used to view an attachment. */ class ViewIntentFinder { private final Context context; public ViewIntentFinder(Context context) { this.context = context; } internal class ViewIntentFinder(private val context: Context) { @WorkerThread public Intent getBestViewIntent(Uri contentUri, String displayName, String mimeType) { String inferredMimeType = MimeTypeUtil.getMimeTypeByExtension(displayName); fun getBestViewIntent(contentUri: Uri, displayName: String?, mimeType: String): Intent { val inferredMimeType = MimeTypeUtil.getMimeTypeByExtension(displayName) IntentAndResolvedActivitiesCount resolvedIntentInfo; var resolvedIntentInfo: IntentAndResolvedActivitiesCount if (MimeTypeUtil.isDefaultMimeType(mimeType)) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType); resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType) } else { resolvedIntentInfo = getViewIntentForMimeType(contentUri, mimeType); if (!resolvedIntentInfo.hasResolvedActivities() && !inferredMimeType.equals(mimeType)) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType); resolvedIntentInfo = getViewIntentForMimeType(contentUri, mimeType) if (!resolvedIntentInfo.hasResolvedActivities() && inferredMimeType != mimeType) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, inferredMimeType) } } if (!resolvedIntentInfo.hasResolvedActivities()) { resolvedIntentInfo = getViewIntentForMimeType(contentUri, MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE); resolvedIntentInfo = getViewIntentForMimeType(contentUri, MimeTypeUtil.DEFAULT_ATTACHMENT_MIME_TYPE) } return resolvedIntentInfo.getIntent(); return resolvedIntentInfo.intent } private IntentAndResolvedActivitiesCount getViewIntentForMimeType(Uri contentUri, String mimeType) { Intent contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType); int contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent); private fun getViewIntentForMimeType(contentUri: Uri, mimeType: String): IntentAndResolvedActivitiesCount { val contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType) val contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent) return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); return IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount) } private Intent createViewIntentForAttachmentProviderUri(Uri contentUri, String mimeType) { Uri uri = AttachmentTempFileProvider.getMimeTypeUri(contentUri, mimeType); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); addUiIntentFlags(intent); private fun createViewIntentForAttachmentProviderUri(contentUri: Uri, mimeType: String): Intent { val uri = AttachmentTempFileProvider.getMimeTypeUri(contentUri, mimeType) return intent; } val intent = Intent(Intent.ACTION_VIEW) intent.setDataAndType(uri, mimeType) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addUiIntentFlags(intent) private void addUiIntentFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); return intent } private int getResolvedIntentActivitiesCount(Intent intent) { PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return resolveInfos.size(); private fun addUiIntentFlags(intent: Intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) } private static class IntentAndResolvedActivitiesCount { private Intent intent; private int activitiesCount; private fun getResolvedIntentActivitiesCount(intent: Intent): Int { val packageManager = context.packageManager IntentAndResolvedActivitiesCount(Intent intent, int activitiesCount) { this.intent = intent; this.activitiesCount = activitiesCount; } val resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) public Intent getIntent() { return intent; return resolveInfos.size } public boolean hasResolvedActivities() { return activitiesCount > 0; private class IntentAndResolvedActivitiesCount(val intent: Intent, private val activitiesCount: Int) { fun hasResolvedActivities(): Boolean { return activitiesCount > 0 } } }