Browse Source

Merge pull request #2140 from nextcloud/chore/noid/MimetypeCentralization

Centralize mime type definitions
Andy Scherzinger 3 năm trước cách đây
mục cha
commit
07c30f0993

+ 2 - 1
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)))

+ 2 - 1
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)))

+ 2 - 1
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)))

+ 3 - 1
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();
                 });

+ 2 - 1
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.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

+ 2 - 1
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.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

+ 3 - 1
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

+ 9 - 3
app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt

@@ -71,6 +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.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
@@ -482,7 +485,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)
@@ -565,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

+ 2 - 1
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.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 {

+ 2 - 2
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.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"
     }
 }

+ 2 - 1
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(

+ 11 - 7
app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt

@@ -21,7 +21,11 @@
 package com.nextcloud.talk.utils
 
 import com.nextcloud.talk.R
-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 {
 
@@ -140,7 +144,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 +153,7 @@ object DrawableUtils {
         }
 
         if ("DIR" == localMimetype) {
-            localMimetype = "inode/directory"
+            localMimetype = FOLDER
             return drawableMap[localMimetype]!!
         }
 
@@ -157,19 +161,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"]!!
     }

+ 41 - 25
app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt

@@ -47,16 +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.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) {
 
@@ -143,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"
+                IMAGE_PNG,
+                IMAGE_JPEG,
+                IMAGE_GIF
                 -> openImageView(filename, mimetype)
-                "text/markdown",
-                "text/plain"
+                TEXT_MARKDOWN,
+                TEXT_PLAIN
                 -> openTextView(filename, mimetype)
                 else
                 -> openFileByExternalApp(filename, mimetype)
@@ -249,26 +261,31 @@ 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
         }
     }
 
     private fun isGif(mimetype: String): Boolean {
-        return "image/gif" == mimetype
+        return IMAGE_GIF == mimetype
     }
 
     private fun isMarkdown(mimetype: String): Boolean {
-        return "text/markdown" == mimetype
+        return TEXT_MARKDOWN == mimetype
     }
 
     private fun isAudioOnly(mimetype: String): Boolean {
-        return mimetype.startsWith("audio")
+        return mimetype.startsWith(AUDIO_PREFIX)
     }
 
     @SuppressLint("LongLogTag")
@@ -416,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"
     }
 }

+ 4 - 1
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.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. ;-)
@@ -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, _ ->

+ 1 - 1
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
         //

+ 50 - 0
app/src/main/java/com/nextcloud/talk/utils/Mimetype.kt

@@ -0,0 +1,50 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Andy Scherzinger
+ * Copyright (C) 2022 Andy Scherzinger <info@andy-scherzinger.de>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.talk.utils
+
+object Mimetype {
+    const val IMAGE_PREFIX = "image/"
+    const val VIDEO_PREFIX = "video/"
+    const val TEXT_PREFIX = "text/"
+    const val AUDIO_PREFIX = "audio"
+
+    const val IMAGE_PREFIX_GENERIC = "image/*"
+    const val VIDEO_PREFIX_GENERIC = "video/*"
+    const val TEXT_PREFIX_GENERIC = "text/*"
+
+    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"
+}