implement alt text as bottom sheet
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
.setIcon(R.drawable.ic_fluent_image_alt_text_24_regular)
|
||||||
|
.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();
|
saveCurrentFile();
|
||||||
return true;
|
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;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user