diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 068c66b8c..845841c65 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,8 +9,8 @@ android { applicationId "org.joinmastodon.android.moshinda" minSdk 23 targetSdk 33 - versionCode 81 - versionName "1.1.4+fork.81.moshinda" + versionCode 84 + versionName "1.1.4+fork.84.moshinda" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index aabc8fab3..06bddf577 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -917,7 +917,18 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } private void onPublishClick(View v){ - publish(); + if (!attachments.isEmpty() + && statusVisibility != StatusPrivacy.DIRECT + && !attachments.stream().allMatch(attachment -> attachment.description != null && !attachment.description.isBlank())) { + new M3AlertDialogBuilder(getActivity()) + .setTitle(R.string.sk_no_image_desc_title) + .setMessage(R.string.sk_no_image_desc) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.publish, (dialog, i)-> publish()) + .show(); + } else { + publish(); + } } private void publishErrorCallback(ErrorResponse error) { @@ -1030,6 +1041,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } }; + if(editingStatus!=null && !redraftStatus){ new EditStatus(req, editingStatus.id) .setCallback(resCallback) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 39eb25a25..9bfda95f8 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -1,11 +1,16 @@ package org.joinmastodon.android.fragments; +import static android.content.Context.CLIPBOARD_SERVICE; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Activity; import android.app.Fragment; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Outline; @@ -14,10 +19,11 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.VibrationEffect; +import android.os.Vibrator; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ImageSpan; -import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; @@ -32,9 +38,11 @@ import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; +import android.widget.Toast; import android.widget.Toolbar; import org.joinmastodon.android.GlobalUserPreferences; @@ -96,9 +104,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList private static final int COVER_RESULT=343; private ImageView avatar; - private TextView botIcon; private CoverImageView cover; private View avatarBorder; + private Button botIcon; private TextView name, username, bio, followersCount, followersLabel, followingCount, followingLabel, postsCount, postsLabel; private ProgressBarButton actionButton, notifyButton; private ViewPager2 pager; @@ -131,7 +139,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList private WindowInsets childInsets; private PhotoViewer currentPhotoViewer; private boolean editModeLoading; - private String prefilledText; public ProfileFragment(){ super(R.layout.loader_fragment_overlay_toolbar); @@ -156,8 +163,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList if(!getArguments().getBoolean("noAutoLoad", false)) loadData(); } + } - prefilledText = AccountSessionManager.getInstance().isSelf(accountID, account) ? null : '@'+account.acct+' '; + private String getPrefilledText() { + return account == null || AccountSessionManager.getInstance().isSelf(accountID, account) + ? null : '@'+account.acct+' '; } @Override @@ -173,7 +183,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList avatar=content.findViewById(R.id.avatar); cover=content.findViewById(R.id.cover); avatarBorder=content.findViewById(R.id.avatar_border); - botIcon=content.findViewById(R.id.bot_icon); name=content.findViewById(R.id.name); username=content.findViewById(R.id.username); bio=content.findViewById(R.id.bio); @@ -183,6 +192,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList followingCount=content.findViewById(R.id.following_count); followingLabel=content.findViewById(R.id.following_label); followingBtn=content.findViewById(R.id.following_btn); + postsCount=content.findViewById(R.id.posts_count); postsLabel=content.findViewById(R.id.posts_label); postsBtn=content.findViewById(R.id.posts_btn); @@ -266,15 +276,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList } }); - botIcon.setVisibility(account.bot ? View.VISIBLE : View.GONE); - actionButton.setOnClickListener(this::onActionButtonClick); notifyButton.setOnClickListener(this::onNotifyButtonClick); avatar.setOnClickListener(this::onAvatarClick); cover.setOnClickListener(this::onCoverClick); refreshLayout.setOnRefreshListener(this); fab.setOnClickListener(this::onFabClick); - fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID, prefilledText)); + fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID, getPrefilledText())); if(loaded){ bindHeaderView(); @@ -549,25 +557,28 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList if(relationship==null && !isOwnProfile) return; inflater.inflate(isOwnProfile ? R.menu.profile_own : R.menu.profile, menu); -// UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags); - menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getDisplayUsername())); + UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled, R.id.share, R.id.bot_icon); + menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername())); if(isOwnProfile) return; + MenuItem botIcon = menu.findItem(R.id.bot_icon); + botIcon.setVisible(account.bot); + MenuItem mute = menu.findItem(R.id.mute); - mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getDisplayUsername())); - mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_2_24_regular : R.drawable.ic_fluent_speaker_mute_24_regular); + mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername())); + mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular); UiUtils.insetPopupMenuIcon(getContext(), mute); - menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getDisplayUsername())); - menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getDisplayUsername())); + menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername())); + menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername())); MenuItem manageUserLists=menu.findItem(R.id.manage_user_lists); if(relationship.following) { MenuItem hideBoosts = menu.findItem(R.id.hide_boosts); - hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getDisplayUsername())); + hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername())); hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular); UiUtils.insetPopupMenuIcon(getContext(), hideBoosts); - manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getDisplayUsername())); + manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername())); manageUserLists.setVisible(true); }else { menu.findItem(R.id.hide_boosts).setVisible(false); @@ -640,6 +651,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList Bundle args=new Bundle(); args.putString("account", accountID); Nav.go(getActivity(), ScheduledStatusListFragment.class, args); + }else if(id==R.id.bot_icon){ + Toast.makeText(getActivity(), R.string.sk_bot_account, Toast.LENGTH_LONG).show(); } return true; } @@ -951,7 +964,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList private void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); - if(prefilledText != null) args.putString("prefilledText", prefilledText); + if(getPrefilledText() != null) args.putString("prefilledText", getPrefilledText()); Nav.go(getActivity(), ComposeFragment.class, args); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java index 8379a6922..94679733f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java @@ -32,7 +32,7 @@ public class LinkSpan extends CharacterStyle { public void updateDrawState(TextPaint tp) { tp.setColor(color=tp.linkColor); } - + public void onClick(Context context){ switch(getType()){ case URL -> UiUtils.openURL(context, accountID, link); @@ -45,7 +45,6 @@ public class LinkSpan extends CharacterStyle { UiUtils.copyText(view, getType() == Type.URL ? link : text); } - public String getLink(){ return link; } diff --git a/mastodon/src/main/res/drawable/ic_fluent_bot.xml b/mastodon/src/main/res/drawable/ic_fluent_bot.xml deleted file mode 100644 index fb75803ff..000000000 --- a/mastodon/src/main/res/drawable/ic_fluent_bot.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/mastodon/src/main/res/drawable/ic_fluent_bot_20_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_bot_20_regular.xml new file mode 100644 index 000000000..5464f5d35 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_bot_20_regular.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml new file mode 100644 index 000000000..540503341 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/layout/fragment_profile.xml b/mastodon/src/main/res/layout/fragment_profile.xml index 3629edcf9..22636c12c 100644 --- a/mastodon/src/main/res/layout/fragment_profile.xml +++ b/mastodon/src/main/res/layout/fragment_profile.xml @@ -72,22 +72,6 @@ android:contentDescription="@string/profile_picture" tools:src="#0f0" /> - - - - + diff --git a/mastodon/src/main/res/values-de-rDE/strings_sk.xml b/mastodon/src/main/res/values-de-rDE/strings_sk.xml index 8e0dd9083..840480a9b 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -27,6 +27,7 @@ Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind. Moshidon %s ist zum Herunterladen bereit. Moshidon %s wurde heruntergeladen und kann jetzt installiert werden. + Changelog: Auf Update prüfen Kein Update verfügbar Listen @@ -36,31 +37,35 @@ Listen mit %s Inhaltswarnungen immer ausklappen Laufschrift in Titelleisten deaktivieren + Tröt Trennung deaktivieren + Veröffentlichen Schaltfläche verschieben Zu Moshidon beitragen Föderierte Timeline anzeigen + Beiträge Beitrags-​Benachrichtigungen Farbschema + System Pink Violett Grün - Braun - Gelb - Beiträge Blau + Braun + Rot + Gelb + Nord Mehrfachantworten erlauben Übersetzt mit %s - Sprache: %s - %s (%s) - Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\? Übersetzen Original anzeigen + Sprache: %s Verfügbare Sprachen + %s (%s) Zuletzt verwendete Sprachen leeren + Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\? Willkommen! + Moshidon sagt Hi! gib den Domain-Namen deiner Heimat-Instanz unten ein. beispiel.social - Der Hai sagt Hi! Um anzufangen, gib den Domain-Namen deiner Heimat-Instanz unten ein. - System - Rot + Wischen zwischen Tabs deaktivieren Profil einrichten Einstellungen für Beiträge Filter konfigurieren @@ -68,28 +73,28 @@ Regelwerk Über die App Spenden - Wischen zwischen Tabs deaktivieren + Benachrichtigung löschen Benachrichtigung löschen Benachrichtigung wirklich löschen\? + Alle Benachrichtigungen löschen Alle löschen + Wirklich alle Benachrichtigungen löschen? Löschen von Benachrichtigungen aktivieren Veröffentlichen-Button-Text - Nur geöffnete Beiträge übersetzen - Benachrichtigung löschen - Alle Benachrichtigungen löschen Veröffentlichen-Button-Text anpassen - Wirklich alle Benachrichtigungen löschen\? + Nur geöffnete Beiträge übersetzen %s unterstützt Übersetzung! %s scheint keine Übersetzung zu unterstützen. Suche im Fediverse + Suche auf %s Reblog rückgängig machen Rebloggen mit Sichtbarkeit Drüberkommentieren Hashtags, denen du folgst Link zum Beitrag kopieren + In anderem Konto öffnen Mit anderem Konto öffnen Ressource nicht gefunden - Suche auf %s Lesezeichen in anderem Konto Lesezeichen gesetzt als %s Bereits in den Lesezeichen @@ -116,8 +121,14 @@ Beitrag geplant Geplante Zeit ist zu früh Der Beitrag muss mindestens 10 Minuten in der Zukunft eingeplant werden. - Änderungen speichern\? - Beitrag planen - Entwurf speichern\? + Entwurf speichern? + Änderungen speichern? Als Entwurf markieren - \ No newline at end of file + Beitrag planen + Planen oder Entwurf + Nicht planen + Nicht entwerfen + Bewegungen in Animationen reduzieren + Keine Bildbeschreibung + Die enthaltenen Bilder haben keine Beschreibung. Bitte fügen Sie eine Beschreibung hinzu, damit auch sehbehinderte Personen teilnehmen können. + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 47f7cfccb..5a213ef14 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -130,6 +130,9 @@ Don’t schedule Don’t draft Reduce motion in animations + This is a bot account + No Image description + The included images have no description. Please consider adding one, to allow visually impaired people to participate. Recently used Clear recently used emoji \ No newline at end of file diff --git a/metadata/en-US/changelogs/82.txt b/metadata/en-US/changelogs/82.txt new file mode 100644 index 000000000..7c0e3b2e6 --- /dev/null +++ b/metadata/en-US/changelogs/82.txt @@ -0,0 +1,9 @@ +Release 82 adds a lot of features from upstream, such as: +- Drafts and scheduled posts +- A settings page rework +- The ability to choose the publish button text +- The ability to reduce animations +- A bot icon for bot account profiles! Thanks @FineFindus +- And updated German translation! Thanks @dantobi +- A lot of minor UI improvements +- Major usability improvements, as the ability to hold action buttons to interact with another account diff --git a/metadata/en-US/changelogs/83.txt b/metadata/en-US/changelogs/83.txt new file mode 100644 index 000000000..ff0c26144 --- /dev/null +++ b/metadata/en-US/changelogs/83.txt @@ -0,0 +1,4 @@ +Release 83 brings some minor improvements, such as: +- Fixing crashing issues when clicking mentions +- Reworking the bot icon +- Adding a reminder to add an image description if you post an attachment allow visually impaired people to better participate. Thanks @FineFindus! \ No newline at end of file diff --git a/metadata/en-US/changelogs/84.txt b/metadata/en-US/changelogs/84.txt new file mode 100644 index 000000000..584c3f4dc --- /dev/null +++ b/metadata/en-US/changelogs/84.txt @@ -0,0 +1,3 @@ +Release 84 fixes a few bugs, such as: +- Login callback not working +- Updating german translation. Thanks @DanTobi! diff --git a/metadata/en-US/images/phoneScreenshots/4.png b/metadata/en-US/images/phoneScreenshots/4.png index 61845920c..b1572f52f 100644 Binary files a/metadata/en-US/images/phoneScreenshots/4.png and b/metadata/en-US/images/phoneScreenshots/4.png differ