From 444ff05cf556f60fa8751bff779b5747cfd9d413 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 9 Jun 2022 17:31:37 +0200 Subject: [PATCH 1/2] centralize mime type definitions Signed-off-by: Andy Scherzinger --- .../talk/activities/TakePhotoActivity.java | 4 ++- .../filebrowser/models/BrowserFile.kt | 3 +- .../webdav/ReadFolderListingOperation.kt | 3 +- .../talk/controllers/ProfileController.kt | 3 +- .../RemoteFileBrowserItemsListViewHolder.kt | 3 +- .../RemoteFileBrowserItemsViewModel.kt | 4 +-- .../com/nextcloud/talk/utils/DrawableUtils.kt | 17 +++++---- .../nextcloud/talk/utils/FileViewerUtils.kt | 18 ++++++---- .../talk/utils/ImageEmojiEditText.kt | 5 ++- .../java/com/nextcloud/talk/utils/Mimetype.kt | 36 +++++++++++++++++++ 10 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt diff --git a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java index 84b2e2262..5eea1d84c 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java @@ -67,6 +67,8 @@ import androidx.core.content.ContextCompat; import androidx.exifinterface.media.ExifInterface; import androidx.lifecycle.ViewModelProvider; +import static com.nextcloud.talk.utils.Mimetype.IMAGE_JPEG; + public class TakePhotoActivity extends AppCompatActivity { private static final String TAG = TakePhotoActivity.class.getSimpleName(); @@ -175,7 +177,7 @@ public class TakePhotoActivity extends AppCompatActivity { }); binding.send.setOnClickListener((v) -> { Uri uri = (Uri) binding.photoPreview.getTag(); - setResult(RESULT_OK, new Intent().setDataAndType(uri, "image/jpeg")); + setResult(RESULT_OK, new Intent().setDataAndType(uri, IMAGE_JPEG)); binding.photoPreview.setTag(null); finish(); }); diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt index b800fc6bc..96b00c5cc 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt @@ -36,6 +36,7 @@ import com.nextcloud.talk.components.filebrowser.models.properties.NCPreview import com.nextcloud.talk.components.filebrowser.models.properties.OCFavorite import com.nextcloud.talk.components.filebrowser.models.properties.OCId import com.nextcloud.talk.components.filebrowser.models.properties.OCSize +import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER import kotlinx.android.parcel.Parcelize import java.io.File @@ -73,7 +74,7 @@ data class BrowserFile( browserFile.isAllowedToReShare = true } if (TextUtils.isEmpty(browserFile.mimeType) && !browserFile.isFile) { - browserFile.mimeType = "inode/directory" + browserFile.mimeType = FOLDER } return browserFile diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt b/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt index b14035ca2..32863c2cf 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt @@ -44,6 +44,7 @@ import com.nextcloud.talk.dagger.modules.RestModule.MagicAuthenticator import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient import java.io.File @@ -130,7 +131,7 @@ class ReadFolderListingOperation(okHttpClient: OkHttpClient, currentUser: UserEn remoteFileBrowserItem.isAllowedToReShare = true } if (TextUtils.isEmpty(remoteFileBrowserItem.mimeType) && !remoteFileBrowserItem.isFile) { - remoteFileBrowserItem.mimeType = "inode/directory" + remoteFileBrowserItem.mimeType = FOLDER } return remoteFileBrowserItem diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt index b7f1cf363..80e5992fe 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt @@ -71,6 +71,7 @@ import com.nextcloud.talk.ui.dialog.ScopeDialog import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.FileUtils +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PREFIX import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER import com.nextcloud.talk.utils.database.user.UserUtils import io.reactivex.Observer @@ -482,7 +483,7 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { private fun showBrowserScreen() { val bundle = Bundle() - bundle.putString(KEY_MIME_TYPE_FILTER, "image/") + bundle.putString(KEY_MIME_TYPE_FILTER, IMAGE_PREFIX) val avatarIntent = Intent(activity, RemoteFileBrowserActivity::class.java) avatarIntent.putExtras(bundle) diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index 64f21207c..b5041453c 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt @@ -37,6 +37,7 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DrawableUtils.getDrawableResourceIdForMimeType +import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER @AutoInjector(NextcloudTalkApplication::class) class RemoteFileBrowserItemsListViewHolder( @@ -143,7 +144,7 @@ class RemoteFileBrowserItemsListViewHolder( } private fun calculateClickability(item: RemoteFileBrowserItem, selectableItem: Boolean) { - clickable = selectableItem || "inode/directory" == item.mimeType + clickable = selectableItem || FOLDER == item.mimeType } companion object { diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt index 3c0bb4cbe..8f143641b 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt @@ -29,6 +29,7 @@ import androidx.lifecycle.ViewModel import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem import com.nextcloud.talk.remotefilebrowser.repositories.RemoteFileBrowserItemsRepository import com.nextcloud.talk.utils.FileSortOrder +import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER import com.nextcloud.talk.utils.preferences.AppPreferences import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -171,7 +172,7 @@ class RemoteFileBrowserItemsViewModel @Inject constructor( } fun onItemClicked(remoteFileBrowserItem: RemoteFileBrowserItem) { - if (remoteFileBrowserItem.mimeType == MIME_DIRECTORY) { + if (remoteFileBrowserItem.mimeType == FOLDER) { changePath(remoteFileBrowserItem.path!!) } else { toggleBrowserItemSelection(remoteFileBrowserItem.path!!) @@ -225,6 +226,5 @@ class RemoteFileBrowserItemsViewModel @Inject constructor( companion object { private val TAG = RemoteFileBrowserItemsViewModel::class.simpleName private const val ROOT_PATH = "/" - private const val MIME_DIRECTORY = "inode/directory" } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt index 4fc07da75..2a6d5fb87 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt @@ -21,6 +21,11 @@ package com.nextcloud.talk.utils import com.nextcloud.talk.R +import com.nextcloud.talk.utils.Mimetype.Companion.AUDIO_PREFIX +import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PREFIX +import com.nextcloud.talk.utils.Mimetype.Companion.TEXT_PREFIX +import com.nextcloud.talk.utils.Mimetype.Companion.VIDEO_PREFIX import java.util.HashMap object DrawableUtils { @@ -140,7 +145,7 @@ object DrawableUtils { drawableMap["web"] = R.drawable.ic_mimetype_text_code drawableMap["application/internet-shortcut"] = R.drawable.ic_mimetype_link - drawableMap["inode/directory"] = R.drawable.ic_mimetype_folder + drawableMap[FOLDER] = R.drawable.ic_mimetype_folder drawableMap["unknown"] = R.drawable.ic_mimetype_file drawableMap["application/pdf"] = R.drawable.ic_mimetype_application_pdf @@ -149,7 +154,7 @@ object DrawableUtils { } if ("DIR" == localMimetype) { - localMimetype = "inode/directory" + localMimetype = FOLDER return drawableMap[localMimetype]!! } @@ -157,19 +162,19 @@ object DrawableUtils { return drawableMap[localMimetype]!! } - if (localMimetype.startsWith("image/")) { + if (localMimetype.startsWith(IMAGE_PREFIX)) { return R.drawable.ic_mimetype_image } - if (localMimetype.startsWith("video/")) { + if (localMimetype.startsWith(VIDEO_PREFIX)) { return R.drawable.ic_mimetype_video } - if (localMimetype.startsWith("text/")) { + if (localMimetype.startsWith(TEXT_PREFIX)) { return R.drawable.ic_mimetype_text } - return if (localMimetype.startsWith("audio")) { + return if (localMimetype.startsWith(AUDIO_PREFIX)) { R.drawable.ic_mimetype_audio } else drawableMap["unknown"]!! } diff --git a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt index 03c7fca0f..d83d1a244 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt @@ -47,6 +47,10 @@ import com.nextcloud.talk.models.database.CapabilitiesUtil import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.utils.AccountUtils.canWeOpenFilesApp +import com.nextcloud.talk.utils.Mimetype.Companion.AUDIO_PREFIX +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_GIF +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_JPEG +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PNG import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACCOUNT import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FILE_ID import java.io.File @@ -150,9 +154,9 @@ class FileViewerUtils(private val context: Context, private val userEntity: User "video/quicktime", "video/ogg" -> openMediaView(filename, mimetype) - "image/png", - "image/jpeg", - "image/gif" + IMAGE_PNG, + IMAGE_JPEG, + IMAGE_GIF -> openImageView(filename, mimetype) "text/markdown", "text/plain" @@ -249,8 +253,8 @@ class FileViewerUtils(private val context: Context, private val userEntity: User fun isSupportedForInternalViewer(mimetype: String?): Boolean { return when (mimetype) { - "image/png", "image/jpeg", - "image/gif", "audio/mpeg", + IMAGE_PNG, IMAGE_JPEG, + IMAGE_GIF, "audio/mpeg", "audio/wav", "audio/ogg", "video/mp4", "video/quicktime", "video/ogg", "text/markdown", @@ -260,7 +264,7 @@ class FileViewerUtils(private val context: Context, private val userEntity: User } private fun isGif(mimetype: String): Boolean { - return "image/gif" == mimetype + return IMAGE_GIF == mimetype } private fun isMarkdown(mimetype: String): Boolean { @@ -268,7 +272,7 @@ class FileViewerUtils(private val context: Context, private val userEntity: User } private fun isAudioOnly(mimetype: String): Boolean { - return mimetype.startsWith("audio") + return mimetype.startsWith(AUDIO_PREFIX) } @SuppressLint("LongLogTag") diff --git a/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt b/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt index 154565903..f4f49152e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt @@ -29,6 +29,9 @@ import android.view.inputmethod.InputConnection import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.inputmethod.InputConnectionCompat import androidx.emoji.widget.EmojiEditText +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_GIF +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_JPEG +import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PNG /* Subclass of EmojiEditText with support for image keyboards - primarily for GIF handling. ;-) @@ -48,7 +51,7 @@ class ImageEmojiEditText : EmojiEditText { val ic: InputConnection = super.onCreateInputConnection(editorInfo) - EditorInfoCompat.setContentMimeTypes(editorInfo, arrayOf("image/gif", "image/jpeg", "image/png")) + EditorInfoCompat.setContentMimeTypes(editorInfo, arrayOf(IMAGE_GIF, IMAGE_JPEG, IMAGE_PNG)) val callback = InputConnectionCompat.OnCommitContentListener { inputContentInfo, flags, _ -> diff --git a/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt b/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt new file mode 100644 index 000000000..6c0a6d103 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt @@ -0,0 +1,36 @@ +/* + * Nextcloud Talk application + * + * @author Andy Scherzinger + * Copyright (C) 2022 Andy Scherzinger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.utils + +class Mimetype { + companion object { + const val IMAGE_PREFIX = "image/" + const val VIDEO_PREFIX = "video/" + const val TEXT_PREFIX = "text/" + const val AUDIO_PREFIX = "audio" + + const val FOLDER = "inode/directory" + + const val IMAGE_PNG = "image/png" + const val IMAGE_JPEG = "image/jpeg" + const val IMAGE_GIF = "image/gif" + } +} From dd129b4e6c6e31f50a0278aebaaf775b7edacdc9 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 10 Jun 2022 13:12:18 +0200 Subject: [PATCH 2/2] further centralize mimetype definitions Signed-off-by: Andy Scherzinger --- .../activities/FullScreenImageActivity.kt | 3 +- .../activities/FullScreenMediaActivity.kt | 3 +- .../FullScreenTextViewerActivity.kt | 3 +- .../filebrowser/models/BrowserFile.kt | 2 +- .../webdav/ReadFolderListingOperation.kt | 2 +- .../ConversationsListController.java | 4 +- .../talk/controllers/ProfileController.kt | 11 +++- .../RemoteFileBrowserItemsListViewHolder.kt | 2 +- .../RemoteFileBrowserItemsViewModel.kt | 2 +- .../dialog/ConversationsListBottomDialog.kt | 3 +- .../com/nextcloud/talk/utils/DrawableUtils.kt | 11 ++-- .../nextcloud/talk/utils/FileViewerUtils.kt | 60 +++++++++++-------- .../talk/utils/ImageEmojiEditText.kt | 6 +- .../com/nextcloud/talk/utils/LoggingUtils.kt | 2 +- .../java/com/nextcloud/talk/utils/Mimetype.kt | 36 +++++++---- 15 files changed, 93 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt index 8edeeeee0..b993e5ee6 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt @@ -37,6 +37,7 @@ import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.databinding.ActivityFullScreenImageBinding import com.nextcloud.talk.utils.BitmapShrinker +import com.nextcloud.talk.utils.Mimetype.IMAGE_PREFIX_GENERIC import pl.droidsonroids.gif.GifDrawable import java.io.File @@ -64,7 +65,7 @@ class FullScreenImageActivity : AppCompatActivity() { val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, shareUri) - type = "image/*" + type = IMAGE_PREFIX_GENERIC addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to))) diff --git a/app/src/main/java/com/nextcloud/talk/activities/FullScreenMediaActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/FullScreenMediaActivity.kt index a06443fc1..989866e2d 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/FullScreenMediaActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/FullScreenMediaActivity.kt @@ -38,6 +38,7 @@ import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.ActivityFullScreenMediaBinding +import com.nextcloud.talk.utils.Mimetype.VIDEO_PREFIX_GENERIC import java.io.File @AutoInjector(NextcloudTalkApplication::class) @@ -66,7 +67,7 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener { val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, shareUri) - type = "video/*" + type = VIDEO_PREFIX_GENERIC addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to))) diff --git a/app/src/main/java/com/nextcloud/talk/activities/FullScreenTextViewerActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/FullScreenTextViewerActivity.kt index b38817bef..ccd30f3b9 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/FullScreenTextViewerActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/FullScreenTextViewerActivity.kt @@ -35,6 +35,7 @@ import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.ActivityFullScreenTextBinding import com.nextcloud.talk.utils.DisplayUtils +import com.nextcloud.talk.utils.Mimetype.TEXT_PREFIX_GENERIC import io.noties.markwon.Markwon import java.io.File @@ -63,7 +64,7 @@ class FullScreenTextViewerActivity : AppCompatActivity() { val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, shareUri) - type = "text/*" + type = TEXT_PREFIX_GENERIC addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to))) diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt index 96b00c5cc..c20590ec2 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/BrowserFile.kt @@ -36,7 +36,7 @@ import com.nextcloud.talk.components.filebrowser.models.properties.NCPreview import com.nextcloud.talk.components.filebrowser.models.properties.OCFavorite import com.nextcloud.talk.components.filebrowser.models.properties.OCId import com.nextcloud.talk.components.filebrowser.models.properties.OCSize -import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER +import com.nextcloud.talk.utils.Mimetype.FOLDER import kotlinx.android.parcel.Parcelize import java.io.File diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt b/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt index 32863c2cf..29611c7f4 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/webdav/ReadFolderListingOperation.kt @@ -44,7 +44,7 @@ import com.nextcloud.talk.dagger.modules.RestModule.MagicAuthenticator import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem import com.nextcloud.talk.utils.ApiUtils -import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER +import com.nextcloud.talk.utils.Mimetype.FOLDER import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient import java.io.File diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index c2fe9e463..0445fe100 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -147,6 +147,8 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import retrofit2.HttpException; +import static com.nextcloud.talk.utils.Mimetype.TEXT_PLAIN; + @AutoInjector(NextcloudTalkApplication.class) public class ConversationsListController extends BaseController implements FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, ConversationMenuInterface { @@ -1099,7 +1101,7 @@ public class ConversationsListController extends BaseController implements Flexi || Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { try { String mimeType = intent.getType(); - if ("text/plain".equals(mimeType) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null)) { + if (TEXT_PLAIN.equals(mimeType) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null)) { // Share from Google Chrome sets text/plain MIME type, but also provides a content:// URI // with a *screenshot* of the current page in getClipData(). // Here we assume that when sharing a web page the user would prefer to send the URL diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt index 80e5992fe..ad901cf9c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt @@ -71,7 +71,9 @@ import com.nextcloud.talk.ui.dialog.ScopeDialog import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.FileUtils -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PREFIX +import com.nextcloud.talk.utils.Mimetype.IMAGE_JPG +import com.nextcloud.talk.utils.Mimetype.IMAGE_PREFIX +import com.nextcloud.talk.utils.Mimetype.IMAGE_PREFIX_GENERIC import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER import com.nextcloud.talk.utils.database.user.UserUtils import io.reactivex.Observer @@ -566,10 +568,13 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { private fun uploadAvatar(file: File?) { val builder = MultipartBody.Builder() builder.setType(MultipartBody.FORM) - builder.addFormDataPart("files[]", file!!.name, RequestBody.create("image/*".toMediaTypeOrNull(), file)) + builder.addFormDataPart( + "files[]", file!!.name, + RequestBody.create(IMAGE_PREFIX_GENERIC.toMediaTypeOrNull(), file) + ) val filePart: MultipartBody.Part = MultipartBody.Part.createFormData( "files[]", file.name, - RequestBody.create("image/jpg".toMediaTypeOrNull(), file) + RequestBody.create(IMAGE_JPG.toMediaTypeOrNull(), file) ) // upload file diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index b5041453c..5dda36d7a 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt @@ -37,7 +37,7 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DrawableUtils.getDrawableResourceIdForMimeType -import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER +import com.nextcloud.talk.utils.Mimetype.FOLDER @AutoInjector(NextcloudTalkApplication::class) class RemoteFileBrowserItemsListViewHolder( diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt index 8f143641b..68e4affc9 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/viewmodels/RemoteFileBrowserItemsViewModel.kt @@ -29,7 +29,7 @@ import androidx.lifecycle.ViewModel import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem import com.nextcloud.talk.remotefilebrowser.repositories.RemoteFileBrowserItemsRepository import com.nextcloud.talk.utils.FileSortOrder -import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER +import com.nextcloud.talk.utils.Mimetype.FOLDER import com.nextcloud.talk.utils.preferences.AppPreferences import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt index 937ed28c3..50c0b1bb3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt @@ -57,6 +57,7 @@ import com.nextcloud.talk.jobs.LeaveConversationWorker import com.nextcloud.talk.models.database.CapabilitiesUtil import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.conversations.Conversation +import com.nextcloud.talk.utils.Mimetype.TEXT_PLAIN import com.nextcloud.talk.utils.ShareUtils import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_OPERATION_CODE @@ -242,7 +243,7 @@ class ConversationsListBottomDialog( binding.conversationOperationShareLink.setOnClickListener { val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND - type = "text/plain" + type = TEXT_PLAIN putExtra( Intent.EXTRA_SUBJECT, String.format( diff --git a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt index 2a6d5fb87..ac24b9571 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt @@ -21,12 +21,11 @@ package com.nextcloud.talk.utils import com.nextcloud.talk.R -import com.nextcloud.talk.utils.Mimetype.Companion.AUDIO_PREFIX -import com.nextcloud.talk.utils.Mimetype.Companion.FOLDER -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PREFIX -import com.nextcloud.talk.utils.Mimetype.Companion.TEXT_PREFIX -import com.nextcloud.talk.utils.Mimetype.Companion.VIDEO_PREFIX -import java.util.HashMap +import com.nextcloud.talk.utils.Mimetype.AUDIO_PREFIX +import com.nextcloud.talk.utils.Mimetype.FOLDER +import com.nextcloud.talk.utils.Mimetype.IMAGE_PREFIX +import com.nextcloud.talk.utils.Mimetype.TEXT_PREFIX +import com.nextcloud.talk.utils.Mimetype.VIDEO_PREFIX object DrawableUtils { diff --git a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt index d83d1a244..228777dc3 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt @@ -47,20 +47,28 @@ import com.nextcloud.talk.models.database.CapabilitiesUtil import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.utils.AccountUtils.canWeOpenFilesApp -import com.nextcloud.talk.utils.Mimetype.Companion.AUDIO_PREFIX -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_GIF -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_JPEG -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PNG +import com.nextcloud.talk.utils.Mimetype.AUDIO_MPEG +import com.nextcloud.talk.utils.Mimetype.AUDIO_OGG +import com.nextcloud.talk.utils.Mimetype.AUDIO_PREFIX +import com.nextcloud.talk.utils.Mimetype.AUDIO_WAV +import com.nextcloud.talk.utils.Mimetype.IMAGE_GIF +import com.nextcloud.talk.utils.Mimetype.IMAGE_JPEG +import com.nextcloud.talk.utils.Mimetype.IMAGE_PNG +import com.nextcloud.talk.utils.Mimetype.TEXT_MARKDOWN +import com.nextcloud.talk.utils.Mimetype.TEXT_PLAIN +import com.nextcloud.talk.utils.Mimetype.VIDEO_MP4 +import com.nextcloud.talk.utils.Mimetype.VIDEO_OGG +import com.nextcloud.talk.utils.Mimetype.VIDEO_QUICKTIME import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACCOUNT import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FILE_ID import java.io.File import java.util.concurrent.ExecutionException /* -Usage of this class forces us to do things at one location which should be separated in a activity and view model. - -Example: - - SharedItemsViewHolder + * Usage of this class forces us to do things at one location which should be separated in a activity and view model. + * + * Example: + * - SharedItemsViewHolder */ class FileViewerUtils(private val context: Context, private val userEntity: UserEntity) { @@ -147,19 +155,19 @@ class FileViewerUtils(private val context: Context, private val userEntity: User private fun openFileByMimetype(filename: String, mimetype: String?) { if (mimetype != null) { when (mimetype) { - "audio/mpeg", - "audio/wav", - "audio/ogg", - "video/mp4", - "video/quicktime", - "video/ogg" + AUDIO_MPEG, + AUDIO_WAV, + AUDIO_OGG, + VIDEO_MP4, + VIDEO_QUICKTIME, + VIDEO_OGG -> openMediaView(filename, mimetype) IMAGE_PNG, IMAGE_JPEG, IMAGE_GIF -> openImageView(filename, mimetype) - "text/markdown", - "text/plain" + TEXT_MARKDOWN, + TEXT_PLAIN -> openTextView(filename, mimetype) else -> openFileByExternalApp(filename, mimetype) @@ -253,12 +261,17 @@ class FileViewerUtils(private val context: Context, private val userEntity: User fun isSupportedForInternalViewer(mimetype: String?): Boolean { return when (mimetype) { - IMAGE_PNG, IMAGE_JPEG, - IMAGE_GIF, "audio/mpeg", - "audio/wav", "audio/ogg", - "video/mp4", "video/quicktime", - "video/ogg", "text/markdown", - "text/plain" -> true + IMAGE_PNG, + IMAGE_JPEG, + IMAGE_GIF, + AUDIO_MPEG, + AUDIO_WAV, + AUDIO_OGG, + VIDEO_MP4, + VIDEO_QUICKTIME, + VIDEO_OGG, + TEXT_MARKDOWN, + TEXT_PLAIN -> true else -> false } } @@ -268,7 +281,7 @@ class FileViewerUtils(private val context: Context, private val userEntity: User } private fun isMarkdown(mimetype: String): Boolean { - return "text/markdown" == mimetype + return TEXT_MARKDOWN == mimetype } private fun isAudioOnly(mimetype: String): Boolean { @@ -420,6 +433,5 @@ class FileViewerUtils(private val context: Context, private val userEntity: User companion object { private val TAG = FileViewerUtils::class.simpleName - const val KEY_ID = "id" } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt b/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt index f4f49152e..fcd102819 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ImageEmojiEditText.kt @@ -29,9 +29,9 @@ import android.view.inputmethod.InputConnection import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.inputmethod.InputConnectionCompat import androidx.emoji.widget.EmojiEditText -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_GIF -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_JPEG -import com.nextcloud.talk.utils.Mimetype.Companion.IMAGE_PNG +import com.nextcloud.talk.utils.Mimetype.IMAGE_GIF +import com.nextcloud.talk.utils.Mimetype.IMAGE_JPEG +import com.nextcloud.talk.utils.Mimetype.IMAGE_PNG /* Subclass of EmojiEditText with support for image keyboards - primarily for GIF handling. ;-) diff --git a/app/src/main/java/com/nextcloud/talk/utils/LoggingUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/LoggingUtils.kt index 18a31a55b..fd5265bab 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/LoggingUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/LoggingUtils.kt @@ -52,7 +52,7 @@ object LoggingUtils { // val mailto = "android@nextcloud.com" // emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(mailto)) // emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Talk logs") - // emailIntent.type = "text/plain" + // emailIntent.type = TEXT_PLAIN // emailIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION // val uri: Uri // diff --git a/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt b/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt index 6c0a6d103..77367b8e2 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt @@ -20,17 +20,31 @@ package com.nextcloud.talk.utils -class Mimetype { - companion object { - const val IMAGE_PREFIX = "image/" - const val VIDEO_PREFIX = "video/" - const val TEXT_PREFIX = "text/" - const val AUDIO_PREFIX = "audio" +object Mimetype { + const val IMAGE_PREFIX = "image/" + const val VIDEO_PREFIX = "video/" + const val TEXT_PREFIX = "text/" + const val AUDIO_PREFIX = "audio" - const val FOLDER = "inode/directory" + const val IMAGE_PREFIX_GENERIC = "image/*" + const val VIDEO_PREFIX_GENERIC = "video/*" + const val TEXT_PREFIX_GENERIC = "text/*" - const val IMAGE_PNG = "image/png" - const val IMAGE_JPEG = "image/jpeg" - const val IMAGE_GIF = "image/gif" - } + const val FOLDER = "inode/directory" + + const val IMAGE_PNG = "image/png" + const val IMAGE_JPEG = "image/jpeg" + const val IMAGE_JPG = "image/jpg" + const val IMAGE_GIF = "image/gif" + + const val VIDEO_MP4 = "video/mp4" + const val VIDEO_QUICKTIME = "video/quicktime" + const val VIDEO_OGG = "video/ogg" + + const val TEXT_MARKDOWN = "text/markdown" + const val TEXT_PLAIN = "text/plain" + + const val AUDIO_MPEG = "audio/mpeg" + const val AUDIO_WAV = "audio/wav" + const val AUDIO_OGG = "audio/ogg" }