diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b462a6f..8d021466 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + + if (!isGranted) { + MaterialAlertDialogBuilder(this) + .setMessage(R.string.write_permission_download_pic) + .setNegativeButton(android.R.string.ok) { _, _ -> } + .show() + } + } private fun activateCommenter() { //Activate commenter binding.submitComment.setOnClickListener { diff --git a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt index 0c4ff821..b77cf62c 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt @@ -4,10 +4,13 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.ClipData import android.content.Intent +import android.content.pm.PackageManager.PERMISSION_DENIED +import android.content.pm.PackageManager.PERMISSION_GRANTED import android.graphics.Typeface import android.graphics.drawable.AnimatedVectorDrawable import android.graphics.drawable.Drawable import android.net.Uri +import android.os.Build import android.os.Looper import android.text.method.LinkMovementMethod import android.util.Log @@ -16,6 +19,7 @@ import android.view.Menu import android.view.View import android.view.ViewGroup import android.widget.* +import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat @@ -70,7 +74,11 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold private var status: Status? = null - fun bind(status: Status?, pixelfedAPI: PixelfedAPIHolder, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope, displayDimensionsInPx: Pair, isActivity: Boolean = false) { + fun bind( + status: Status?, pixelfedAPI: PixelfedAPIHolder, db: AppDatabase, + lifecycleScope: LifecycleCoroutineScope, displayDimensionsInPx: Pair, + requestPermissionDownloadPic: ActivityResultLauncher, isActivity: Boolean = false + ) { this.itemView.visibility = View.VISIBLE this.status = status @@ -99,7 +107,7 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold setupPost(picRequest, user.instance_uri, isActivity) - activateButtons(pixelfedAPI, db, lifecycleScope, isActivity) + activateButtons(pixelfedAPI, db, lifecycleScope, isActivity, requestPermissionDownloadPic) } @@ -227,6 +235,7 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold db: AppDatabase, lifecycleScope: LifecycleCoroutineScope, isActivity: Boolean, + requestPermissionDownloadPic: ActivityResultLauncher, ){ //Set the special HTML text setDescription(apiHolder, lifecycleScope) @@ -256,7 +265,7 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold showComments(lifecycleScope, isActivity) - activateMoreButton(apiHolder, db, lifecycleScope) + activateMoreButton(apiHolder, db, lifecycleScope, requestPermissionDownloadPic) } private fun activateReblogger( @@ -358,7 +367,12 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold return null } - private fun activateMoreButton(apiHolder: PixelfedAPIHolder, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope){ + private fun activateMoreButton( + apiHolder: PixelfedAPIHolder, + db: AppDatabase, + lifecycleScope: LifecycleCoroutineScope, + requestPermissionDownloadPic: ActivityResultLauncher + ){ var bookmarked: Boolean? = null binding.statusMore.setOnClickListener { PopupMenu(it.context, it).apply { @@ -396,12 +410,18 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold true } R.id.post_more_menu_save_to_gallery -> { + // Check permissions on old Android versions: on new versions it is not + // needed when storing a file. + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && ContextCompat.checkSelfPermission(binding.root.context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_DENIED) { + requestPermissionDownloadPic.launch(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) + } else { status?.downloadImage( binding.root.context, status?.media_attachments?.getOrNull(binding.postPager.currentItem)?.url ?: "", binding.root ) + } true } diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt index ba65353c..40a76c83 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt @@ -74,6 +74,7 @@ class PostFeedFragment: CachedFeedFragment() { return view } + inner class PostsAdapter(private val displayDimensionsInPx: Pair) : PagingDataAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame (oldItem: T, newItem: T): Boolean = oldItem.id == newItem.id @@ -94,7 +95,9 @@ class PostFeedFragment: CachedFeedFragment() { ) val uiModel = getItem(position) as Status? uiModel?.let { - (holder as StatusViewHolder).bind(it, apiHolder, db, lifecycleScope, displayDimensionsInPx) + (holder as StatusViewHolder).bind( + it, apiHolder, db, lifecycleScope, displayDimensionsInPx, requestPermissionDownloadPic + ) } } } diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedPostsFragment.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedPostsFragment.kt index 2d26b4b3..61c71cb5 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedPostsFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedPostsFragment.kt @@ -85,7 +85,9 @@ class UncachedPostsFragment : UncachedFeedFragment() { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { getItem(position)?.let { - (holder as StatusViewHolder).bind(it, apiHolder, db, lifecycleScope, displayDimensionsInPx) + (holder as StatusViewHolder).bind( + it, apiHolder, db, lifecycleScope, displayDimensionsInPx, requestPermissionDownloadPic + ) } } } diff --git a/app/src/main/java/org/pixeldroid/app/profile/ProfileFeedFragment.kt b/app/src/main/java/org/pixeldroid/app/profile/ProfileFeedFragment.kt index 5e473f24..558a95d4 100644 --- a/app/src/main/java/org/pixeldroid/app/profile/ProfileFeedFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/profile/ProfileFeedFragment.kt @@ -178,8 +178,10 @@ class ProfileFeedFragment : UncachedFeedFragment() { deleteFromCollection ) } else { - (holder as StatusViewHolder).bind(it as Status, apiHolder, db, - lifecycleScope, requireContext().displayDimensionsInPx()) + (holder as StatusViewHolder).bind( + it as Status, apiHolder, db, lifecycleScope, + requireContext().displayDimensionsInPx(), requestPermissionDownloadPic + ) } } diff --git a/app/src/main/java/org/pixeldroid/app/utils/BaseFragment.kt b/app/src/main/java/org/pixeldroid/app/utils/BaseFragment.kt index edac820a..e415ccb7 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/BaseFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/BaseFragment.kt @@ -1,7 +1,10 @@ package org.pixeldroid.app.utils import android.os.Bundle +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.pixeldroid.app.R import org.pixeldroid.app.utils.db.AppDatabase import org.pixeldroid.app.utils.di.PixelfedAPIHolder import javax.inject.Inject @@ -22,4 +25,18 @@ open class BaseFragment: Fragment() { (requireActivity().application as PixelDroidApplication).getAppComponent().inject(this) } + internal val requestPermissionDownloadPic = + registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (!isGranted) { + context?.let { + MaterialAlertDialogBuilder(it) + .setMessage(R.string.write_permission_download_pic) + .setNegativeButton(android.R.string.ok) { _, _ -> } + .show() + } + + } + } } diff --git a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt index 5ce0664f..34941389 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt @@ -1,8 +1,10 @@ package org.pixeldroid.app.utils.api.objects +import android.Manifest.permission.WRITE_EXTERNAL_STORAGE import android.app.DownloadManager import android.content.Context import android.content.Intent +import android.content.pm.PackageManager.PERMISSION_GRANTED import android.database.Cursor import android.net.Uri import android.os.Environment @@ -11,6 +13,7 @@ import androidx.core.net.toUri import com.google.android.material.snackbar.Snackbar import org.pixeldroid.app.R import org.pixeldroid.app.posts.getDomain +import org.pixeldroid.app.utils.getMimeType import java.io.File import java.io.Serializable import java.time.Instant @@ -148,11 +151,13 @@ open class Status( ) val file = path.toUri() + + val shareIntent: Intent = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, file) flags = Intent.FLAG_GRANT_READ_URI_PERMISSION - type = "image/$ext" + type = file.getMimeType(context.contentResolver) }, null) context.startActivity(shareIntent) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 510d9624..2dfec527 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -52,7 +52,6 @@ التعليق: تم نشر%1$s! خطأ في التعليق! مشاركة الصورة - يجب عليك منح تصريح للكتابة قصد مشاركة الصور! تحتاج إلى منح إذن الكتابة لتنزيل الصور! لا يجب ان يكون التعليق فارغًا! نُشِر في %1$s diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6ecfc72d..a81ee98e 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -60,7 +60,6 @@ Comentari: %1$s publicat! Error de comentari! Compartir imatge - Necessites concedir permís d’escriptura per compartir imatges! Has de concedir permís d’escriptura per baixar imatges! El comentari no ha de estar buit! Publica\'t el %1$s diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ea85fa7a..88d77011 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -69,7 +69,6 @@ Zveřejněno na %1$s U tohoto příspěvku nejsou žádné komentáře… Komentář nesmí být prázdný! - Pro sdílení obrázků musíte udělit práva k zápisu! Sdílet obrázek Chyba komentáře! Komentář: %1$s zveřejněn! diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 587ac99d..03514ac0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -79,7 +79,6 @@ Feed konnte nicht geladen werden Erstellt am %1$s Für das Herunterladen von Bildern müssen Sie eine Schreibgenehmigung erteilen! - Für die Teilen von Bildern müssen Sie eine Schreibgenehmigung erteilen! Konnte den Folgestatus nicht erhalten Wiederholen Hier gibt\'s nichts zu sehen! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 297e113d..7fad8794 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -64,7 +64,6 @@ ¡Comentario: %1$s publicado! ¡Error al comentar! Compartir imagen - ¡Tienes que dar permiso de escritura para compartir fotos! ¡Tienes que dar permiso de escritura para descargar fotos! ¡Los comentarios no deben estar vacíos! Publicado en %1$s diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 788e049f..ce7fae28 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -76,7 +76,6 @@ Ezin izan da jarraipen-botoia erakutsi Ezin izan da segimendu-egoera lortu Iruzkin - Idazteko baimena eman behar duzu argazkiak partekatzeko! %1$s(e)n argitaratua TRAOLAK KONTUAK diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 7b201667..f192bce7 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -56,7 +56,6 @@ منتشر شده در %1$s نظر نمی‌تواند خالی باشد! برای بارگیری تصاویر بایستی مجوز نوشتن را بدهید! - برای هم‌رسانی تصاویر باید مجوز نوشتن را بدهید! هم‌رسانی تصویر خطا در درج نظر! نظر: %1$s منتشر کرد! diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 66eb3f89..3165ff80 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -49,8 +49,7 @@ Téléversement de la publication avec succès Publié le %1$s Le commentaire ne doit pas être vide ! - Vous devez accorder une autorisation d\'écriture pour partager des photos ! - - + - \nAbonné·e·s Le téléversement de la publication a échoué Une erreur s\'est produite lors du chargement diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index c7364f98..cbc31679 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -61,7 +61,6 @@ Comentario: %1$s publicado! Fallo ao comentar! Compartir Imaxe - Tes que dar permiso de escritura para compartir fotos! Tes que conceder permiso de escritura para descargar fotos! O comentario non debe quedar baleiro! Publicado o %1$s diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index f1937fe4..8e95e3de 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -106,7 +106,6 @@ Hozzászólás: %1$s közzétéve! Hozzászólási hiba! Kép megosztása - Írási engedélyt kell adnia a képek megosztásához! Írási engedélyt kell adnia a képek letöltéséhez! A hozzászólás nem lehet üres! Nincsenek hozzászólások a bejegyzésnél… diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 75ab0e7b..a169bc81 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -53,7 +53,6 @@ Nessuna descrizione Postato su %1$s Il commento non deve essere vuoto! - È necessario concedere i permessi di scrittura per condividere le immagini! Condividi immagine Errore nel commento! Commento: %1$s postato! diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 02c8f4bf..4e880f9c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -39,7 +39,6 @@ インスタンス情報が取得できませんでした %1$s の投稿 アカウント - 画像を共有するためには書き込みの権限を更新する必要があります 画像をダウンロードするには書き込みの権限を更新する必要があります コメントは空欄にできません コメント: %1$s が投稿されました diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 96f33b7f..cc77e097 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -100,7 +100,6 @@ എപിഐ ഈ ഇൻസ്റ്റൻസിൽ സജീവമല്ലാ.ഇത് സജീവമാക്കാൻ നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക. ഫീഡ് ലഭ്യമാക്കാൻ സാധിച്ചില്ല ചിത്രങ്ങൾ ഡൗൺലോഡ് ചെയ്യാൻ നിങ്ങൾ എഴുത്ത് അനുമതി നൽകണം! - ചിത്രങ്ങൾ പങ്കിടാൻ നിങ്ങൾ എഴുത്ത് അനുമതി നൽകണം! %d diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0e9ac476..380e0241 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -70,7 +70,6 @@ Commentaar: %1$s gepost! Fout met commentaar! Afbeelding delen - Je moet schrijven toestaan om afbeeldingen te delen! Je moet schrijven toestaan om afbeeldingen te downloaden! Kon volgstatus niet ophalen Kon niet volgen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 153f7c45..8a7aea9f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -40,7 +40,6 @@ Bez opisu Opublikowano %1$s Komentarz nie może być pusty! - Musisz nadać uprawnienia do zapisu, aby móc udostępniać obrazki! Udostępnij Błąd komentarza! Komentarz: %1$s opublikowany! diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 65b4b545..2e5c4a66 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -146,7 +146,6 @@ Mudar para visualização em grade Comentário: %1$s publicado! Erro no comentário! - Você precisa conceder permissão de gravação para compartilhar imagens! Idioma Excluir esta publicação\? Algo deu errado… diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 5148923e..62e8b80c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -84,7 +84,6 @@ Partilhar imagem Erro ao comentar! Precisa adicionar a permissão para transferir imagens! - Precisa adicionar permissão para partilhar imagens! Comentário: %1$s publicou! Comentário Adicionar um comentário diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 03a0bc40..7397d272 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -42,7 +42,6 @@ Ошибка комментирования! Поделиться изображением Вам необходимо предоставить разрешение на запись чтобы скачивать фотографии! - Вы должны дать разрешение на запись чтобы делиться фотографиями! Комментарий не должен быть пустым! Опубликовано в %1$s Описание отсутствует diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b2d31285..1f24c51d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -64,7 +64,6 @@ Kommentar: %1$s inlagd! Kommentarsfel! Dela bild - Du måste tillåta skrivrättigheter för att dela bilder! Du måste tillåta skrivrättigheter för att ladda ned bilder! Kommentaren får inte vara tom! Inlagt på %1$s diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e3afb58a..3694f106 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -165,7 +165,6 @@ Поширити зображення %1$s хвалить ваш допис Файлу %1$s не знайдено - Для поширення зображень потрібен дозвіл на запис! Помилка вивантаження: хибний формат зображення. Відписатись Не вдалося вивантажити медіа, повторіть спробу чи перевірте мережне з\'єднання diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a3da612e..66815d5f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -64,7 +64,6 @@ 评论: %1$s 已发布! 评论错误! 分享图像 - 您需要允许读写权限才能共享图片! 您需要允许读写权限才能下载图片! 评论不能为空! 发表于 %1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d154a3a5..b2eb5ec2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,7 +150,6 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" No comments on this post… Comment must not be empty! You need to grant write permission to download pictures! - You need to grant write permission to share pictures! Share Image Comment error! "Comment: %1$s posted!"