implement alt text as bottom sheet

This commit is contained in:
sk
2022-05-05 23:26:48 +02:00
parent 899c9cdf21
commit 11d88aed27
4 changed files with 99 additions and 10 deletions

View File

@@ -0,0 +1,78 @@
package org.joinmastodon.android.ui;
import android.app.Activity;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import org.joinmastodon.android.R;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.BottomSheet;
public class ImageDescriptionSheet extends BottomSheet{
private LinearLayout layout;
public ImageDescriptionSheet(@NonNull Activity activity, Attachment attachment){
super(activity);
View handleView=new View(activity);
handleView.setBackgroundResource(R.drawable.bg_bottom_sheet_handle);
ViewGroup handle=new FrameLayout(activity);
handle.addView(handleView);
handle.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(24)));
TextView textView = new TextView(activity);
if (attachment.description == null || attachment.description.isEmpty()) {
textView.setText(R.string.media_no_description);
textView.setTypeface(null, Typeface.ITALIC);
} else {
textView.setText(attachment.description);
}
TextView header = new TextView(activity);
header.setText(R.string.image_description);
header.setAllCaps(true);
header.setTypeface(null, Typeface.BOLD);
header.setPadding(0, V.dp(24), 0, V.dp(8));
layout = new LinearLayout(activity);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(header);
layout.addView(textView);
FrameLayout content=new FrameLayout(activity);
content.setBackgroundResource(R.drawable.bg_bottom_sheet);
content.addView(handle);
content.addView(layout);
content.setPadding(V.dp(24), V.dp(0), V.dp(24), V.dp(0));
setContentView(content);
setNavigationBarBackground(new ColorDrawable(UiUtils.getThemeColor(activity, R.attr.colorWindowBackground)), !UiUtils.isDarkTheme());
}
@Override
protected void onWindowInsetsUpdated(WindowInsets insets){
if(Build.VERSION.SDK_INT>=29){
int tappableBottom=insets.getTappableElementInsets().bottom;
int insetBottom=insets.getSystemWindowInsetBottom();
if(tappableBottom==0 && insetBottom>0){
layout.setPadding(0, 0, 0, V.dp(48)-insetBottom);
}else{
layout.setPadding(0, 0, 0, V.dp(24));
}
}else{
layout.setPadding(0, 0, 0, V.dp(24));
}
}
}

View File

@@ -49,6 +49,7 @@ import android.widget.Toolbar;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.api.MastodonAPIController;
import org.joinmastodon.android.model.Attachment; import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.ui.ImageDescriptionSheet;
import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import java.io.File; import java.io.File;
@@ -71,6 +72,7 @@ import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.CubicBezierInterpolator; import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V; import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.BottomSheet;
import me.grishka.appkit.views.FragmentRootLinearLayout; import me.grishka.appkit.views.FragmentRootLinearLayout;
import okio.BufferedSink; import okio.BufferedSink;
import okio.Okio; import okio.Okio;
@@ -176,11 +178,22 @@ public class PhotoViewer implements ZoomPanView.Listener{
toolbarWrap=uiOverlay.findViewById(R.id.toolbar_wrap); toolbarWrap=uiOverlay.findViewById(R.id.toolbar_wrap);
toolbar=uiOverlay.findViewById(R.id.toolbar); toolbar=uiOverlay.findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(v->onStartSwipeToDismissTransition(0)); toolbar.setNavigationOnClickListener(v->onStartSwipeToDismissTransition(0));
toolbar.getMenu().add(R.string.download).setIcon(R.drawable.ic_fluent_arrow_download_24_regular).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); toolbar.getMenu()
toolbar.setOnMenuItemClickListener(item->{ .add(R.string.image_description)
saveCurrentFile(); .setIcon(R.drawable.ic_fluent_image_alt_text_24_regular)
return true; .setOnMenuItemClickListener(item -> {
}); new ImageDescriptionSheet(activity,attachments.get(pager.getCurrentItem())).show();
return true;
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
toolbar.getMenu()
.add(R.string.download)
.setIcon(R.drawable.ic_fluent_arrow_download_24_regular)
.setOnMenuItemClickListener(item -> {
saveCurrentFile();
return true;
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
uiOverlay.setAlpha(0f); uiOverlay.setAlpha(0f);
videoControls=uiOverlay.findViewById(R.id.video_player_controls); videoControls=uiOverlay.findViewById(R.id.video_player_controls);
videoSeekBar=uiOverlay.findViewById(R.id.seekbar); videoSeekBar=uiOverlay.findViewById(R.id.seekbar);
@@ -699,10 +712,6 @@ public class PhotoViewer implements ZoomPanView.Listener{
@Override @Override
public void onBind(Attachment item){ public void onBind(Attachment item){
zoomPanView.setScrollDirections(getAbsoluteAdapterPosition()>0, getAbsoluteAdapterPosition()<attachments.size()-1); zoomPanView.setScrollDirections(getAbsoluteAdapterPosition()>0, getAbsoluteAdapterPosition()<attachments.size()-1);
zoomPanView.getChildAt(0).setOnLongClickListener(view -> {
Toast.makeText(activity, item.description, Toast.LENGTH_LONG).show();
return true;
});
} }
} }

View File

@@ -203,6 +203,7 @@
<string name="resent_email">Bestätigungs-E-Mail gesendet</string> <string name="resent_email">Bestätigungs-E-Mail gesendet</string>
<string name="compose_hint">Was gibt\'s Neues?</string> <string name="compose_hint">Was gibt\'s Neues?</string>
<string name="content_warning">Inhaltswarnung</string> <string name="content_warning">Inhaltswarnung</string>
<string name="image_description">Bildbeschreibung</string>
<string name="add_image_description">Füge eine Bildbeschreibung hinzu…</string> <string name="add_image_description">Füge eine Bildbeschreibung hinzu…</string>
<string name="retry_upload">Upload erneut versuchen</string> <string name="retry_upload">Upload erneut versuchen</string>
<string name="image_upload_failed">Fehler beim Hochladen des Bildes</string> <string name="image_upload_failed">Fehler beim Hochladen des Bildes</string>
@@ -315,7 +316,7 @@
<string name="manually_approves_followers">Genehmigt Folgende manuell</string> <string name="manually_approves_followers">Genehmigt Folgende manuell</string>
<string name="current_account">Aktuelles Konto</string> <string name="current_account">Aktuelles Konto</string>
<string name="log_out_account">%s ausloggen</string> <string name="log_out_account">%s ausloggen</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators --> <!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<plurals name="x_followers"> <plurals name="x_followers">
<item quantity="one">%,d Follower</item> <item quantity="one">%,d Follower</item>
<item quantity="other">%,d Follower</item> <item quantity="other">%,d Follower</item>

View File

@@ -209,6 +209,7 @@
<string name="compose_hint">Type or paste what\'s on your mind</string> <string name="compose_hint">Type or paste what\'s on your mind</string>
<string name="content_warning">Content warning</string> <string name="content_warning">Content warning</string>
<string name="add_image_description">Add image description…</string> <string name="add_image_description">Add image description…</string>
<string name="image_description">Image description</string>
<string name="retry_upload">Retry upload</string> <string name="retry_upload">Retry upload</string>
<string name="image_upload_failed">Image failed to upload</string> <string name="image_upload_failed">Image failed to upload</string>
<string name="video_upload_failed">Video failed to upload</string> <string name="video_upload_failed">Video failed to upload</string>