diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/MediaActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/MediaActivity.java index fb1e5040..f63d9eeb 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/MediaActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/MediaActivity.java @@ -193,7 +193,7 @@ public class MediaActivity extends BaseBarActivity implements OnDownloadInterfac binding.mediaDescription.setText(description); binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(mediaPosition - 1).description; - TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, status!=null?status.language:"en", translated -> { + TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, getStatusLanguageForTranslation(), translated -> { if (translated != null) { attachments.get(mediaPosition - 1).translation = translated; binding.mediaDescriptionTranslated.setText(translated); @@ -248,7 +248,7 @@ public class MediaActivity extends BaseBarActivity implements OnDownloadInterfac } binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(position).description; - TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, status!=null?status.language:"en", translated -> { + TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, getStatusLanguageForTranslation(), translated -> { if (translated != null) { attachments.get(position).translation = translated; binding.mediaDescriptionTranslated.setText(translated); @@ -292,6 +292,9 @@ public class MediaActivity extends BaseBarActivity implements OnDownloadInterfac setFullscreen(true); } + public String getStatusLanguageForTranslation() { + return status != null ? status.language : "en"; + } private Spannable linkify(Context context, String content) { if (content == null) { @@ -358,20 +361,20 @@ public class MediaActivity extends BaseBarActivity implements OnDownloadInterfac } return true; } else if (item.getItemId() == R.id.action_save) { - int position = binding.mediaViewpager.getCurrentItem(); - Attachment attachment = attachments.get(position); - if (Build.VERSION.SDK_INT >= 23) { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { - if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE); - } else { - if (attachment.type.compareTo("image") == 0) { - MediaHelper.manageMove(MediaActivity.this, attachment.url, false); - } else { - MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); - downloadID = -1; - } - } + saveMedia(); + } else if (item.getItemId() == R.id.action_share) { + shareMedia(); + } + return true; + } + + public void saveMedia() { + int position = binding.mediaViewpager.getCurrentItem(); + Attachment attachment = attachments.get(position); + if (Build.VERSION.SDK_INT >= 23) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { + if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE); } else { if (attachment.type.compareTo("image") == 0) { MediaHelper.manageMove(MediaActivity.this, attachment.url, false); @@ -381,33 +384,41 @@ public class MediaActivity extends BaseBarActivity implements OnDownloadInterfac } } } else { - if (attachment.type.compareToIgnoreCase("image") == 0) { + if (attachment.type.compareTo("image") == 0) { MediaHelper.manageMove(MediaActivity.this, attachment.url, false); } else { MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); downloadID = -1; } } - } else if (item.getItemId() == R.id.action_share) { - int position = binding.mediaViewpager.getCurrentItem(); - Attachment attachment = attachments.get(position); - if (attachment.type.compareTo("image") == 0) { - MediaHelper.manageMove(MediaActivity.this, attachment.url, true); - } else if (attachment.type.equalsIgnoreCase("video") || attachment.type.equalsIgnoreCase("audio") || attachment.type.equalsIgnoreCase("gifv")) { - downloadID = MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); + } else { + if (attachment.type.compareToIgnoreCase("image") == 0) { + MediaHelper.manageMove(MediaActivity.this, attachment.url, false); } else { - if (Build.VERSION.SDK_INT >= 23) { - if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SHARE); - } else { - downloadID = MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); - } + MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); + downloadID = -1; + } + } + } + + public void shareMedia() { + int position = binding.mediaViewpager.getCurrentItem(); + Attachment attachment = attachments.get(position); + if (attachment.type.compareTo("image") == 0) { + MediaHelper.manageMove(MediaActivity.this, attachment.url, true); + } else if (attachment.type.equalsIgnoreCase("video") || attachment.type.equalsIgnoreCase("audio") || attachment.type.equalsIgnoreCase("gifv")) { + downloadID = MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); + } else { + if (Build.VERSION.SDK_INT >= 23) { + if (ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MediaActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(MediaActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Helper.EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SHARE); } else { downloadID = MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); } + } else { + downloadID = MediaHelper.manageDownloadsNoPopup(MediaActivity.this, attachment.url); } } - return true; } @Override diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/media/FragmentMedia.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/media/FragmentMedia.java index 8170e881..4deb51b0 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/media/FragmentMedia.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/media/FragmentMedia.java @@ -32,6 +32,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.OptIn; import androidx.core.app.ActivityCompat; +import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.media3.common.MediaItem; @@ -60,6 +61,7 @@ import app.fedilab.android.mastodon.client.entities.api.Attachment; import app.fedilab.android.mastodon.helper.CacheDataSourceFactory; import app.fedilab.android.mastodon.helper.Helper; import app.fedilab.android.mastodon.helper.MediaHelper; +import app.fedilab.android.mastodon.helper.TranslateHelper; import app.fedilab.android.mastodon.viewmodel.mastodon.TimelinesVM; import es.dmoral.toasty.Toasty; @@ -74,6 +76,8 @@ public class FragmentMedia extends Fragment { private boolean swipeEnabled; private FragmentSlideMediaBinding binding; private SlidrInterface slidrInterface; + private int mediaPictureTranslateAccessibilityActionId = 0; + private int mediaVideoTranslateAccessibilityActionId = 0; private boolean visible = false; @@ -124,7 +128,6 @@ public class FragmentMedia extends Fragment { enableSliding(true); } }); - binding.mediaPicture.setContentDescription(attachment.description); binding.mediaPicture.setOnClickListener(v -> { if (isAdded()) { ((MediaActivity) requireActivity()).toogleFullScreen(); @@ -137,6 +140,37 @@ public class FragmentMedia extends Fragment { } }); + if (attachment.description != null) { + binding.mediaPicture.setContentDescription(attachment.description); + mediaPictureTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaPicture, getString(R.string.translate), (view2, arguments) -> { + translate(); + return true; + }); + + binding.mediaVideo.setContentDescription(attachment.description); + mediaVideoTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaVideo, getString(R.string.translate), (view2, arguments) -> { + translate(); + return true; + }); + } + + mediaPictureTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaPicture, getString(R.string.download), (view2, arguments) -> { + ((MediaActivity) requireActivity()).saveMedia(); + return true; + }); + mediaPictureTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaVideo, getString(R.string.download), (view2, arguments) -> { + ((MediaActivity) requireActivity()).saveMedia(); + return true; + }); + mediaPictureTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaPicture, getString(R.string.share), (view2, arguments) -> { + ((MediaActivity) requireActivity()).shareMedia(); + return true; + }); + mediaPictureTranslateAccessibilityActionId = ViewCompat.addAccessibilityAction(binding.mediaVideo, getString(R.string.share), (view2, arguments) -> { + ((MediaActivity) requireActivity()).shareMedia(); + return true; + }); + String type = attachment.type; String preview_url = attachment.preview_url; if (type.equalsIgnoreCase("unknown")) { @@ -267,6 +301,23 @@ public class FragmentMedia extends Fragment { } } + public void translate() { + if (attachment.translation == null) TranslateHelper.translate( + requireContext(), + attachment.description, + ((MediaActivity) requireActivity()).getStatusLanguageForTranslation(), + translated -> { + attachment.translation = translated; + String translatedMediaDescription = getString(R.string.cd_translated_media_description, attachment.translation); + + binding.mediaPicture.setContentDescription(translatedMediaDescription); + ViewCompat.removeAccessibilityAction(binding.mediaPicture, mediaPictureTranslateAccessibilityActionId); + + binding.mediaVideo.setContentDescription(translatedMediaDescription); + ViewCompat.removeAccessibilityAction(binding.mediaVideo, mediaVideoTranslateAccessibilityActionId); + }); + } + @androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) private void loadVideo(String url, String type) { if (binding == null || !isAdded() || getActivity() == null || url == null) { diff --git a/app/src/main/res/layouts/mastodon/layout/activity_media_pager.xml b/app/src/main/res/layouts/mastodon/layout/activity_media_pager.xml index 5d81b015..b0c9a221 100644 --- a/app/src/main/res/layouts/mastodon/layout/activity_media_pager.xml +++ b/app/src/main/res/layouts/mastodon/layout/activity_media_pager.xml @@ -43,6 +43,7 @@ android:visibility="gone" tools:visibility="visible" app:layout_constraintStart_toStartOf="parent" + android:importantForAccessibility="noHideDescendants" android:layout_width="match_parent" android:layout_height="wrap_content">