diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/390.txt b/Archives/ReleaseNotes/390.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/390.txt rename to Archives/ReleaseNotes/390.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/391.txt b/Archives/ReleaseNotes/391.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/391.txt rename to Archives/ReleaseNotes/391.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/393.txt b/Archives/ReleaseNotes/393.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/393.txt rename to Archives/ReleaseNotes/393.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/394.txt b/Archives/ReleaseNotes/394.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/394.txt rename to Archives/ReleaseNotes/394.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/395.txt b/Archives/ReleaseNotes/395.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/395.txt rename to Archives/ReleaseNotes/395.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/396.txt b/Archives/ReleaseNotes/396.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/396.txt rename to Archives/ReleaseNotes/396.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/397.txt b/Archives/ReleaseNotes/397.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/397.txt rename to Archives/ReleaseNotes/397.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/398.txt b/Archives/ReleaseNotes/398.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/398.txt rename to Archives/ReleaseNotes/398.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/399.txt b/Archives/ReleaseNotes/399.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/399.txt rename to Archives/ReleaseNotes/399.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/400.txt b/Archives/ReleaseNotes/400.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/400.txt rename to Archives/ReleaseNotes/400.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/401.txt b/Archives/ReleaseNotes/401.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/401.txt rename to Archives/ReleaseNotes/401.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/402.txt b/Archives/ReleaseNotes/402.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/402.txt rename to Archives/ReleaseNotes/402.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/405.txt b/Archives/ReleaseNotes/405.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/405.txt rename to Archives/ReleaseNotes/405.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/407.txt b/Archives/ReleaseNotes/407.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/407.txt rename to Archives/ReleaseNotes/407.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/408.txt b/Archives/ReleaseNotes/408.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/408.txt rename to Archives/ReleaseNotes/408.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/409.txt b/Archives/ReleaseNotes/409.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/409.txt rename to Archives/ReleaseNotes/409.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/410.txt b/Archives/ReleaseNotes/410.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/410.txt rename to Archives/ReleaseNotes/410.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/411.txt b/Archives/ReleaseNotes/411.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/411.txt rename to Archives/ReleaseNotes/411.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/412.txt b/Archives/ReleaseNotes/412.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/412.txt rename to Archives/ReleaseNotes/412.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/413.txt b/Archives/ReleaseNotes/413.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/413.txt rename to Archives/ReleaseNotes/413.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/414.txt b/Archives/ReleaseNotes/414.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/414.txt rename to Archives/ReleaseNotes/414.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/415.txt b/Archives/ReleaseNotes/415.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/415.txt rename to Archives/ReleaseNotes/415.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/416.txt b/Archives/ReleaseNotes/416.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/416.txt rename to Archives/ReleaseNotes/416.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/417.txt b/Archives/ReleaseNotes/417.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/417.txt rename to Archives/ReleaseNotes/417.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/418.txt b/Archives/ReleaseNotes/418.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/418.txt rename to Archives/ReleaseNotes/418.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/419.txt b/Archives/ReleaseNotes/419.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/419.txt rename to Archives/ReleaseNotes/419.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/420.txt b/Archives/ReleaseNotes/420.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/420.txt rename to Archives/ReleaseNotes/420.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/421.txt b/Archives/ReleaseNotes/421.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/421.txt rename to Archives/ReleaseNotes/421.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/422.txt b/Archives/ReleaseNotes/422.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/422.txt rename to Archives/ReleaseNotes/422.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/423.txt b/Archives/ReleaseNotes/423.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/423.txt rename to Archives/ReleaseNotes/423.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/424.txt b/Archives/ReleaseNotes/424.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/424.txt rename to Archives/ReleaseNotes/424.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/425.txt b/Archives/ReleaseNotes/425.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/425.txt rename to Archives/ReleaseNotes/425.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/426.txt b/Archives/ReleaseNotes/426.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/426.txt rename to Archives/ReleaseNotes/426.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/427.txt b/Archives/ReleaseNotes/427.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/427.txt rename to Archives/ReleaseNotes/427.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/428.txt b/Archives/ReleaseNotes/428.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/428.txt rename to Archives/ReleaseNotes/428.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/429.txt b/Archives/ReleaseNotes/429.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/429.txt rename to Archives/ReleaseNotes/429.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/430.txt b/Archives/ReleaseNotes/430.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/430.txt rename to Archives/ReleaseNotes/430.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/431.txt b/Archives/ReleaseNotes/431.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/431.txt rename to Archives/ReleaseNotes/431.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/432.txt b/Archives/ReleaseNotes/432.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/432.txt rename to Archives/ReleaseNotes/432.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/433.txt b/Archives/ReleaseNotes/433.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/433.txt rename to Archives/ReleaseNotes/433.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/434.txt b/Archives/ReleaseNotes/434.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/434.txt rename to Archives/ReleaseNotes/434.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/435.txt b/Archives/ReleaseNotes/435.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/435.txt rename to Archives/ReleaseNotes/435.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/436.txt b/Archives/ReleaseNotes/436.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/436.txt rename to Archives/ReleaseNotes/436.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/437.txt b/Archives/ReleaseNotes/437.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/437.txt rename to Archives/ReleaseNotes/437.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/439.txt b/Archives/ReleaseNotes/439.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/439.txt rename to Archives/ReleaseNotes/439.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/440.txt b/Archives/ReleaseNotes/440.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/440.txt rename to Archives/ReleaseNotes/440.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/441.txt b/Archives/ReleaseNotes/441.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/441.txt rename to Archives/ReleaseNotes/441.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/442.txt b/Archives/ReleaseNotes/442.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/442.txt rename to Archives/ReleaseNotes/442.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/443.txt b/Archives/ReleaseNotes/443.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/443.txt rename to Archives/ReleaseNotes/443.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/444.txt b/Archives/ReleaseNotes/444.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/444.txt rename to Archives/ReleaseNotes/444.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/445.txt b/Archives/ReleaseNotes/445.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/445.txt rename to Archives/ReleaseNotes/445.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/446.txt b/Archives/ReleaseNotes/446.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/446.txt rename to Archives/ReleaseNotes/446.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/447.txt b/Archives/ReleaseNotes/447.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/447.txt rename to Archives/ReleaseNotes/447.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/448.txt b/Archives/ReleaseNotes/448.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/448.txt rename to Archives/ReleaseNotes/448.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/449.txt b/Archives/ReleaseNotes/449.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/449.txt rename to Archives/ReleaseNotes/449.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/450.txt b/Archives/ReleaseNotes/450.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/450.txt rename to Archives/ReleaseNotes/450.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt b/Archives/ReleaseNotes/451.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/451.txt rename to Archives/ReleaseNotes/451.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt b/Archives/ReleaseNotes/452.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/452.txt rename to Archives/ReleaseNotes/452.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/453.txt b/Archives/ReleaseNotes/453.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/453.txt rename to Archives/ReleaseNotes/453.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/454.txt b/Archives/ReleaseNotes/454.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/454.txt rename to Archives/ReleaseNotes/454.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/455.txt b/Archives/ReleaseNotes/455.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/455.txt rename to Archives/ReleaseNotes/455.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/456.txt b/Archives/ReleaseNotes/456.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/456.txt rename to Archives/ReleaseNotes/456.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/457.txt b/Archives/ReleaseNotes/457.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/457.txt rename to Archives/ReleaseNotes/457.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/458.txt b/Archives/ReleaseNotes/458.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/458.txt rename to Archives/ReleaseNotes/458.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/459.txt b/Archives/ReleaseNotes/459.txt similarity index 100% rename from src/fdroid/fastlane/metadata/android/en/changelogs/459.txt rename to Archives/ReleaseNotes/459.txt diff --git a/app/build.gradle b/app/build.gradle index afcaf745..1a208594 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 21 targetSdk 33 - versionCode 477 - versionName "3.17.0" + versionCode 478 + versionName "3.18.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" @@ -68,13 +68,17 @@ android { 'src/main/res/layouts/mastodon', 'src/main/res/layouts/peertube', 'src/main/res/layouts', - 'src/main/layout', + 'src/main/res/drawables/mastodon', 'src/main/res/drawables/peertube', 'src/main/res/drawables', + 'src/main/res/menus/mastodon', 'src/main/res/menus/peertube', 'src/main/res/menus', + + 'src/main/res/values', + 'src/main/res' ] } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 699f5e66..399f8770 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -196,6 +196,9 @@ + diff --git a/app/src/main/assets/languages/iso_639_1.json b/app/src/main/assets/languages/iso_639_1.json index 00199b74..30bf870f 100644 --- a/app/src/main/assets/languages/iso_639_1.json +++ b/app/src/main/assets/languages/iso_639_1.json @@ -381,7 +381,7 @@ }, { "code": "lo", - "language": "ພາສາ" + "language": "ລາວ" }, { "code": "lt", @@ -726,5 +726,109 @@ { "code": "zu", "language": "isiZulu" + }, + { + "code": "ast", + "language": "Asturianu" + }, + { + "code": "ckb", + "language": "سۆرانی" + }, + { + "code": "cnr", + "language": "crnogorski" + }, + { + "code": "jbo", + "language": "la .lojban." + }, + { + "code": "kab", + "language": "Taqbaylit" + }, + { + "code": "kmr", + "language": "Kurmancî" + }, + { + "code": "ldn", + "language": "Láadan" + }, + { + "code": "lfn", + "language": "lingua franca nova" + }, + { + "code": "sco", + "language": "Scots" + }, + { + "code": "sma", + "language": "Åarjelsaemien Gïele" + }, + { + "code": "smj", + "language": "Julevsámegiella" + }, + { + "code": "szl", + "language": "ślůnsko godka" + }, + { + "code": "tai", + "language": "ภาษาไท or ภาษาไต" + }, + { + "code": "tok", + "language": "toki pona" + }, + { + "code": "zba", + "language": "باليبلن" + }, + { + "code": "zgh", + "language": "ⵜⴰⵎⴰⵣⵉⵖⵜ" + }, + { + "code": "en-GB", + "language": "English (British)" + }, + { + "code": "es-AR", + "language": "Español (Argentina)" + }, + { + "code": "es-MX", + "language": "Español (México)" + }, + { + "code": "fr-QC", + "language": "Français (Canadien)" + }, + { + "code": "pt-BR", + "language": "Português (Brasil)" + }, + { + "code": "pt-PT", + "language": "Português (Portugal)" + }, + { + "code": "sr-Latn", + "language": "Srpski (latinica)" + }, + { + "code": "zh-CN", + "language": "简体中文" + }, + { + "code": "zh-HK", + "language": "繁體中文(香港)" + }, + { + "code": "zh-TW", + "language": "繁體中文(臺灣)" } ] \ No newline at end of file diff --git a/app/src/main/assets/release_notes/notes.json b/app/src/main/assets/release_notes/notes.json index bd484641..6cb378a8 100644 --- a/app/src/main/assets/release_notes/notes.json +++ b/app/src/main/assets/release_notes/notes.json @@ -1,4 +1,9 @@ [ + { + "version": "3.18.0", + "code": "478", + "note": "Added:\n- Support camel case tags (automatically recorded when composing)\n- Manage tags when composing (top right menu)\n- Custom tabs (default: enabled)\n\nChanged:\n- Media heights now use the screen size\n- Remove horizontal scroll for media\n- Reduce size of emoji when text size is increased\n- Update available languages in picker\n\nFixed:\n- Forwarded tags are added back after being deleted\n- TalkBack issues\n- Some crashes" + }, { "version": "3.17.0", "code": "477", @@ -88,305 +93,5 @@ "version": "3.13.6", "code": "460", "note": "Fixed:\n- Cross-compose: Wrong instance emojis\n- Custom emojis not displayed in notifications\n- Fav/Boost markers with shared messages\n- Empty notifications\n- Fix cw removed when replying\n- Fix expand media with fit preview images when sensitive\n- Fix an issue with fetch more displayed too often (cache clear will help or wait new messages)" - }, - { - "version": "3.13.5", - "code": "459", - "note": "Added:\n- Glitch: Allow to post messages locally (Can be turned off in Settings)\n\nFixed:\n- Crashes" - }, - { - "version": "3.13.4", - "code": "458", - "note": "Added:\n- Add Bubble timeline support in extra-features with filters\n- Allow to display public profiles by default to get all messages (Settings > Interface)\n\nChanged:\n- Full rework on links in messages (also mentions and tags)\n\nFixed:\n- Spoiler text when editing\n- Fix watermarks" - }, - { - "version": "3.13.3", - "code": "457", - "note": "Added:\n- Allow to enable extra features in Settings\n- Customizable settings for extra features\n- Support quotes, reactions with messages\n- Support text format (html, markdown, etc.) when composing\n\nFixed:\n- CW not working with media\n- Media not displayed for older instances\n- Some crashes\n" - }, - { - "version": "3.13.2", - "code": "456", - "note": "Changed:\n- Hidden media smaller with preview images\n\nFixed:\n- Issue with Media for Android 11+\n- Crash when not setting a translation key\n- Fix DeepL for API pro\n- Crash when visiting a profile with a lot of media\n- Home muted accounts not working without filters\n- Animated custom emoji not displayed" - }, - { - "version": "3.13.1", - "code": "455", - "note": "Added:\n- DeepL translation support free/pro keys\n\nChanged:\n- Hide buttons for media when editing\n\nFixed:\n- GIF loaded as static images\n- Suggested accounts cannot be followed" - }, - { - "version": "3.13.0", - "code": "454", - "note": "Added:\n- Post random quotes\n- Group reblogs in home timeline\n- Rename Nitter timelines\n- Android 13 support\n- Pagination with search / trending\n- Allow to remove left margin in messages (default: disabled)\n\nChanged:\n- Display translate button only when language is different\n- Respect blank spaces between words in messages\n- Focus button more accessible when editing media\n- Visual feedback for block on account list\n- Visual changes with compose / top bar\n- Use custom Nitter timeline name in manage timelines\n\nFixed:\n- Behavior with cw toggle\n- Truncated gimini links\n- Nav buttons not visible with media (Light theme)\n- Status bar with Android 5\n- Fix links not clickable\n- Fix deep links\n- Fix remote threads not fetched for some instances\n- Adding description to shared media\n- Open with another accounts\n- Chars size not respected for Android 5-6\n- Wrong instance fetched for instances.social\n- Bouncing Timeline on refresh\n- Links to mentions, tags, urls, not visible.\n- Custom channel sounds not applied\n- users with short username are not linked\n- Fix crashes" - }, - { - "version": "3.12.3", - "code": "453", - "note": "Added:\n- Pagination with search / trending\n\nFixed:\n- Long press on Nitter tabs\n- Open with another accounts\n- Chars size not respected for Android 5-6\n- Wrong instance fetched for instances.social" - }, - { - "version": "3.12.2", - "code": "452", - "note": "Added:\n- Rename Nitter timelines\n- Android 13 support\n\nChanged:\n- Visual feedback for block on account list\n- Visual changes with compose / top bar\n\nFixed:\n- Nav buttons not visible with media (Light theme)\n- Status bar with Android 5\n- Fix links not clickable\n- Fix deep links\n- Fix remote threads not fetched for some instances\n- Adding description to shared media\n- Fix crashes" - }, - { - "version": "3.12.1", - "code": "451", - "note": "Added:\n- Post random quotes\n- Group reblogs in home timeline\n\nChanged:\n- Display translate button only when language is different\n- Respect blank spaces between words in messages\n- Focus button more accessible when editing media\n\nFixed:\n- Behavior with cw toggle\n- Truncated gimini links" - }, - { - "version": "3.12.0", - "code": "450", - "note": "Added:\n- Full data import/export feature\n- Android 13 themed icon support\n\nFixed:\n- Fix a regression with filters\n- Fix dark solarized theme\n- Fix hide link previews for CW\n- Fix status bar color for all themes\n- Fix language in compose \"...\"\n- Fix add all home muted accounts from lists\n- Fix top notification badges" - }, - { - "version": "3.11.3", - "code": "449", - "note": "Added:\n- Add more targeted languages in picker for translations\n- Add account name in push notifications\n\nFixed:\n- Fix a crash when changing language\n- Fix counter colors\n- Fix default link color\n- Fix a crash when clicking on mentions" - }, - { - "version": "3.11.2", - "code": "448", - "note": "Added:\n- Mute/Unmute accounts in the Home timeline from their messages or their profiles\n- Add all users from a list to \"Muted home\" in one click\n- Display/Manage users that are muted for home\n\nFixed:\n- Timeline crashes" - }, - { - "version": "3.11.0", - "code": "446", - "note": "Added:\n- Display all messages in threads from remote instances (when possible)\n- Allow to unmute/unfollow/unpin a tag from tag timelines\n- Display most used accounts in header menu for an easy switch\n- Automatically add the tag when composing from a tag timeline\n- Add a translate button at the bottom of messages (default: disabled)\n- Add account role in profiles\n- Translate morse\n\nChanged:\n- Disable animations after a refresh\n\nFixed:\n- Contact not working when composing\n- Status bar for black theme\n- Message duplicated in conversations when edited\n- Color issue on Android 5\n- Several crashes" - }, - { - "version": "3.10.2", - "code": "445", - "note": "Added:\n- Allow to unmute/unfollow/unpin a tag from tag timelines\n- Automatically add the tag when composing from a tag timeline\n- Add a translate button at the bottom of messages (default: disabled)\n- Add account role in profiles\n\nFixed:\n- Contact not working when composing\n- Status bar for black theme\n- Message duplicated in conversations when edited\n- Color issue on Android 5" - }, - { - "version": "3.10.1", - "code": "444", - "note": "Added:\n- Display all messages in threads from remote instances (when possible)\n* Only public messages for instances using the Mastodon API\n* A dedicated button is displayed at the top right when conditions are filled." - }, - { - "version": "3.10.0", - "code": "443", - "note": "Added:\n- Dracula theme\n- Customize message colors\n- Enable/Disable Card presentation\n\nChanged:\n- Colors for some themes\n- Space between buttons\n\nFixed:\n- Animated profile pictures not displayed\n- Mentions broken in profile bio and fields\n- Jumps with fit preview images when scrolling up\n- Fetch more button broken with cache\n- Tag patterns in URL break the link\n- Typo in followed tags" - }, - { - "version": "3.9.7", - "code": "442", - "note": "Added:\n- Dracula theme\n\nChanged:\n- Colors for Light/Dark/Black themes\n\nFixed:\n- Animated profile pictures not displayed\n- Mentions broken in profile bio and fields\n- Tag patterns in URL break the link\n- Typo in followed tags" - }, - { - "version": "3.9.6", - "code": "441", - "note": "Fixed:\n- Jumps with fit preview images when scrolling up\n- Fetch more button broken with cache" - }, - { - "version": "3.9.5", - "code": "440", - "note": "Fixed:\n- Custom emoji are not always displayed\n- Jumps in timeline when using \"fit preview images\"\n- Dark theme: timeline buttons without toggle" - }, - { - "version": "3.9.4", - "code": "439", - "note": "Changed:\n- Remove card presentation\n- Link color for black theme\n\nFixed:\n- Crash when changing the theme" - }, - { - "version": "3.9.3", - "code": "438", - "note": "Added:\n- New design with 5 themes\n\nChanged:\n- Remove built-in browser support\n- Fit preview image displays images vertically\n- Add counters next to images\n\nFixed:\n- Jumps in timelines\n- Replies to wrong messages with followed instances\n- Bug with delete&redraft with a media\n- List cannot be hidden\n- Some crashes" - }, - { - "version": "3.9.1", - "code": "436", - "note": "Changed:\n- Remove built-in browser support\n- More spaces between action buttons in messages\n\nFixed:\n- Text size issue\n- Text overlap\n- Wrong background for solarized black\n- Mix between light and dark theme\n- Save button hidden" - }, - { - "version": "3.9.0", - "code": "435", - "note": "Added:\n- Migrate to Material Design 3\n- 5 Themes (Light, Dark, Solarized Light/Dark, Black)\n- Automatically switch between Light/Dark\n- Light and Dark theme can be defined for time-based switch\n- Android 12+: Dynamic color\n\nFixed:\n- Jumps in timelines\n" - }, - { - "version": "3.8.1", - "code": "434", - "note": "Added:\n- Mute tags with long press in timelines\n\nChanged:\n- Muted account messages are now removed from cache\n\nFixed:\n- Open with another account\n- Fix jumps in profiles\n- Media not displayed in album -> force indexation\n- Built-in browser does not give admin scope\n- Some crashes" - }, - { - "version": "3.8.0", - "code": "433", - "note": "Added:\n- List of blocked domains (allow to unblock)\n- Support gemini links\n- Suggested followers\n- Mod/Adm: Manage instance blocked domains\n- Open messages with another account\n- Allow to disable notifications for admins\n- Sort lists\n\nChanged:\n- Allow search term to be edited\n\nFixed:\n- Drafts deleted with no warning\n- Remove lists from \"Manage timelines\"\n- App crashes when proxy is set\n- Filter not synced after being edited\n- Some crashes / improvements" - }, - { - "version": "3.7.5", - "code": "432", - "note": "Added:\n- List of blocked domains (allow to unblock)\n- Support gemini links\n- Suggested followers\n\nChanged:\n- Allow search term to be edited\n\nFixed:\n- Drafts deleted with no warning\n- App crashes when proxy is set\n- Filter not synced after being edited\n- Some crashes" - }, - { - "version": "3.7.4", - "code": "431", - "note": "Added:\n- Full support to new filters for Mastodon 4\n- Visit profiles without being authenticated / Allow to display all their messages\n\nChanged:\n- Compose view takes the whole width even in threads\n- Accounts can be timed-mute from their profile\n\nFixed:\n- Draft stored when replying \"no\" or dialog prompted without changes\n- Empty pages when starting the app\n- Saving and sharing media fails on some devices\n- Add support for admin notifications\n- Copying content of a message" - }, - { - "version": "3.7.3", - "code": "430", - "note": "Added:\n- Visit profiles without being authenticated / Allow to display all their messages\n\nFixed:\n- Saving media fails on some devices" - }, - { - "version": "3.7.2", - "code": "429", - "note": "Added:\n- Full support to new filters for Mastodon 4" - }, - { - "version": "3.7.1", - "code": "428", - "note": "Added:\n- Support to open links containing /@display_name/ in their path (works on older devices)\n- Display reply count when counters are enabled\n- Add support for filtering profile messages\n\nChanged:\n- Compose view takes the whole width even in threads\n- Reset push notification marker when clearing cache\n\nFixed:\n- Draft stored when replying \"no\" or dialog prompted without changes\n- Filters not working with tags\n- Add a specific error message for followed tags\n- Empty pages when starting the app" - }, - { - "version": "3.7.0", - "code": "427", - "note": "Added:\n- Follow tags (dedicated entry in menu)\n- Reduce the list of languages when composing (Settings > Compose)\n- Language indicator when composing\n- Replies are automatically set to first message language\n- Two new Light themes\n- More moderation features\n- List name can be edited\n\nFixed:\n- Filter not working\n- Crash with trends\n- Issue with themes\n- Some content lost when sending messages (mentions)\n- Fix freezes in timelines\n- Some other fixes" - }, - { - "version": "3.6.5", - "code": "426", - "note": "- Two new Light themes\n- More moderation features\n\nFixed:\n- Filter not working\n- Crash with trends\n- Some content lost when sending messages (mentions)\n- Some other fixes" - }, - { - "version": "3.6.4", - "code": "425", - "note": "Changed:\n- Tag search ordered by popularity\n\nFixed:\n- Unable to get client ID on some devices\n- Issue with messages/notifications not correctly displayed\n- Notifications not received\n- Friendica: issues with mentions and tags (open browser)\n- Improve sharing behaviour" - }, - { - "version": "3.6.3", - "code": "424", - "note": "Fixed:\n- Issue with messages/notifications not correctly displayed\n- Friendica: issues with mentions and tags (open browser)\n- Improve sharing behaviour\n" - }, - { - "version": "3.6.2", - "code": "423", - "note": "Fixed:\n- Order of notifications\n- URL when sharing boosted message\n- Blank pages when restarting\n- Fix some crashes" - }, - { - "version": "3.6.1", - "code": "422", - "note": "Added:\n- Display client in detailed messages\n- Visual support for quotes starting with \">\"\n- Increase indentations for threads (zero to 20, default 5)\n- Visibility for public replies set to unlisted (can be disabled)\n\nChanged:\n- Reduce title size when text size is increased\n\nFixed:\n- Filters are not applied\n- Blocking an account doesn't remove messages in cache\n- Fix some crashes" - }, - { - "version": "3.6.0", - "code": "421", - "note": "Added:\n- Edit messages (if your instance supports that feature)\n- Pin/Unpin messages\n- Set the default language for translations\n- Change app icon (Settings > Interface)\n- Allow to disable \"remember position\" in timelines\n- Allow to disable notification aggregation in settings\n- Icon on media previews if a description is available\n\nChanged:\n- Allow to disable/enable media for notifications\n\nFixed:\n- Post loses \"spoiler message\" when adding a media\n- Camera not working on Android 11\n- Notification aggregation\n- Vibrations when fetching new notifications\n- Fix an issue with media timelines\n- Fix some theme issues\n- Fix an issue with built-in browser & openId\n- Bad behaviours with Art Timelines\n- Some crashes" - }, - { - "version": "3.5.3", - "code": "420", - "note": "- Edit messages (if your instance support that feature)\n- Some fixes" - }, - { - "version": "3.5.2", - "code": "419", - "note": "Added:\n- Pin/Unpin messages\n- Set the default language for translations\n\nChanged:\n- Allow to disable/enable media for notifications\n\nFixed:\n- Wrong images in notification timeline\n- Double icon bug\n- Fix some crashes" - }, - { - "version": "3.5.1", - "code": "418", - "note": "Added:\n- Change app icon (Settings > Interface)\n- Allow to disable \"remember position\" in timelines\n- Allow to disable notification aggregation in settings\n\nChanged:\n- Allow to disable/enable media for notifications\n\nFixed:\n- Post loses \"spoiler message\" when adding a media\n- Camera not working on Android 11\n- Notification aggregation\n- Vibrations when fetching new notifications\n- Fix an issue with media timelines\n- Some crashes" - }, - { - "version": "3.5.0", - "code": "417", - "note": "Changed:\n- Swipe between timelines\n- Improve cache\n- Button sizes can be changed in settings\n- French translation\n\nFixed:\n- Pleroma: Emoji reactions\n- Sharing (several fixes)\n- Theme issues\n- Rendering issue for links\n- Notifications not removed from cache\n- Issue with watermarks\n- Pagination with bookmarks/favourites\n- Some crashes" - }, - { - "version": "3.4.2", - "code": "415", - "note": "Fixed:\n- Attach media to a reply" - }, - { - "version": "3.4.1", - "code": "414", - "note": "Added:\n- Disable counters in settings\nFixed:\n- Duplicated messages from cache\n- Notifications in double\n- Drafts not automatically removed\n- Messages not removed from cache after deletion" - }, - { - "version": "3.4.0", - "code": "413", - "note": "Added:\n- New cache mechanism (can be disabled in settings)\n- Set thumbnails load behavior Always/Wifi only /ask\n- Add counters for new messages in timelines\nFixed:\n- Contextual menu not working in threads\n- Tag search issue with Friendica\n- Notifications click open the wrong tab\n- Encoding issue with media descriptions\n- Some other fixes." - }, - { - "version": "3.3.2", - "code": "409", - "note": "- Fix an issue with cache and home timeline\n- Nitter timelines use the custom instance from settings\n- Fix Nitter issues (only RT)\n- No longer accepts invalid certificate for onion URLs(Google)\n- Fix some crashes" - }, - { - "version": "3.3.1", - "code": "408", - "note": "- Improve speed for Nitter instances\n- Allow to edit Nitter accounts with a long press on tabs\n- Fix pagination issue with pinned timelines\n- Fix some crashes\n- Fix visibility when displaying counters" - }, - { - "version": "3.3.0", - "code": "407", - "note": "Added:\n- Settings to set all timelines at the top (default disabled)\n- Settings to display timelines in a list (default disabled)\n- Display counters for fav/reblog in timelines (default disabled)\n\nFixed:\n- Visibility issue when replying\n- Some theme issues when composing\n- Some crashes" - }, - { - "version": "3.2.0", - "code": "405", - "note": "Added:\n- Export Settings\n- Propagate manual reordering of lists in timeline to \"Lists\" submenu\n- Allow to change the push distributor in settings\n\nChanged:\n- Improve fit preview images\n- Improve notifications\n- Profile media displayed in a grid\n\nFixed:\n- Some Peertube videos not working\n- Respect the default visibility account when replying\n- Discriminate gif from images\n- App crashes when opening external instance timeline\n- Remove button in thread composer crashes the app\n- Back button opens a lot of old activities before closing the app\n- Problems with sharing\n- Reorder Lists with UI issue on change the visibility\n- Link is not shown correctly in posts from Friendica" - }, - { - "version": "3.1.0", - "code": "402", - "note": "Added:\n- New theme: Dark Elephant from S1m\n- Error messages from server side when posting fails\n\nChanged:\n- Fetch more buttons more visible\n\nFixed:\n- Issue when fetching missing messages\n- Some issues with themes\n- Too much lost space with reaction (Pleroma)\n- Delete and redraft crashes\n- Crash when playing a video\n- Other crash fixes" - }, - { - "version": "3.0.11", - "code": "401", - "note": "Added:\n- New theme: Dark Elephant from S1m\n- Error messages from server side when posting fails\n- Allow to set the fetch time for delayed notifications\n\nChanged:\n- Fetch more buttons more visible\n\nFixed:\n- Issue when fetching missing messages\n- Some issues with themes\n- Too much lost space with reaction (Pleroma)\n- Delete and redraft crashes\n- Crash when playing a video\n- Other crash fixes" - }, - { - "version": "3.0.10", - "code": "400", - "note": "Added:\n- Allow to define the max chars count when not detected (In about the instance)\n- Add emoji one picker when composing (must be enabled in settings)\n- Add release notes with the ability to translate them\n\nFixed:\n- Friendica custom emojis not displayed\n- Long press to store media\n- Some bug fixes" - }, - { - "version": "3.0.9", - "code": "399", - "note": "Added:\n- Set compose language (from compose menu -> three vertical dots)\n- Add reactions support for Pleroma\n- Add privacy indicator at the top right\n\nChanged\n- Improve the scrolling behaviour\n- Scroll to top (tab reselection) will fetch new messages and then scroll to top\n\nFixed:\n- Empty tag timelines\n- Remove focus point for fit media preview\n- Fix cannot share with one account\n- Fix black theme\n- Theme cannot be selected\n- Fix some button colors" - }, - { - "version": "3.0.8", - "code": "398", - "note": "- Keep improving the scroll behaviour\n- Scroll to top (tab reselection) will fetch new messages and then scroll to top\n- Remove focus point for fit media preview\n- Fix cannot share with one account\n- Fix black theme\n- Fix some button colors" - }, - { - "version": "3.0.7", - "code": "397", - "note": "- Fix some bugs reported." - }, - { - "version": "3.0.6", - "code": "396", - "note": "Added:\n- Allow to set a focus point on previews (media editor)\n- Respect the focus point with previews\n- Pagination with the fetch more button support reading up or down\n- Add trends\n\nFixed:\n- Only last push notification is displayed (not grouped)\n- Bad behavior with the right/left scroll\n- Fix long profiles not fully displayed\n- Issues with some polls\n- Some crashes\n- Some bad behaviors" - }, - { - "version": "3.0.5", - "code": "395", - "note": "- Fix some bugs\n- Allow to share with the app" - }, - { - "version": "3.0.4", - "code": "394", - "note": "- Fix crashes for some Pleroma instances" - }, - { - "version": "3.0.2", - "code": "393", - "note": "- Some bug fixes\n- Improve pinned timelines" - }, - { - "version": "3.0.1", - "code": "391", - "note": "Some quick fixes" - }, - { - "version": "3.0.0", - "code": "390", - "note": "New version of Fedilab with new feature.\n- You can now compose threads\n- See the whole thread when replying\n- Cache support\n- New design" } ] \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java index df53fc82..daa98015 100644 --- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java @@ -478,7 +478,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt if (!activity.isDestroyed() && !activity.isFinishing() && url != null) { if (url.trim().isEmpty()) { BitmapDrawable avatar = new AvatarGenerator.AvatarBuilder(activity) - .setLabel(account.peertube_account.getAcct()) + .setLabel(acct) .setAvatarSize(120) .setTextSize(30) .toSquare() diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java index cc57e264..40f016d3 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java @@ -399,6 +399,9 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana } else { Toasty.info(ComposeActivity.this, getString(R.string.toot_error_no_content), Toasty.LENGTH_SHORT).show(); } + } else if (item.getItemId() == R.id.action_tags) { + TagCacheActivity tagCacheActivity = new TagCacheActivity(); + tagCacheActivity.show(getSupportFragmentManager(), null); } return true; } diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/DirectMessageActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/DirectMessageActivity.java new file mode 100644 index 00000000..92bad7d6 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/DirectMessageActivity.java @@ -0,0 +1,155 @@ +package app.fedilab.android.mastodon.activities; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + + +import static app.fedilab.android.BaseMainActivity.currentAccount; +import static app.fedilab.android.mastodon.activities.ComposeActivity.PICK_MEDIA; + +import android.content.ClipData; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.TypedValue; +import android.view.MenuItem; + +import androidx.appcompat.app.ActionBar; +import androidx.lifecycle.ViewModelProvider; +import androidx.preference.PreferenceManager; + +import java.util.ArrayList; +import java.util.List; + +import app.fedilab.android.BaseMainActivity; +import app.fedilab.android.R; +import app.fedilab.android.databinding.ActivityDirectMessageBinding; +import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.app.StatusCache; +import app.fedilab.android.mastodon.exception.DBException; +import app.fedilab.android.mastodon.helper.Helper; +import app.fedilab.android.mastodon.helper.MastodonHelper; +import app.fedilab.android.mastodon.ui.drawer.StatusAdapter; +import app.fedilab.android.mastodon.ui.fragment.timeline.FragmentMastodonDirectMessage; +import app.fedilab.android.mastodon.viewmodel.mastodon.StatusesVM; + +public class DirectMessageActivity extends BaseActivity implements FragmentMastodonDirectMessage.FirstMessage { + + public static boolean expand; + public static boolean displayCW; + + FragmentMastodonDirectMessage currentFragment; + private Status firstMessage; + private String remote_instance; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ActivityDirectMessageBinding binding = ActivityDirectMessageBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + ActionBar actionBar = getSupportActionBar(); + //Remove title + if (actionBar != null) { + actionBar.setDisplayShowTitleEnabled(false); + } + binding.title.setText(R.string.context_conversation); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(this); + float scale = sharedpreferences.getFloat(getString(R.string.SET_FONT_SCALE), 1.1f); + binding.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18 * 1.1f / scale); + + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + Bundle b = getIntent().getExtras(); + displayCW = sharedpreferences.getBoolean(getString(R.string.SET_EXPAND_CW), false); + Status focusedStatus = null; // or other values + if (b != null) { + focusedStatus = (Status) b.getSerializable(Helper.ARG_STATUS); + remote_instance = b.getString(Helper.ARG_REMOTE_INSTANCE, null); + } + if (focusedStatus == null || currentAccount == null || currentAccount.mastodon_account == null) { + finish(); + return; + } + MastodonHelper.loadPPMastodon(binding.profilePicture, currentAccount.mastodon_account); + Bundle bundle = new Bundle(); + bundle.putSerializable(Helper.ARG_STATUS, focusedStatus); + bundle.putString(Helper.ARG_REMOTE_INSTANCE, remote_instance); + FragmentMastodonDirectMessage FragmentMastodonDirectMessage = new FragmentMastodonDirectMessage(); + FragmentMastodonDirectMessage.firstMessage = this; + currentFragment = (FragmentMastodonDirectMessage) Helper.addFragment(getSupportFragmentManager(), R.id.nav_host_fragment_content_main, FragmentMastodonDirectMessage, bundle, null, null); + StatusesVM timelinesVM = new ViewModelProvider(DirectMessageActivity.this).get(StatusesVM.class); + timelinesVM.getStatus(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, focusedStatus.id).observe(DirectMessageActivity.this, status -> { + if (status != null) { + StatusCache statusCache = new StatusCache(); + statusCache.instance = BaseMainActivity.currentInstance; + statusCache.user_id = BaseMainActivity.currentUserID; + statusCache.status = status; + statusCache.status_id = status.id; + //Update cache + new Thread(() -> { + try { + new StatusCache(getApplication()).updateIfExists(statusCache); + Handler mainHandler = new Handler(Looper.getMainLooper()); + //Update UI + Runnable myRunnable = () -> StatusAdapter.sendAction(DirectMessageActivity.this, Helper.ARG_STATUS_ACTION, status, null); + mainHandler.post(myRunnable); + } catch (DBException e) { + e.printStackTrace(); + } + }).start(); + } + }); + } + + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + List uris = new ArrayList<>(); + if (requestCode >= PICK_MEDIA && resultCode == RESULT_OK) { + ClipData clipData = data.getClipData(); + if (clipData != null) { + for (int i = 0; i < clipData.getItemCount(); i++) { + ClipData.Item item = clipData.getItemAt(i); + uris.add(item.getUri()); + } + } else { + uris.add(data.getData()); + } + currentFragment.addAttachment(uris); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return true; + } + + @Override + public void get(Status status) { + firstMessage = status; + invalidateOptionsMenu(); + } +} \ No newline at end of file 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 db986092..e5fe7591 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 @@ -126,8 +126,10 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload getSupportActionBar().setDisplayShowHomeEnabled(true); } - if (attachments == null || attachments.size() == 0) + if (attachments == null || attachments.size() == 0) { finish(); + return; + } setTitle(""); diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/TagCacheActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/TagCacheActivity.java new file mode 100644 index 00000000..9f48e095 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/TagCacheActivity.java @@ -0,0 +1,98 @@ +package app.fedilab.android.mastodon.activities; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import android.app.Dialog; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.util.ArrayList; +import java.util.List; + +import app.fedilab.android.R; +import app.fedilab.android.databinding.ActivityCamelTagBinding; +import app.fedilab.android.mastodon.client.entities.app.CamelTag; +import app.fedilab.android.mastodon.exception.DBException; +import app.fedilab.android.mastodon.ui.drawer.TagsEditAdapter; +import es.dmoral.toasty.Toasty; + +public class TagCacheActivity extends DialogFragment { + + private List tags; + private TagsEditAdapter tagsEditAdapter; + + private ActivityCamelTagBinding binding; + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + binding = ActivityCamelTagBinding.inflate(getLayoutInflater()); + + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext()); + materialAlertDialogBuilder.setView(binding.getRoot()); + + Dialog dialog = materialAlertDialogBuilder.create(); + tags = new ArrayList<>(); + + binding.saveTag.setOnClickListener(v -> { + if (binding.tagAdd.getText() != null && (binding.tagAdd.getText().toString().trim().replaceAll("#", "").length() > 0)) { + String tagToInsert = binding.tagAdd.getText().toString().trim().replaceAll("#", ""); + try { + boolean isPresent = new CamelTag(requireActivity()).tagExists(tagToInsert); + if (isPresent) + Toasty.warning(requireActivity(), getString(R.string.tags_already_stored), Toast.LENGTH_LONG).show(); + else { + new CamelTag(requireActivity()).insert(tagToInsert); + int position = tags.size(); + tags.add(tagToInsert); + Toasty.success(requireActivity(), getString(R.string.tags_stored), Toast.LENGTH_LONG).show(); + binding.tagAdd.setText(""); + tagsEditAdapter.notifyItemInserted(position); + } + } catch (DBException e) { + throw new RuntimeException(e); + } + + } + }); + dialog.setTitle(R.string.manage_tags); + + new Thread(() -> { + List tagsTemp = new CamelTag(requireActivity()).getAll(); + requireActivity().runOnUiThread(() -> { + if (tagsTemp != null) + tags = tagsTemp; + if (tags != null) { + tagsEditAdapter = new TagsEditAdapter(tags); + binding.tagList.setAdapter(tagsEditAdapter); + LinearLayoutManager mLayoutManager = new LinearLayoutManager(requireActivity()); + binding.tagList.setLayoutManager(mLayoutManager); + } + }); + }).start(); + + binding.close.setOnClickListener(v -> requireDialog().dismiss()); + return dialog; + } + + +} diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java index cf89f809..2d373a74 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java @@ -118,6 +118,8 @@ public class Status implements Serializable, Cloneable { public transient boolean isFetchMore = false; public transient PositionFetchMore positionFetchMore = PositionFetchMore.BOTTOM; public boolean isChecked = false; + //When forwarding tags + public boolean tagAdded = false; public String translationContent; public boolean translationShown; public boolean mathsShown = false; diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Tag.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Tag.java index 4bc053f9..a1b9b1b3 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Tag.java +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Tag.java @@ -14,6 +14,8 @@ package app.fedilab.android.mastodon.client.entities.api; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ +import androidx.annotation.Nullable; + import com.google.gson.annotations.SerializedName; import java.io.Serializable; @@ -42,4 +44,13 @@ public class Tag implements Serializable { } return weight; } + + @Override + public boolean equals(@Nullable Object obj) { + boolean same = false; + if (obj instanceof Tag) { + same = this.name.equals(((Tag) obj).name); + } + return same; + } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/client/entities/app/CamelTag.java b/app/src/main/java/app/fedilab/android/mastodon/client/entities/app/CamelTag.java new file mode 100644 index 00000000..e535cfc0 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/client/entities/app/CamelTag.java @@ -0,0 +1,130 @@ +package app.fedilab.android.mastodon.client.entities.app; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; +import java.util.List; + +import app.fedilab.android.mastodon.exception.DBException; +import app.fedilab.android.sqlite.Sqlite; + +public class CamelTag { + + private final SQLiteDatabase db; + @SerializedName("name") + public String name; + + public CamelTag(Context context) { + this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + } + + /** + * Insert or update a status + * + * @param name {@link String} + * @return long - -1 if exists or id + * @throws DBException exception with database + */ + public synchronized long insert(String name) throws DBException { + if (db == null) { + throw new DBException("db is null. Wrong initialization."); + } + boolean exists = tagExists(name); + if (!exists) { + ContentValues values = new ContentValues(); + values.put(Sqlite.COL_TAG, name); + try { + return db.insertOrThrow(Sqlite.TABLE_CACHE_TAGS, null, values); + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + return -1; + } + + /** + * Returns tags List of {@String} containing "search" + * + * @param search - String the word to search + * @return List + */ + public List getBy(String search) { + Cursor c = db.query(Sqlite.TABLE_CACHE_TAGS, null, Sqlite.COL_TAG + " LIKE \"%" + search + "%\"", null, null, null, null, null); + return cursorToTag(c); + } + + public boolean tagExists(String name) throws DBException { + Cursor c = db.query(Sqlite.TABLE_CACHE_TAGS, null, Sqlite.COL_TAG + " = \"" + name + "\"", null, null, null, null, null); + boolean isPresent = (c != null && c.getCount() > 0); + assert c != null; + c.close(); + return isPresent; + } + + public void removeAll() { + db.delete(Sqlite.TABLE_CACHE_TAGS, null, null); + } + + public void removeTag(String tag) { + db.delete(Sqlite.TABLE_CACHE_TAGS, Sqlite.COL_TAG + " = ?", new String[]{tag}); + } + + public void update(String oldTag, String newTag) { + ContentValues values = new ContentValues(); + values.put(Sqlite.COL_TAG, newTag); + try { + db.update(Sqlite.TABLE_CACHE_TAGS, values, Sqlite.COL_TAG + " = ?", new String[]{oldTag}); + } catch (Exception ignored) { + } + } + + /** + * Returns all tags in db + * + * @return string tags List + */ + public List getAll() { + try { + Cursor c = db.query(Sqlite.TABLE_CACHE_TAGS, null, null, null, null, null, Sqlite.COL_TAG + " ASC", null); + return cursorToTag(c); + } catch (Exception e) { + return null; + } + } + + private List cursorToTag(Cursor c) { + //No element found + if (c.getCount() == 0) { + c.close(); + return null; + } + List tags = new ArrayList<>(); + while (c.moveToNext()) { + tags.add(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_TAG))); + } + //Close the cursor + c.close(); + //Tag list is returned + return tags; + } +} diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java b/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java index b1bd8244..9e99a567 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/CustomEmoji.java @@ -30,7 +30,7 @@ import app.fedilab.android.mastodon.client.entities.api.Status; public class CustomEmoji extends ReplacementSpan { - private final float scale; + private float scale; private final WeakReference viewWeakReference; private Drawable imageDrawable; private boolean callbackCalled; @@ -40,6 +40,9 @@ public class CustomEmoji extends ReplacementSpan { this.viewWeakReference = viewWeakReference; SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(mContext); scale = sharedpreferences.getFloat(mContext.getString(R.string.SET_FONT_SCALE), 1.1f); + if (scale > 1.3f) { + scale = 1.3f; + } callbackCalled = false; } diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/Helper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/Helper.java index 57336df2..f75461e9 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/Helper.java @@ -76,6 +76,8 @@ import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.browser.customtabs.CustomTabColorSchemeParams; +import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.app.ActivityOptionsCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; @@ -646,16 +648,29 @@ public class Helper { if (url == null) { return; } - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://") && !url.toLowerCase().startsWith("gemini://")) { - url = "http://" + url; - } - intent.setData(Uri.parse(url)); - try { - context.startActivity(intent); - } catch (Exception e) { - Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + boolean customTab = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOM_TABS), true); + if (customTab) { + CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); + int colorInt = ThemeHelper.getAttColor(context, R.attr.statusBar); + CustomTabColorSchemeParams defaultColors = new CustomTabColorSchemeParams.Builder() + .setToolbarColor(colorInt) + .build(); + builder.setDefaultColorSchemeParams(defaultColors); + CustomTabsIntent customTabsIntent = builder.build(); + customTabsIntent.launchUrl(context, Uri.parse(url)); + } else { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://") && !url.toLowerCase().startsWith("gemini://")) { + url = "http://" + url; + } + intent.setData(Uri.parse(url)); + try { + context.startActivity(intent); + } catch (Exception e) { + Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + } } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/TranslateHelper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/TranslateHelper.java index e347044e..3e7e0da8 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/helper/TranslateHelper.java +++ b/app/src/main/java/app/fedilab/android/mastodon/helper/TranslateHelper.java @@ -49,6 +49,8 @@ public class TranslateHelper { MyTransL.translatorEngine et; if (translator.compareToIgnoreCase("FEDILAB") == 0) { et = MyTransL.translatorEngine.LIBRETRANSLATE; + } else if (translator.compareToIgnoreCase("LINGVA") == 0) { + et = MyTransL.translatorEngine.LINGVA; } else { et = MyTransL.translatorEngine.DEEPL; } @@ -60,6 +62,12 @@ public class TranslateHelper { params.setSource_lang("auto"); if (translator.compareToIgnoreCase("FEDILAB") == 0) { myTransL.setLibretranslateDomain("translate.fedilab.app"); + } else if (translator.compareToIgnoreCase("LINGVA") == 0) { + String host = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_DOMAIN), context.getString(R.string.SET_TRANSLATOR_HOST_LINGVA)); + if (host == null || host.trim().isEmpty()) { + host = context.getString(R.string.SET_TRANSLATOR_HOST_LINGVA); + } + myTransL.setLingvaDomain(host); } else { String translatorVersion = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_VERSION), "PRO"); params.setPro(translatorVersion.equals("PRO")); diff --git a/app/src/main/java/app/fedilab/android/mastodon/jobs/ComposeWorker.java b/app/src/main/java/app/fedilab/android/mastodon/jobs/ComposeWorker.java index d010d1b4..6e663374 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/jobs/ComposeWorker.java +++ b/app/src/main/java/app/fedilab/android/mastodon/jobs/ComposeWorker.java @@ -47,6 +47,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; @@ -57,6 +58,7 @@ import app.fedilab.android.mastodon.client.entities.api.ScheduledStatus; import app.fedilab.android.mastodon.client.entities.api.Status; import app.fedilab.android.mastodon.client.entities.app.Account; import app.fedilab.android.mastodon.client.entities.app.BaseAccount; +import app.fedilab.android.mastodon.client.entities.app.CamelTag; import app.fedilab.android.mastodon.client.entities.app.PostState; import app.fedilab.android.mastodon.client.entities.app.StatusDraft; import app.fedilab.android.mastodon.exception.DBException; @@ -228,19 +230,38 @@ public class ComposeWorker extends Worker { LocalBroadcastManager.getInstance(context).sendBroadcast(intentBD); return; } - String language = sharedPreferences.getString(context.getString(R.string.SET_COMPOSE_LANGUAGE) + dataPost.userId + dataPost.instance, null); if (statuses.get(i).local_only) { statuses.get(i).text += " \uD83D\uDC41"; } + //Record tags + if (statuses.get(i).text != null && statuses.get(i).text.length() > 0) { + Matcher matcher = Helper.hashtagPattern.matcher(statuses.get(i).text); + while (matcher.find()) { + int matchStart = matcher.start(1); + int matchEnd = matcher.end(); + //Get cached tags + if (matchStart >= 0 && matchEnd < statuses.get(i).text.length()) { + String tag = statuses.get(i).text.substring(matchStart, matchEnd); + tag = tag.replace("#", ""); + if (tag.length() > 0) { + try { + new CamelTag(context).insert(tag); + } catch (DBException e) { + throw new RuntimeException(e); + } + } + } + } + } if (dataPost.scheduledDate == null) { if (dataPost.statusEditId == null) { statusCall = mastodonStatusesService.createStatus(null, dataPost.token, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, - poll_multiple, poll_hide_totals, statuses.get(i).quote_id == null ? in_reply_to_status : null, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), language, statuses.get(i).quote_id, statuses.get(i).content_type); + poll_multiple, poll_hide_totals, statuses.get(i).quote_id == null ? in_reply_to_status : null, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), statuses.get(i).language, statuses.get(i).quote_id, statuses.get(i).content_type); } else { //Status is edited statusCall = mastodonStatusesService.updateStatus(null, dataPost.token, dataPost.statusEditId, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, poll_multiple, poll_hide_totals, statuses.get(i).quote_id == null ? in_reply_to_status : null, statuses.get(i).sensitive, - statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), language, + statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), statuses.get(i).language, media_edit_id, media_edit_description, media_edit_focus); } try { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java index 6c1c2279..8ebadf0c 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ComposeAdapter.java @@ -119,6 +119,7 @@ import app.fedilab.android.mastodon.client.entities.api.Poll; import app.fedilab.android.mastodon.client.entities.api.Status; import app.fedilab.android.mastodon.client.entities.api.Tag; import app.fedilab.android.mastodon.client.entities.app.BaseAccount; +import app.fedilab.android.mastodon.client.entities.app.CamelTag; import app.fedilab.android.mastodon.client.entities.app.Languages; import app.fedilab.android.mastodon.client.entities.app.Quotes; import app.fedilab.android.mastodon.client.entities.app.StatusDraft; @@ -136,7 +137,7 @@ import es.dmoral.toasty.Toasty; public class ComposeAdapter extends RecyclerView.Adapter { private static final int searchDeep = 15; - private static final int TYPE_COMPOSE = 1; + public static final int TYPE_COMPOSE = 1; public static boolean autocomplete = false; public static String[] ALPHA = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "!", ",", "?", @@ -818,13 +819,24 @@ public class ComposeAdapter extends RecyclerView.Adapter camelTags = new CamelTag(context).getBy(searchGroup); searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, null, "hashtags", false, true, false, 0, null, null, 10).observe((LifecycleOwner) context, results -> { - if (results == null) { + if (results == null || results.hashtags == null || results.hashtags.size() == 0) { return; } + if (camelTags != null && camelTags.size() > 0) { + for (String camelTag : camelTags) { + Tag tag = new Tag(); + tag.name = camelTag; + if (!results.hashtags.contains(tag)) { + results.hashtags.add(0, tag); + } + } + } + int currentCursorPosition = holder.binding.content.getSelectionStart(); TagsSearchAdapter tagsSearchAdapter = new TagsSearchAdapter(context, results.hashtags); holder.binding.content.setThreshold(1); @@ -1312,7 +1324,7 @@ public class ComposeAdapter extends RecyclerView.Adapter 0 && statusDraft.text != null && !statusDraft.text.contains("#")) { + if (forwardTag && position > 0 && statusDraft.text != null && !statusDraft.text.contains("#") && !statusList.get(position).tagAdded) { + statusList.get(position).tagAdded = true; Status status = statusList.get(position - 1).reblog == null ? statusList.get(position - 1) : statusList.get(position - 1).reblog; if (status.tags != null && status.tags.size() > 0) { statusDraft.text += "\n\n"; @@ -1614,8 +1627,9 @@ public class ComposeAdapter extends RecyclerView.Adapter 0 && statusDraft.text != null && statusDraft.text.contains("#")) { + } else if (forwardTag && position > 0 && statusDraft.text != null && statusDraft.text.contains("#") && !statusList.get(position).tagAdded) { Status status = statusList.get(position - 1).reblog == null ? statusList.get(position - 1) : statusList.get(position - 1).reblog; + statusList.get(position).tagAdded = true; int lenght = 0; for (Tag tag : status.tags) { lenght += ("#" + tag.name + " ").length(); @@ -1634,7 +1648,6 @@ public class ComposeAdapter extends RecyclerView.Adapter displayPollPopup(holder, statusDraft, position)); - holder.binding.buttonPoll.setOnClickListener(v -> displayPollPopup(holder, statusDraft, position)); if (instanceInfo == null) { return; } @@ -1681,7 +1694,7 @@ public class ComposeAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(context, ContextActivity.class); + Intent intent; + if (chatMode) { + intent = new Intent(context, DirectMessageActivity.class); + } else { + intent = new Intent(context, ContextActivity.class); + } intent.putExtra(Helper.ARG_STATUS, conversation.last_status); context.startActivity(intent); }); holder.binding.attachmentsListContainer.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { - Intent intent = new Intent(context, ContextActivity.class); + Intent intent; + if (chatMode) { + intent = new Intent(context, DirectMessageActivity.class); + } else { + intent = new Intent(context, ContextActivity.class); + } intent.putExtra(Helper.ARG_STATUS, conversation.last_status); context.startActivity(intent); } diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/NotificationAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/NotificationAdapter.java index 3b779d53..2301f509 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/NotificationAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/NotificationAdapter.java @@ -402,7 +402,7 @@ public class NotificationAdapter extends RecyclerView.Adapter LinearLayoutCompat.MarginLayoutParams pmc = (LinearLayoutCompat.MarginLayoutParams) holder.binding.mediaContainer.getLayoutParams(); pmc.setMarginStart((int) Helper.convertDpToPixel(6, context)); holder.binding.mediaContainer.setLayoutParams(pmc); - LinearLayoutCompat.MarginLayoutParams pal = (LinearLayoutCompat.MarginLayoutParams) holder.binding.attachmentsListContainer.getLayoutParams(); + LinearLayoutCompat.MarginLayoutParams pal = (LinearLayoutCompat.MarginLayoutParams) holder.binding.media.mediaContainer.getLayoutParams(); pal.setMarginStart((int) Helper.convertDpToPixel(6, context)); - holder.binding.attachmentsListContainer.setLayoutParams(pal); + holder.binding.media.mediaContainer.setLayoutParams(pal); LinearLayoutCompat.MarginLayoutParams pp = (LinearLayoutCompat.MarginLayoutParams) holder.binding.poll.pollContainer.getLayoutParams(); pp.setMarginStart((int) Helper.convertDpToPixel(6, context)); holder.binding.poll.pollContainer.setLayoutParams(pp); @@ -1432,7 +1432,7 @@ public class StatusAdapter extends RecyclerView.Adapter boolean cardDisplayed = (statusToDeal.card != null && (display_card || statusToDeal.isFocused) && statusToDeal.quote_id == null); if (statusToDeal.media_attachments != null && statusToDeal.media_attachments.size() > 0 && (!hideSingleMediaWithCard || !cardDisplayed || statusToDeal.media_attachments.size() > 1)) { - holder.binding.attachmentsList.removeAllViews(); + holder.binding.mediaContainer.removeAllViews(); if ((loadMediaType.equals("ASK") || (loadMediaType.equals("WIFI") && !TimelineHelper.isOnWIFI(context))) && !statusToDeal.canLoadMedia) { holder.binding.mediaContainer.setVisibility(View.GONE); @@ -1445,10 +1445,73 @@ public class StatusAdapter extends RecyclerView.Adapter }); } else { int mediaPosition = 1; - boolean singleMedia = statusToDeal.media_attachments.size() == 1; + if (!fullAttachement) { + int defaultHeight = (int) Helper.convertDpToPixel(300, context); + if (measuredWidth > 0) { + defaultHeight = (int) (measuredWidth * 3) / 4; + } + LinearLayoutCompat.LayoutParams lp = new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, defaultHeight); + holder.binding.media.mediaContainer.setLayoutParams(lp); + if (statusToDeal.media_attachments.size() == 1) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (statusToDeal.media_attachments.size() == 2) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (statusToDeal.media_attachments.size() == 3) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (statusToDeal.media_attachments.size() == 4) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (statusToDeal.media_attachments.size() > 4) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.VISIBLE); + } + } for (Attachment attachment : statusToDeal.media_attachments) { - LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context)); + + if (fullAttachement) { + + } + LayoutMediaBinding layoutMediaBinding = null; + + + if ((fullAttachement && (!statusToDeal.sensitive || expand_media))) { + layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context)); + holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot()); + } else { + if (mediaPosition == 1) { + layoutMediaBinding = holder.binding.media.media1Container; + } else if (mediaPosition == 2 && statusToDeal.media_attachments.size() == 3) { + layoutMediaBinding = holder.binding.media.media3Container; + } else if (mediaPosition == 2) { + layoutMediaBinding = holder.binding.media.media2Container; + } else if (mediaPosition == 3 && statusToDeal.media_attachments.size() == 3) { + layoutMediaBinding = holder.binding.media.media4Container; + } else if (mediaPosition == 3) { + layoutMediaBinding = holder.binding.media.media3Container; + } else if (mediaPosition == 4) { + layoutMediaBinding = holder.binding.media.media4Container; + } + } if (fullAttachement && (!statusToDeal.sensitive || expand_media)) { + float ratio = 1.0f; float mediaH = -1.0f; float mediaW = -1.0f; @@ -1459,30 +1522,29 @@ public class StatusAdapter extends RecyclerView.Adapter ratio = measuredWidth > 0 ? measuredWidth / mediaW : 1.0f; } } - loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, mediaW, mediaH, ratio, statusToDeal, attachment, singleMedia); + loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, mediaW, mediaH, ratio, statusToDeal, attachment); } else { - loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, -1.f, statusToDeal, attachment, singleMedia); + if (layoutMediaBinding != null) { + loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, -1.f, statusToDeal, attachment); + } } + + mediaPosition++; - if ((fullAttachement && (!statusToDeal.sensitive || expand_media)) || singleMedia) { - holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot()); - } else { - holder.binding.attachmentsList.addView(layoutMediaBinding.getRoot()); - } } - if ((!fullAttachement || statusToDeal.sensitive) && !singleMedia) { + if (!fullAttachement || statusToDeal.sensitive) { holder.binding.mediaContainer.setVisibility(View.GONE); - holder.binding.attachmentsListContainer.setVisibility(View.VISIBLE); + holder.binding.media.mediaContainer.setVisibility(View.VISIBLE); } else { holder.binding.mediaContainer.setVisibility(View.VISIBLE); - holder.binding.attachmentsListContainer.setVisibility(View.GONE); + holder.binding.media.mediaContainer.setVisibility(View.GONE); } } } else { holder.binding.displayMedia.setVisibility(View.GONE); holder.binding.mediaContainer.setVisibility(View.GONE); - holder.binding.attachmentsListContainer.setVisibility(View.GONE); + holder.binding.media.mediaContainer.setVisibility(View.GONE); } holder.binding.statusContent.setMovementMethod(LongClickLinkMovementMethod.getInstance()); holder.binding.reblogInfo.setOnClickListener(v -> { @@ -2262,9 +2324,9 @@ public class StatusAdapter extends RecyclerView.Adapter } } - private static RequestBuilder prepareRequestBuilder(Context context, Attachment attachment, - float mediaW, float mediaH, - float focusX, float focusY, boolean isSensitive, boolean isArt) { + public static RequestBuilder prepareRequestBuilder(Context context, Attachment attachment, + float mediaW, float mediaH, + float focusX, float focusY, boolean isSensitive, boolean isArt) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false); @@ -2309,7 +2371,7 @@ public class StatusAdapter extends RecyclerView.Adapter StatusViewHolder holder, RecyclerView.Adapter adapter, int mediaPosition, float mediaW, float mediaH, float ratio, - Status statusToDeal, Attachment attachment, boolean singleImage) { + Status statusToDeal, Attachment attachment) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5); boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false); @@ -2317,24 +2379,15 @@ public class StatusAdapter extends RecyclerView.Adapter boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false); LinearLayout.LayoutParams lp; - int defaultHeight = (int) Helper.convertDpToPixel(200, context); - if (measuredWidth > 0) { - defaultHeight = (int) (measuredWidth * 3) / 4; - } + if (fullAttachement && mediaH > 0 && (!statusToDeal.sensitive || expand_media)) { lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio)); layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER); } else { - if (singleImage) { - lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, defaultHeight); - } else { - //noinspection SuspiciousNameCombination - lp = new LinearLayout.LayoutParams(defaultHeight, defaultHeight); - } + lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP); } - layoutMediaBinding.media.setLayoutParams(lp); float focusX = 0.f; @@ -2343,10 +2396,7 @@ public class StatusAdapter extends RecyclerView.Adapter focusX = statusToDeal.media_attachments.get(0).meta.focus.x; focusY = statusToDeal.media_attachments.get(0).meta.focus.y; } - layoutMediaBinding.count.setVisibility(View.VISIBLE); - if ((!fullAttachement || statusToDeal.sensitive) && !singleImage) { - layoutMediaBinding.count.setText(String.format(Locale.getDefault(), "%d/%d", mediaPosition, statusToDeal.media_attachments.size())); - } + if (attachment.description != null && attachment.description.trim().length() > 0) { layoutMediaBinding.media.setContentDescription(attachment.description.trim()); } @@ -2426,7 +2476,7 @@ public class StatusAdapter extends RecyclerView.Adapter adapter.notifyItemChanged(holder.getBindingAdapterPosition()); }); - if ((!statusToDeal.sensitive || expand_media) && (fullAttachement || singleImage)) { + if ((!statusToDeal.sensitive || expand_media) && (fullAttachement)) { layoutMediaBinding.getRoot().setPadding(0, 0, 0, 10); } else { layoutMediaBinding.getRoot().setPadding(0, 0, 10, 0); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java new file mode 100644 index 00000000..36f3b9db --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusDirectMessageAdapter.java @@ -0,0 +1,501 @@ +package app.fedilab.android.mastodon.ui.drawer; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + + +import static app.fedilab.android.mastodon.ui.drawer.StatusAdapter.prepareRequestBuilder; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.PorterDuff; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.SpannableString; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.LinearLayoutCompat; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelStoreOwner; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.RequestBuilder; + +import org.jetbrains.annotations.NotNull; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import app.fedilab.android.BaseMainActivity; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.databinding.DrawerStatusChatBinding; +import app.fedilab.android.databinding.LayoutMediaBinding; +import app.fedilab.android.databinding.LayoutPollItemBinding; +import app.fedilab.android.mastodon.activities.MediaActivity; +import app.fedilab.android.mastodon.client.entities.api.Attachment; +import app.fedilab.android.mastodon.client.entities.api.Poll; +import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.helper.Helper; +import app.fedilab.android.mastodon.helper.LongClickLinkMovementMethod; +import app.fedilab.android.mastodon.helper.MastodonHelper; +import app.fedilab.android.mastodon.helper.MediaHelper; +import app.fedilab.android.mastodon.helper.ThemeHelper; +import app.fedilab.android.mastodon.viewmodel.mastodon.StatusesVM; + +public class StatusDirectMessageAdapter extends RecyclerView.Adapter { + + private final List statusList; + private Context context; + private RecyclerView mRecyclerView; + private static float measuredWidth = -1; + public StatusDirectMessageAdapter(List data) { + this.statusList = data; + } + + @NotNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + context = parent.getContext(); + DrawerStatusChatBinding itemBinding = DrawerStatusChatBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new StatusChatViewHolder(itemBinding); + } + + public static void loadAndAddAttachment(Context context, LayoutMediaBinding layoutMediaBinding, + StatusChatViewHolder holder, + RecyclerView.Adapter adapter, + int mediaPosition, float mediaW, float mediaH, float ratio, + Status status, Attachment attachment) { + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5); + boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false); + boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false); + + LinearLayout.LayoutParams lp; + + lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP); + + layoutMediaBinding.media.setLayoutParams(lp); + + float focusX = 0.f; + float focusY = 0.f; + if (status.media_attachments.get(0).meta != null && status.media_attachments.get(0).meta.focus != null) { + focusX = status.media_attachments.get(0).meta.focus.x; + focusY = status.media_attachments.get(0).meta.focus.y; + } + if (attachment.description != null && attachment.description.trim().length() > 0) { + layoutMediaBinding.media.setContentDescription(attachment.description.trim()); + } + String finalUrl; + if (attachment.url == null) { + finalUrl = attachment.remote_url; + } else { + finalUrl = attachment.url; + } + layoutMediaBinding.media.setOnLongClickListener(v -> { + if (long_press_media) { + MediaHelper.manageMove(context, finalUrl, false); + } + return true; + }); + + if (attachment.type != null && (attachment.type.equalsIgnoreCase("video") || attachment.type.equalsIgnoreCase("gifv"))) { + layoutMediaBinding.playVideo.setVisibility(View.VISIBLE); + } else { + layoutMediaBinding.playVideo.setVisibility(View.GONE); + } + if (attachment.type != null && attachment.type.equalsIgnoreCase("audio")) { + layoutMediaBinding.playMusic.setVisibility(View.VISIBLE); + } else { + layoutMediaBinding.playMusic.setVisibility(View.GONE); + } + if (attachment.description != null && !attachment.description.isEmpty()) { + layoutMediaBinding.viewDescription.setVisibility(View.VISIBLE); + } else { + layoutMediaBinding.viewDescription.setVisibility(View.GONE); + } + + RequestBuilder requestBuilder = prepareRequestBuilder(context, attachment, mediaW * ratio, mediaH * ratio, focusX, focusY, status.sensitive, false); + if (!status.sensitive || expand_media) { + layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24); + } else { + layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_off_24); + } + requestBuilder.load(attachment.preview_url).into(layoutMediaBinding.media); + if (status.sensitive) { + Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError)); + } else { + Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white); + } + + layoutMediaBinding.media.setOnClickListener(v -> { + if (status.sensitive && !expand_media) { + status.sensitive = false; + int position = holder.getBindingAdapterPosition(); + adapter.notifyItemChanged(position); + + if (timeout > 0) { + new CountDownTimer((timeout * 1000L), 1000) { + public void onTick(long millisUntilFinished) { + } + + public void onFinish() { + status.sensitive = true; + adapter.notifyItemChanged(position); + } + }.start(); + } + return; + } + Intent mediaIntent = new Intent(context, MediaActivity.class); + Bundle b = new Bundle(); + b.putInt(Helper.ARG_MEDIA_POSITION, mediaPosition); + b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(status.media_attachments)); + mediaIntent.putExtras(b); + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation((Activity) context, layoutMediaBinding.media, status.media_attachments.get(0).url); + // start the new activity + context.startActivity(mediaIntent, options.toBundle()); + }); + layoutMediaBinding.viewHide.setOnClickListener(v -> { + status.sensitive = !status.sensitive; + adapter.notifyItemChanged(holder.getBindingAdapterPosition()); + }); + + } + + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + + mRecyclerView = recyclerView; + } + + + @Override + public int getItemCount() { + return statusList.size(); + } + + public static class StatusChatViewHolder extends RecyclerView.ViewHolder { + DrawerStatusChatBinding binding; + + StatusChatViewHolder(DrawerStatusChatBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { + + StatusChatViewHolder holder = (StatusChatViewHolder) viewHolder; + Status status = statusList.get(position); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + holder.binding.messageContent.setText( + status.getSpanContent(context, + new WeakReference<>(holder.binding.messageContent), + () -> mRecyclerView.post(() -> notifyItemChanged(holder.getBindingAdapterPosition()))), + TextView.BufferType.SPANNABLE); + holder.binding.messageContent.setMovementMethod(LongClickLinkMovementMethod.getInstance()); + if (measuredWidth <= 0 && status.media_attachments != null && status.media_attachments.size() > 0) { + holder.binding.media.mediaContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + holder.binding.media.mediaContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); + measuredWidth = holder.binding.media.mediaContainer.getWidth(); + notifyItemChanged(0, statusList.size()); + } + }); + } + MastodonHelper.loadPPMastodon(holder.binding.userPp, status.account); + holder.binding.date.setText(Helper.longDateToString(status.created_at)); + //Owner account + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + if (status.account.id.equals(MainActivity.currentUserID)) { + holder.binding.mainContainer.setBackgroundResource(R.drawable.bubble_right_tail); + + layoutParams.setMargins((int) Helper.convertDpToPixel(50, context), (int) Helper.convertDpToPixel(12, context), 0, 0); + holder.binding.date.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + holder.binding.messageContent.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + holder.binding.userName.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + } else { + holder.binding.mainContainer.setBackgroundResource(R.drawable.bubble_left_tail); + layoutParams.setMargins(0, (int) Helper.convertDpToPixel(12, context), (int) Helper.convertDpToPixel(50, context), 0); + holder.binding.date.setTextColor(ContextCompat.getColor(context, R.color.black)); + holder.binding.messageContent.setTextColor(ContextCompat.getColor(context, R.color.black)); + holder.binding.userName.setTextColor(ContextCompat.getColor(context, R.color.black)); + } + holder.binding.mainContainer.setLayoutParams(layoutParams); + + final float scale = sharedpreferences.getFloat(context.getString(R.string.SET_FONT_SCALE), 1.1f); + if (status.poll != null && status.poll.options != null) { + + holder.binding.poll.pollInfo.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + holder.binding.poll.refresh.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class); + if (status.poll.voted || status.poll.expired) { + holder.binding.poll.submitVote.setVisibility(View.GONE); + holder.binding.poll.rated.setVisibility(View.VISIBLE); + holder.binding.poll.multipleChoice.setVisibility(View.GONE); + holder.binding.poll.singleChoiceRadioGroup.setVisibility(View.GONE); + int greaterValue = 0; + for (Poll.PollItem pollItem : status.poll.options) { + if (pollItem.votes_count > greaterValue) + greaterValue = pollItem.votes_count; + } + holder.binding.poll.rated.removeAllViews(); + List ownvotes = status.poll.own_votes; + int j = 0; + if (status.poll.voters_count == 0 && status.poll.votes_count > 0) { + status.poll.voters_count = status.poll.votes_count; + } + LayoutInflater inflater = ((Activity) context).getLayoutInflater(); + for (Poll.PollItem pollItem : status.poll.options) { + @NonNull LayoutPollItemBinding pollItemBinding = LayoutPollItemBinding.inflate(inflater, holder.binding.poll.rated, true); + double value = ((double) (pollItem.votes_count * 100) / (double) status.poll.voters_count); + pollItemBinding.pollItemPercent.setText(String.format("%s %%", (int) value)); + pollItemBinding.pollItemText.setText( + pollItem.getSpanTitle(context, status, + new WeakReference<>(pollItemBinding.pollItemText)), + TextView.BufferType.SPANNABLE); + pollItemBinding.pollItemPercent.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + pollItemBinding.pollItemText.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + pollItemBinding.pollItemValue.setProgress((int) value); + if (pollItem.votes_count == greaterValue) { + pollItemBinding.pollItemPercent.setTypeface(null, Typeface.BOLD); + pollItemBinding.pollItemText.setTypeface(null, Typeface.BOLD); + } + if (ownvotes != null && ownvotes.contains(j)) { + Drawable img = ContextCompat.getDrawable(context, R.drawable.ic_baseline_check_24); + assert img != null; + img.setColorFilter(ThemeHelper.getAttColor(context, R.attr.colorPrimary), PorterDuff.Mode.SRC_IN); + img.setBounds(0, 0, (int) (20 * scale + 0.5f), (int) (20 * scale + 0.5f)); + pollItemBinding.pollItemText.setCompoundDrawables(null, null, img, null); + } + j++; + } + } else { + + if (status.poll.voters_count == 0 && status.poll.votes_count > 0) { + status.poll.voters_count = status.poll.votes_count; + } + holder.binding.poll.rated.setVisibility(View.GONE); + holder.binding.poll.submitVote.setVisibility(View.VISIBLE); + if (status.poll.multiple) { + if ((holder.binding.poll.multipleChoice).getChildCount() > 0) + (holder.binding.poll.multipleChoice).removeAllViews(); + for (Poll.PollItem pollOption : status.poll.options) { + CheckBox cb = new CheckBox(context); + cb.setText( + pollOption.getSpanTitle(context, status, + new WeakReference<>(cb)), + TextView.BufferType.SPANNABLE); + holder.binding.poll.multipleChoice.addView(cb); + cb.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + } + holder.binding.poll.multipleChoice.setVisibility(View.VISIBLE); + holder.binding.poll.singleChoiceRadioGroup.setVisibility(View.GONE); + } else { + if ((holder.binding.poll.singleChoiceRadioGroup).getChildCount() > 0) + (holder.binding.poll.singleChoiceRadioGroup).removeAllViews(); + for (Poll.PollItem pollOption : status.poll.options) { + RadioButton rb = new RadioButton(context); + rb.setText( + pollOption.getSpanTitle(context, status, + new WeakReference<>(rb)), + TextView.BufferType.SPANNABLE); + rb.setTextColor(ThemeHelper.getAttColor(context, R.attr.colorOnSecondary)); + holder.binding.poll.singleChoiceRadioGroup.addView(rb); + } + holder.binding.poll.singleChoiceRadioGroup.setVisibility(View.VISIBLE); + holder.binding.poll.multipleChoice.setVisibility(View.GONE); + } + holder.binding.poll.submitVote.setVisibility(View.VISIBLE); + holder.binding.poll.submitVote.setOnClickListener(v -> { + int[] choice; + if (status.poll.multiple) { + ArrayList choices = new ArrayList<>(); + int choicesCount = holder.binding.poll.multipleChoice.getChildCount(); + for (int i1 = 0; i1 < choicesCount; i1++) { + if (holder.binding.poll.multipleChoice.getChildAt(i1) != null && holder.binding.poll.multipleChoice.getChildAt(i1) instanceof CheckBox) { + if (((CheckBox) holder.binding.poll.multipleChoice.getChildAt(i1)).isChecked()) { + choices.add(i1); + } + } + } + choice = new int[choices.size()]; + Iterator iterator = choices.iterator(); + for (int i1 = 0; i1 < choice.length; i1++) { + choice[i1] = iterator.next(); + } + if (choice.length == 0) + return; + } else { + choice = new int[1]; + choice[0] = -1; + int choicesCount = holder.binding.poll.singleChoiceRadioGroup.getChildCount(); + for (int i1 = 0; i1 < choicesCount; i1++) { + if (holder.binding.poll.singleChoiceRadioGroup.getChildAt(i1) != null && holder.binding.poll.singleChoiceRadioGroup.getChildAt(i1) instanceof RadioButton) { + if (((RadioButton) holder.binding.poll.singleChoiceRadioGroup.getChildAt(i1)).isChecked()) { + choice[0] = i1; + } + } + } + if (choice[0] == -1) + return; + } + //Vote on the poll + + statusesVM.votePoll(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, status.poll.id, choice) + .observe((LifecycleOwner) context, poll -> { + if (poll != null) { + int i = 0; + for (Poll.PollItem item : status.poll.options) { + if (item.span_title != null) { + poll.options.get(i).span_title = item.span_title; + } else { + poll.options.get(i).span_title = new SpannableString(item.title); + } + i++; + } + status.poll = poll; + notifyItemChanged(holder.getBindingAdapterPosition()); + } + }); + + }); + } + holder.binding.poll.refreshPoll.setOnClickListener(v -> statusesVM.getPoll(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, status.poll.id) + .observe((LifecycleOwner) context, poll -> { + if (poll != null) { + //Store span elements + int i = 0; + for (Poll.PollItem item : status.poll.options) { + if (item.span_title != null) { + poll.options.get(i).span_title = item.span_title; + } else { + poll.options.get(i).span_title = new SpannableString(item.title); + } + i++; + } + status.poll = poll; + notifyItemChanged(holder.getBindingAdapterPosition()); + } + })); + holder.binding.poll.pollContainer.setVisibility(View.VISIBLE); + String pollInfo = context.getResources().getQuantityString(R.plurals.number_of_voters, status.poll.voters_count, status.poll.voters_count); + if (status.poll.expired) { + pollInfo += " - " + context.getString(R.string.poll_finish_at, MastodonHelper.dateToStringPoll(status.poll.expires_at)); + } else { + pollInfo += " - " + context.getString(R.string.poll_finish_in, MastodonHelper.dateDiffPoll(context, status.poll.expires_at)); + } + holder.binding.poll.pollInfo.setText(pollInfo); + } else { + holder.binding.poll.pollContainer.setVisibility(View.GONE); + } + holder.binding.userName.setText( + status.account.getSpanDisplayName(context, + new WeakReference<>(holder.binding.userName)), + TextView.BufferType.SPANNABLE); + + if (status.media_attachments != null && status.media_attachments.size() > 0) { + holder.binding.media.mediaContainer.setVisibility(View.VISIBLE); + int mediaPosition = 1; + + int defaultHeight = (int) Helper.convertDpToPixel(300, context); + if (measuredWidth > 0) { + defaultHeight = (int) (measuredWidth * 3) / 4; + } + LinearLayoutCompat.LayoutParams lp = new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, defaultHeight); + holder.binding.media.mediaContainer.setLayoutParams(lp); + if (status.media_attachments.size() == 1) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (status.media_attachments.size() == 2) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (status.media_attachments.size() == 3) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.GONE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (status.media_attachments.size() == 4) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.GONE); + } else if (status.media_attachments.size() > 4) { + holder.binding.media.media1Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media2Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media3Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.media4Container.mediaRoot.setVisibility(View.VISIBLE); + holder.binding.media.moreMedia.setVisibility(View.VISIBLE); + } + for (Attachment attachment : status.media_attachments) { + LayoutMediaBinding layoutMediaBinding = null; + if (mediaPosition == 1) { + layoutMediaBinding = holder.binding.media.media1Container; + } else if (mediaPosition == 2 && status.media_attachments.size() == 3) { + layoutMediaBinding = holder.binding.media.media3Container; + } else if (mediaPosition == 2) { + layoutMediaBinding = holder.binding.media.media2Container; + } else if (mediaPosition == 3 && status.media_attachments.size() == 3) { + layoutMediaBinding = holder.binding.media.media4Container; + } else if (mediaPosition == 3) { + layoutMediaBinding = holder.binding.media.media3Container; + } else if (mediaPosition == 4) { + layoutMediaBinding = holder.binding.media.media4Container; + } + if (layoutMediaBinding != null) { + loadAndAddAttachment(context, layoutMediaBinding, holder, this, mediaPosition, -1.f, -1.f, -1.f, status, attachment); + } + + + mediaPosition++; + } + } else { + holder.binding.media.mediaContainer.setVisibility(View.GONE); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/TagsEditAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/TagsEditAdapter.java new file mode 100644 index 00000000..5bbf2d39 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/TagsEditAdapter.java @@ -0,0 +1,107 @@ +package app.fedilab.android.mastodon.ui.drawer; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import app.fedilab.android.R; +import app.fedilab.android.databinding.DrawerTagEditBinding; +import app.fedilab.android.mastodon.client.entities.app.CamelTag; +import app.fedilab.android.mastodon.exception.DBException; +import es.dmoral.toasty.Toasty; + +public class TagsEditAdapter extends RecyclerView.Adapter { + + private final List tags; + private final TagsEditAdapter tagsEditAdapter; + private Context context; + + public TagsEditAdapter(List tags) { + this.tags = tags; + tagsEditAdapter = this; + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) { + context = parent.getContext(); + DrawerTagEditBinding itemBinding = DrawerTagEditBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new TagCaheViewHolder(itemBinding); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { + final String[] tag = {tags.get(viewHolder.getLayoutPosition())}; + TagCaheViewHolder holder = (TagCaheViewHolder) viewHolder; + holder.binding.tagName.setText(String.format("#%s", tag[0])); + holder.binding.saveTag.setOnClickListener(v -> { + if (holder.binding.tagName.getText() != null && holder.binding.tagName.getText().toString().trim().replaceAll("#", "").length() > 0) { + String tagToInsert = holder.binding.tagName.getText().toString().trim().replaceAll("#", ""); + try { + boolean isPresent = new CamelTag(context).tagExists(tagToInsert); + if (isPresent) + Toasty.warning(context, context.getString(R.string.tags_already_stored), Toast.LENGTH_LONG).show(); + else { + new CamelTag(context).update(tag[0], tagToInsert); + Toasty.success(context, context.getString(R.string.tags_renamed), Toast.LENGTH_LONG).show(); + } + } catch (DBException e) { + throw new RuntimeException(e); + } + + } + }); + + holder.binding.deleteTag.setOnClickListener(v -> { + holder.binding.tagName.clearFocus(); + new CamelTag(context).removeTag(tag[0]); + tags.remove(tag[0]); + tagsEditAdapter.notifyItemRemoved(viewHolder.getLayoutPosition()); + Toasty.success(context, context.getString(R.string.tags_deleted), Toast.LENGTH_LONG).show(); + }); + + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return tags.size(); + } + + + static class TagCaheViewHolder extends RecyclerView.ViewHolder { + DrawerTagEditBinding binding; + + public TagCaheViewHolder(@NonNull DrawerTagEditBinding drawerTagEditBinding) { + super(drawerTagEditBinding.getRoot()); + binding = drawerTagEditBinding; + } + } +} + + diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentComposeSettings.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentComposeSettings.java index 0dd73bcc..65418705 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentComposeSettings.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentComposeSettings.java @@ -18,11 +18,16 @@ import android.content.SharedPreferences; import android.os.Bundle; import androidx.preference.EditTextPreference; +import androidx.preference.MultiSelectListPreference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; +import java.util.List; +import java.util.Set; + import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; +import app.fedilab.android.mastodon.client.entities.app.Languages; public class FragmentComposeSettings extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -40,6 +45,40 @@ public class FragmentComposeSettings extends PreferenceFragmentCompat implements String val = sharedPreferences.getString(getString(R.string.SET_WATERMARK_TEXT) + BaseMainActivity.currentUserID + BaseMainActivity.currentInstance, sharedPreferences.getString(getString(R.string.SET_WATERMARK_TEXT), null)); SET_WATERMARK_TEXT.setText(val); } + + MultiSelectListPreference SET_SELECTED_LANGUAGE = findPreference(getString(R.string.SET_SELECTED_LANGUAGE)); + if (SET_SELECTED_LANGUAGE != null) { + + Set storedLanguages = sharedPreferences.getStringSet(getString(R.string.SET_SELECTED_LANGUAGE), null); + + String[] selectedValue = new String[0]; + if (storedLanguages != null && storedLanguages.size() > 0) { + if (storedLanguages.size() == 1 && storedLanguages.toArray()[0] == null) { + sharedPreferences.edit().remove(getString(R.string.SET_SELECTED_LANGUAGE)).commit(); + } else { + selectedValue = storedLanguages.toArray(new String[0]); + } + } + List languages = Languages.get(requireActivity()); + if (languages != null) { + String[] codesArr = new String[languages.size()]; + String[] languagesArr = new String[languages.size()]; + int i = 0; + for (Languages.Language language : languages) { + codesArr[i] = language.code; + languagesArr[i] = language.language; + i++; + } + SET_SELECTED_LANGUAGE.setEntries(languagesArr); + SET_SELECTED_LANGUAGE.setEntryValues(codesArr); + if (selectedValue.length > 0) { + SET_SELECTED_LANGUAGE.setDefaultValue(selectedValue); + } + } + + } + + } @Override diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentTimelinesSettings.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentTimelinesSettings.java index e9d5228d..059494ab 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentTimelinesSettings.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentTimelinesSettings.java @@ -47,7 +47,8 @@ public class FragmentTimelinesSettings extends PreferenceFragmentCompat implemen ListPreference SET_TRANSLATOR_VERSION = findPreference(getString(R.string.SET_TRANSLATOR_VERSION)); EditTextPreference SET_TRANSLATOR_API_KEY = findPreference(getString(R.string.SET_TRANSLATOR_API_KEY)); - if (SET_TRANSLATOR != null && SET_TRANSLATOR.getValue().equals("FEDILAB")) { + EditTextPreference SET_TRANSLATOR_DOMAIN = findPreference(getString(R.string.SET_TRANSLATOR_DOMAIN)); + if (SET_TRANSLATOR != null && !SET_TRANSLATOR.getValue().equals("DEEPL")) { if (SET_TRANSLATOR_API_KEY != null) { preferenceScreen.removePreferenceRecursively("SET_TRANSLATOR_API_KEY"); } @@ -55,6 +56,11 @@ public class FragmentTimelinesSettings extends PreferenceFragmentCompat implemen preferenceScreen.removePreferenceRecursively("SET_TRANSLATOR_VERSION"); } } + if (SET_TRANSLATOR != null && !SET_TRANSLATOR.getValue().equals("LINGVA")) { + if (SET_TRANSLATOR_DOMAIN != null) { + preferenceScreen.removePreferenceRecursively("SET_TRANSLATOR_DOMAIN"); + } + } SwitchPreferenceCompat SET_DISPLAY_BOOKMARK = findPreference(getString(R.string.SET_DISPLAY_BOOKMARK)); if (SET_DISPLAY_BOOKMARK != null) { boolean checked = sharedpreferences.getBoolean(getString(R.string.SET_DISPLAY_BOOKMARK) + MainActivity.currentUserID + MainActivity.currentInstance, true); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java new file mode 100644 index 00000000..ff2ab9dd --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java @@ -0,0 +1,942 @@ +package app.fedilab.android.mastodon.ui.fragment.timeline; +/* Copyright 2023 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import static app.fedilab.android.BaseMainActivity.currentAccount; +import static app.fedilab.android.BaseMainActivity.currentInstance; +import static app.fedilab.android.BaseMainActivity.currentToken; +import static app.fedilab.android.BaseMainActivity.currentUserID; +import static app.fedilab.android.BaseMainActivity.instanceInfo; +import static app.fedilab.android.mastodon.activities.ComposeActivity.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE; + +import android.Manifest; +import android.content.BroadcastReceiver; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.InputFilter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatEditText; +import androidx.appcompat.widget.LinearLayoutCompat; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.work.Data; +import androidx.work.OneTimeWorkRequest; +import androidx.work.OutOfQuotaPolicy; +import androidx.work.WorkManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import app.fedilab.android.BaseMainActivity; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.databinding.ComposeAttachmentItemBinding; +import app.fedilab.android.databinding.ComposePollBinding; +import app.fedilab.android.databinding.ComposePollItemBinding; +import app.fedilab.android.databinding.FragmentDirectMessageBinding; +import app.fedilab.android.databinding.PopupMediaDescriptionBinding; +import app.fedilab.android.mastodon.activities.ComposeActivity; +import app.fedilab.android.mastodon.client.entities.api.Attachment; +import app.fedilab.android.mastodon.client.entities.api.Context; +import app.fedilab.android.mastodon.client.entities.api.Mention; +import app.fedilab.android.mastodon.client.entities.api.Poll; +import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.app.StatusDraft; +import app.fedilab.android.mastodon.exception.DBException; +import app.fedilab.android.mastodon.helper.Helper; +import app.fedilab.android.mastodon.helper.ThemeHelper; +import app.fedilab.android.mastodon.imageeditor.EditImageActivity; +import app.fedilab.android.mastodon.jobs.ComposeWorker; +import app.fedilab.android.mastodon.services.ThreadMessageService; +import app.fedilab.android.mastodon.ui.drawer.StatusDirectMessageAdapter; +import app.fedilab.android.mastodon.viewmodel.mastodon.StatusesVM; +import es.dmoral.toasty.Toasty; + + +public class FragmentMastodonDirectMessage extends Fragment { + + + public FirstMessage firstMessage; + private FragmentDirectMessageBinding binding; + private StatusesVM statusesVM; + private List statuses; + private StatusDirectMessageAdapter statusDirectMessageAdapter; + //Handle actions that can be done in other fragments + private Status focusedStatus; + private Status firstStatus; + private boolean pullToRefresh; + private String user_token, user_instance; + + private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { + @Override + public void onReceive(android.content.Context context, Intent intent) { + Bundle b = intent.getExtras(); + if (b != null) { + + if (b.getBoolean(Helper.RECEIVE_NEW_MESSAGE, false)) { + Status statusReceived = (Status) b.getSerializable(Helper.RECEIVE_STATUS_ACTION); + if (statusReceived != null) { + statuses.add(statusReceived); + statusDirectMessageAdapter.notifyItemInserted(statuses.size() - 1); + initiliazeStatus(); + } + } + } + } + }; + private Status statusCompose; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + + focusedStatus = null; + pullToRefresh = false; + if (getArguments() != null) { + focusedStatus = (Status) getArguments().getSerializable(Helper.ARG_STATUS); + } + user_instance = MainActivity.currentInstance; + user_token = MainActivity.currentToken; + + if (focusedStatus == null) { + getChildFragmentManager().beginTransaction().remove(this).commit(); + } + binding = FragmentDirectMessageBinding.inflate(inflater, container, false); + statusesVM = new ViewModelProvider(FragmentMastodonDirectMessage.this).get(StatusesVM.class); + binding.recyclerView.setNestedScrollingEnabled(true); + this.statuses = new ArrayList<>(); + this.statuses.add(focusedStatus); + statusDirectMessageAdapter = new StatusDirectMessageAdapter(this.statuses); + binding.swipeContainer.setRefreshing(false); + LinearLayoutManager mLayoutManager = new LinearLayoutManager(requireActivity()); + binding.recyclerView.setLayoutManager(mLayoutManager); + binding.recyclerView.setAdapter(statusDirectMessageAdapter); + binding.swipeContainer.setOnRefreshListener(() -> { + if (this.statuses.size() > 0) { + binding.swipeContainer.setRefreshing(true); + pullToRefresh = true; + statusesVM.getContext(user_instance, user_token, focusedStatus.id) + .observe(getViewLifecycleOwner(), this::initializeContextView); + } + }); + if (focusedStatus != null) { + statusesVM.getContext(user_instance, user_token, focusedStatus.id) + .observe(getViewLifecycleOwner(), this::initializeContextView); + } + binding.buttonCloseAttachmentPanel.setOnClickListener(v -> binding.attachmentChoicesPanel.setVisibility(View.GONE)); + statusCompose = new Status(); + binding.buttonAttach.setOnClickListener(v -> { + + if (instanceInfo.configuration.media_attachments.supported_mime_types != null) { + if (instanceInfo.getMimeTypeAudio().size() == 0) { + binding.buttonAttachAudio.setEnabled(false); + } + if (instanceInfo.getMimeTypeImage().size() == 0) { + binding.buttonAttachImage.setEnabled(false); + } + if (instanceInfo.getMimeTypeVideo().size() == 0) { + binding.buttonAttachVideo.setEnabled(false); + } + if (instanceInfo.getMimeTypeOther().size() == 0) { + binding.buttonAttachManual.setEnabled(false); + } + } + binding.attachmentChoicesPanel.setVisibility(View.VISIBLE); + binding.buttonAttach.setChecked(false); + }); + binding.buttonPoll.setOnClickListener(v -> displayPollPopup()); + binding.buttonAttachAudio.setOnClickListener(v -> { + binding.attachmentChoicesPanel.setVisibility(View.GONE); + pickupMedia(ComposeActivity.mediaType.AUDIO); + }); + binding.buttonAttachImage.setOnClickListener(v -> { + binding.attachmentChoicesPanel.setVisibility(View.GONE); + pickupMedia(ComposeActivity.mediaType.PHOTO); + }); + binding.buttonAttachVideo.setOnClickListener(v -> { + binding.attachmentChoicesPanel.setVisibility(View.GONE); + pickupMedia(ComposeActivity.mediaType.VIDEO); + }); + binding.buttonAttachManual.setOnClickListener(v -> { + binding.attachmentChoicesPanel.setVisibility(View.GONE); + pickupMedia(ComposeActivity.mediaType.ALL); + }); + + binding.sendButton.setOnClickListener(v -> { + statusCompose.submitted = true; + statusCompose.text = binding.text.getText().toString(); + onSubmit(prepareDraft(statusCompose, MainActivity.currentInstance, MainActivity.currentUserID)); + }); + LocalBroadcastManager.getInstance(requireActivity()).registerReceiver(broadcast_data, new IntentFilter(Helper.BROADCAST_DATA)); + + binding.text.setKeyBoardInputCallbackListener((inputContentInfo, flags, opts) -> { + if (inputContentInfo != null) { + Uri uri = inputContentInfo.getContentUri(); + List uris = new ArrayList<>(); + uris.add(uri); + addAttachment(uris); + } + }); + + return binding.getRoot(); + } + + + private void onSubmit(StatusDraft statusDraft) { + new Thread(() -> { + if (statusDraft.instance == null) { + statusDraft.instance = currentInstance; + } + if (statusDraft.user_id == null) { + statusDraft.user_id = currentUserID; + } + + if (!canBeSent(statusDraft)) { + return; + } + if (statusDraft.id > 0) { + try { + new StatusDraft(requireActivity()).updateStatusDraft(statusDraft); + } catch (DBException e) { + e.printStackTrace(); + } + } else { + try { + statusDraft.id = new StatusDraft(requireActivity()).insertStatusDraft(statusDraft); + } catch (DBException e) { + e.printStackTrace(); + } + } + int mediaCount = 0; + for (Status status : statusDraft.statusDraftList) { + mediaCount += status.media_attachments != null ? status.media_attachments.size() : 0; + } + if (mediaCount > 0) { + Data inputData = new Data.Builder() + .putString(Helper.ARG_STATUS_DRAFT_ID, String.valueOf(statusDraft.id)) + .putString(Helper.ARG_INSTANCE, currentInstance) + .putString(Helper.ARG_TOKEN, currentToken) + .putString(Helper.ARG_USER_ID, currentUserID) + .build(); + OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(ComposeWorker.class) + .setInputData(inputData) + .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) + .build(); + WorkManager.getInstance(requireActivity()).enqueue(request); + + } else { + new ThreadMessageService(requireActivity(), currentInstance, currentUserID, currentToken, statusDraft, null, null); + } + }).start(); + } + + + @Override + public void onDestroyView() { + LocalBroadcastManager.getInstance(requireActivity()).unregisterReceiver(broadcast_data); + super.onDestroyView(); + } + + + private boolean canBeSent(StatusDraft statusDraft) { + if (statusDraft == null) { + return false; + } + List statuses = statusDraft.statusDraftList; + if (statuses == null || statuses.size() == 0) { + return false; + } + Status statusCheck = statuses.get(0); + if (statusCheck == null) { + return false; + } + return (statusCheck.text != null && statusCheck.text.trim().length() != 0) + || (statusCheck.media_attachments != null && statusCheck.media_attachments.size() != 0) + || statusCheck.poll != null + || (statusCheck.spoiler_text != null && statusCheck.spoiler_text.trim().length() != 0); + } + + public StatusDraft prepareDraft(Status status, String instance, String user_id) { + //Collect all statusCompose + List statusDrafts = new ArrayList<>(); + statusDrafts.add(status); + StatusDraft statusDraftDB = new StatusDraft(); + statusDraftDB.statusReplyList = new ArrayList<>(); + statusDraftDB.statusReplyList.addAll(statuses); + statusDraftDB.statusDraftList = new ArrayList<>(); + statusDraftDB.statusDraftList.addAll(statusDrafts); + statusDraftDB.instance = instance; + statusDraftDB.user_id = user_id; + return statusDraftDB; + } + + /** + * Display the popup to attach a poll to message + */ + private void displayPollPopup() { + AlertDialog.Builder alertPoll = new MaterialAlertDialogBuilder(requireActivity()); + alertPoll.setTitle(R.string.create_poll); + ComposePollBinding composePollBinding = ComposePollBinding.inflate(LayoutInflater.from(requireActivity()), new LinearLayout(requireActivity()), false); + alertPoll.setView(composePollBinding.getRoot()); + int max_entry = 4; + int max_length = 25; + final int[] pollCountItem = {2}; + + if (instanceInfo != null && instanceInfo.configuration != null && instanceInfo.configuration.pollsConf != null) { + max_entry = instanceInfo.configuration.pollsConf.max_options; + max_length = instanceInfo.configuration.pollsConf.max_option_chars; + } else if (instanceInfo != null && instanceInfo.poll_limits != null) { + max_entry = instanceInfo.poll_limits.max_options; + max_length = instanceInfo.poll_limits.max_option_chars; + } + InputFilter[] fArray = new InputFilter[1]; + fArray[0] = new InputFilter.LengthFilter(max_length); + composePollBinding.option1.text.setFilters(fArray); + composePollBinding.option1.textLayout.setHint(getString(R.string.poll_choice_s, 1)); + composePollBinding.option2.text.setFilters(fArray); + composePollBinding.option2.textLayout.setHint(getString(R.string.poll_choice_s, 2)); + composePollBinding.option1.buttonRemove.setVisibility(View.GONE); + composePollBinding.option2.buttonRemove.setVisibility(View.GONE); + int finalMax_entry = max_entry; + composePollBinding.buttonAddOption.setOnClickListener(v -> { + if (pollCountItem[0] < finalMax_entry) { + ComposePollItemBinding composePollItemBinding = ComposePollItemBinding.inflate(LayoutInflater.from(composePollBinding.optionsList.getContext()), composePollBinding.optionsList, false); + if (composePollBinding.pollType.getCheckedButtonId() == R.id.poll_type_multiple) + composePollItemBinding.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_multiple); + composePollItemBinding.text.setFilters(fArray); + composePollItemBinding.textLayout.setHint(getString(R.string.poll_choice_s, (pollCountItem[0] + 1))); + LinearLayoutCompat viewItem = composePollItemBinding.getRoot(); + composePollBinding.optionsList.addView(composePollItemBinding.getRoot()); + composePollItemBinding.buttonRemove.setOnClickListener(view -> { + composePollBinding.optionsList.removeView(viewItem); + pollCountItem[0]--; + if (pollCountItem[0] >= finalMax_entry) { + composePollBinding.buttonAddOption.setVisibility(View.GONE); + } else { + composePollBinding.buttonAddOption.setVisibility(View.VISIBLE); + } + int childCount = composePollBinding.optionsList.getChildCount(); + for (int i = 0; i < childCount; i++) { + AppCompatEditText title = (composePollBinding.optionsList.getChildAt(i)).findViewById(R.id.text); + title.setHint(getString(R.string.poll_choice_s, i + 1)); + } + + }); + } + pollCountItem[0]++; + if (pollCountItem[0] >= finalMax_entry) { + composePollBinding.buttonAddOption.setVisibility(View.GONE); + } else { + composePollBinding.buttonAddOption.setVisibility(View.VISIBLE); + } + + }); + + + ArrayAdapter pollduration = ArrayAdapter.createFromResource(requireActivity(), + R.array.poll_duration, android.R.layout.simple_spinner_dropdown_item); + composePollBinding.pollDuration.setAdapter(pollduration); + composePollBinding.pollDuration.setSelection(4); + if (statusCompose != null && statusCompose.poll != null && statusCompose.poll.options != null) { + int i = 1; + for (Poll.PollItem pollItem : statusCompose.poll.options) { + if (i == 1) { + if (statusCompose.poll.multiple) + composePollBinding.option1.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_multiple); + if (pollItem.title != null) + composePollBinding.option1.text.setText(pollItem.title); + } else if (i == 2) { + if (statusCompose.poll.multiple) + composePollBinding.option2.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_multiple); + if (pollItem.title != null) + composePollBinding.option2.text.setText(pollItem.title); + } else { + + ComposePollItemBinding composePollItemBinding = ComposePollItemBinding.inflate(LayoutInflater.from(requireActivity()), new LinearLayout(requireActivity()), false); + if (composePollBinding.pollType.getCheckedButtonId() == R.id.poll_type_multiple) + composePollItemBinding.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_multiple); + else + composePollItemBinding.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_single); + + composePollItemBinding.text.setFilters(fArray); + composePollItemBinding.textLayout.setHint(getString(R.string.poll_choice_s, (pollCountItem[0] + 1))); + composePollItemBinding.text.setText(pollItem.title); + composePollBinding.optionsList.addView(composePollItemBinding.getRoot()); + composePollItemBinding.buttonRemove.setOnClickListener(view -> { + composePollBinding.optionsList.removeView(view); + pollCountItem[0]--; + }); + pollCountItem[0]++; + } + i++; + } + if (statusCompose.poll.options.size() >= max_entry) { + composePollBinding.buttonAddOption.setVisibility(View.GONE); + } + switch (statusCompose.poll.expire_in) { + case 300: + composePollBinding.pollDuration.setSelection(0); + break; + case 1800: + composePollBinding.pollDuration.setSelection(1); + break; + case 3600: + composePollBinding.pollDuration.setSelection(2); + break; + case 21600: + composePollBinding.pollDuration.setSelection(3); + break; + case 86400: + composePollBinding.pollDuration.setSelection(4); + break; + case 259200: + composePollBinding.pollDuration.setSelection(5); + break; + case 604800: + composePollBinding.pollDuration.setSelection(6); + break; + } + if (statusCompose.poll.multiple) + composePollBinding.pollType.check(R.id.poll_type_multiple); + else + composePollBinding.pollType.check(R.id.poll_type_single); + + + } + alertPoll.setNegativeButton(R.string.delete, (dialog, whichButton) -> { + if (statusCompose != null && statusCompose.poll != null) statusCompose.poll = null; + buttonState(); + dialog.dismiss(); + }); + alertPoll.setPositiveButton(R.string.save, null); + final AlertDialog alertPollDiaslog = alertPoll.create(); + alertPollDiaslog.setOnShowListener(dialog -> { + composePollBinding.pollType.addOnButtonCheckedListener((group, checkedId, isChecked) -> { + if (isChecked) { + if (checkedId == R.id.poll_type_single) { + if (statusCompose != null && statusCompose.poll != null) + statusCompose.poll.multiple = false; + for (int i = 0; i < composePollBinding.optionsList.getChildCount(); i++) { + ComposePollItemBinding child = ComposePollItemBinding.bind(composePollBinding.optionsList.getChildAt(i)); + child.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_single); + } + } else if (checkedId == R.id.poll_type_multiple) { + if (statusCompose != null && statusCompose.poll != null) + statusCompose.poll.multiple = true; + for (int i = 0; i < composePollBinding.optionsList.getChildCount(); i++) { + ComposePollItemBinding child = ComposePollItemBinding.bind(composePollBinding.optionsList.getChildAt(i)); + child.typeIndicator.setImageResource(R.drawable.ic_compose_poll_option_mark_multiple); + } + } + } + }); + Button b = alertPollDiaslog.getButton(AlertDialog.BUTTON_POSITIVE); + b.setOnClickListener(view1 -> { + int poll_duration_pos = composePollBinding.pollDuration.getSelectedItemPosition(); + + int selected_poll_type_id = composePollBinding.pollType.getCheckedButtonId(); + String choice1 = composePollBinding.option1.text.getText().toString().trim(); + String choice2 = composePollBinding.option2.text.getText().toString().trim(); + + if (choice1.isEmpty() && choice2.isEmpty()) { + Toasty.error(requireActivity(), getString(R.string.poll_invalid_choices), Toasty.LENGTH_SHORT).show(); + } else if (statusCompose != null) { + statusCompose.poll = new Poll(); + statusCompose.poll.multiple = selected_poll_type_id == R.id.poll_type_multiple; + int expire; + switch (poll_duration_pos) { + case 0: + expire = 300; + break; + case 1: + expire = 1800; + break; + case 2: + expire = 3600; + break; + case 3: + expire = 21600; + break; + case 4: + expire = 86400; + break; + case 5: + expire = 259200; + break; + case 6: + expire = 604800; + break; + default: + expire = 864000; + } + statusCompose.poll.expire_in = expire; + List pollItems = new ArrayList<>(); + int childCount = composePollBinding.optionsList.getChildCount(); + for (int i = 0; i < childCount; i++) { + Poll.PollItem pollItem = new Poll.PollItem(); + AppCompatEditText title = (composePollBinding.optionsList.getChildAt(i)).findViewById(R.id.text); + pollItem.title = title.getText().toString(); + pollItems.add(pollItem); + } + List options = new ArrayList<>(); + boolean doubleTitle = false; + for (Poll.PollItem po : pollItems) { + if (!options.contains(po.title.trim())) { + options.add(po.title.trim()); + } else { + doubleTitle = true; + } + } + if (!doubleTitle) { + statusCompose.poll.options = pollItems; + dialog.dismiss(); + } else { + Toasty.error(requireActivity(), getString(R.string.poll_duplicated_entry), Toasty.LENGTH_SHORT).show(); + } + } + binding.buttonPoll.setVisibility(View.VISIBLE); + buttonState(); + }); + }); + + alertPollDiaslog.show(); + } + + + private void initiliazeStatus() { + statusCompose = new Status(); + binding.text.setText(""); + binding.attachmentsListContainer.removeAllViews(); + if (statuses != null && statuses.size() > 0) { + binding.recyclerView.scrollToPosition(statuses.size() - 1); + Status lastStatus = statuses.get(statuses.size() - 1); + statusCompose.in_reply_to_id = lastStatus.id; + statusCompose.visibility = "direct"; + statusCompose.mentions = new ArrayList<>(); + if (lastStatus.account.acct != null && currentAccount.mastodon_account != null && !lastStatus.account.acct.equalsIgnoreCase(currentAccount.mastodon_account.acct)) { + Mention mention = new Mention(); + mention.acct = "@" + lastStatus.account.acct; + mention.url = lastStatus.account.url; + mention.username = lastStatus.account.username; + statusCompose.mentions.add(mention); + } + //There are other mentions to + if (lastStatus.mentions != null && lastStatus.mentions.size() > 0) { + for (Mention mentionTmp : lastStatus.mentions) { + if (currentAccount.mastodon_account != null && !mentionTmp.acct.equalsIgnoreCase(currentAccount.mastodon_account.acct)) { + statusCompose.mentions.add(mentionTmp); + } + } + } + } + manageMentions(statusCompose); + } + + /** + * Manage mentions displayed when replying to a message + * + * @param statusCompose {@link Status} - Status that user is replying + */ + private void manageMentions(Status statusCompose) { + + if (statusCompose.mentions != null && (statusCompose.text == null || statusCompose.text.length() == 0) && statusCompose.mentions.size() > 0) { + //Retrieves mentioned accounts + OP and adds them at the beginin of the toot + final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); + Mention inReplyToUser; + inReplyToUser = statusCompose.mentions.get(0); + if (statusCompose.text == null) { + statusCompose.text = ""; + } + //Put other accounts mentioned at the bottom + boolean capitalize = sharedpreferences.getBoolean(getString(R.string.SET_CAPITALIZE), true); + boolean mentionsAtTop = sharedpreferences.getBoolean(getString(R.string.SET_MENTIONS_AT_TOP), false); + + if (inReplyToUser != null) { + if (capitalize && !mentionsAtTop) { + statusCompose.text = inReplyToUser.acct.startsWith("@") ? inReplyToUser.acct + "\n" : "@" + inReplyToUser.acct + "\n"; + } else { + statusCompose.text = inReplyToUser.acct.startsWith("@") ? inReplyToUser.acct + " " : "@" + inReplyToUser.acct + " "; + } + } + binding.text.setText(statusCompose.text); + if (statusCompose.mentions.size() > 1) { + if (!mentionsAtTop) { + statusCompose.text += "\n"; + } + for (int i = 1; i < statusCompose.mentions.size(); i++) { + String tootTemp = String.format("@%s ", statusCompose.mentions.get(i).acct); + statusCompose.text = String.format("%s ", (statusCompose.text + tootTemp.trim())); + } + } + binding.text.setText(statusCompose.text); + binding.text.requestFocus(); + binding.text.post(() -> { + binding.text.setSelection(statusCompose.text.length()); //Put cursor at the end + }); + } else { + binding.text.requestFocus(); + } + + } + + /** + * Manage the actions when picking up a media + * + * @param type - type of media in the list of {@link ComposeActivity.mediaType} + */ + private void pickupMedia(ComposeActivity.mediaType type) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { + if (ContextCompat.checkSelfPermission(requireActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != + PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); + return; + } + } + Intent intent; + intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + String[] mimetypes = new String[0]; + if (type == ComposeActivity.mediaType.PHOTO) { + if (instanceInfo != null && instanceInfo.getMimeTypeImage() != null && instanceInfo.getMimeTypeImage().size() > 0) { + mimetypes = instanceInfo.getMimeTypeImage().toArray(new String[0]); + } else { + mimetypes = new String[]{"image/*"}; + } + } else if (type == ComposeActivity.mediaType.VIDEO) { + if (instanceInfo != null && instanceInfo.getMimeTypeVideo() != null && instanceInfo.getMimeTypeVideo().size() > 0) { + mimetypes = instanceInfo.getMimeTypeVideo().toArray(new String[0]); + } else { + mimetypes = new String[]{"video/*"}; + } + } else if (type == ComposeActivity.mediaType.AUDIO) { + if (instanceInfo != null && instanceInfo.getMimeTypeAudio() != null && instanceInfo.getMimeTypeAudio().size() > 0) { + mimetypes = instanceInfo.getMimeTypeAudio().toArray(new String[0]); + } else { + mimetypes = new String[]{"audio/mpeg", "audio/opus", "audio/flac", "audio/wav", "audio/ogg"}; + } + } else if (type == ComposeActivity.mediaType.ALL) { + if (instanceInfo != null && instanceInfo.getMimeTypeOther() != null && instanceInfo.getMimeTypeOther().size() > 0) { + mimetypes = instanceInfo.getMimeTypeOther().toArray(new String[0]); + } else { + mimetypes = new String[]{"*/*"}; + } + } + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); + requireActivity().startActivityForResult(intent, (ComposeActivity.PICK_MEDIA)); + } + + + /** + * Add an attachment from ComposeActivity + * + * @param uris List - uris of the media + */ + public void addAttachment(List uris) { + Helper.createAttachmentFromUri(requireActivity(), uris, attachments -> { + if (statusCompose.media_attachments == null) { + statusCompose.media_attachments = new ArrayList<>(); + } + statusCompose.media_attachments.addAll(attachments); + if (statusCompose.media_attachments.size() > 0) { + displayAttachments(statusCompose.media_attachments.size() - 1); + } + }); + } + + /** + * Display attachment for a holder + */ + private void displayAttachments(int scrollToMediaPosition) { + if (statusCompose != null && statusCompose.media_attachments != null) { + binding.attachmentsList.removeAllViews(); + List attachmentList = statusCompose.media_attachments; + if (attachmentList != null && attachmentList.size() > 0) { + int mediaPosition = 0; + for (Attachment attachment : attachmentList) { + ComposeAttachmentItemBinding composeAttachmentItemBinding = ComposeAttachmentItemBinding.inflate(LayoutInflater.from(requireActivity()), binding.attachmentsList, false); + composeAttachmentItemBinding.buttonPlay.setVisibility(View.GONE); + /* if (editMessageId != null && attachment.url != null) { + composeAttachmentItemBinding.editPreview.setVisibility(View.GONE); + composeAttachmentItemBinding.buttonDescription.setVisibility(View.INVISIBLE); + composeAttachmentItemBinding.buttonOrderDown.setVisibility(View.INVISIBLE); + composeAttachmentItemBinding.buttonOrderUp.setVisibility(View.INVISIBLE); + }*/ + String attachmentPath = attachment.local_path != null && !attachment.local_path.trim().isEmpty() ? attachment.local_path : attachment.preview_url; + if (attachment.type != null || attachment.mimeType != null) { + if ((attachment.type != null && attachment.type.toLowerCase().startsWith("image")) || (attachment.mimeType != null && attachment.mimeType.toLowerCase().startsWith("image"))) { + Glide.with(composeAttachmentItemBinding.preview.getContext()) + .load(attachmentPath) + //.diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + .into(composeAttachmentItemBinding.preview); + } else if ((attachment.type != null && attachment.type.toLowerCase().startsWith("video")) || (attachment.mimeType != null && attachment.mimeType.toLowerCase().startsWith("video"))) { + composeAttachmentItemBinding.buttonPlay.setVisibility(View.VISIBLE); + long interval = 2000; + RequestOptions options = new RequestOptions().frame(interval); + Glide.with(composeAttachmentItemBinding.preview.getContext()).asBitmap() + .load(attachmentPath) + .apply(options) + .into(composeAttachmentItemBinding.preview); + } else if ((attachment.type != null && attachment.type.toLowerCase().startsWith("audio")) || (attachment.mimeType != null && attachment.mimeType.toLowerCase().startsWith("audio"))) { + Glide.with(composeAttachmentItemBinding.preview.getContext()) + .load(R.drawable.ic_baseline_audio_file_24) + .into(composeAttachmentItemBinding.preview); + } else { + Glide.with(composeAttachmentItemBinding.preview.getContext()) + .load(R.drawable.ic_baseline_insert_drive_file_24) + .into(composeAttachmentItemBinding.preview); + } + } else { + Glide.with(composeAttachmentItemBinding.preview.getContext()) + .load(R.drawable.ic_baseline_insert_drive_file_24) + .into(composeAttachmentItemBinding.preview); + } + if (mediaPosition == 0) { + composeAttachmentItemBinding.buttonOrderUp.setVisibility(View.INVISIBLE); + } else { + composeAttachmentItemBinding.buttonOrderUp.setVisibility(View.VISIBLE); + } + if (mediaPosition == attachmentList.size() - 1) { + composeAttachmentItemBinding.buttonOrderDown.setVisibility(View.INVISIBLE); + } else { + composeAttachmentItemBinding.buttonOrderDown.setVisibility(View.VISIBLE); + } + //Remote attachments when deleting/redrafting can't be ordered + if (attachment.local_path == null) { + composeAttachmentItemBinding.buttonOrderUp.setVisibility(View.INVISIBLE); + composeAttachmentItemBinding.buttonOrderDown.setVisibility(View.INVISIBLE); + } + int finalMediaPosition = mediaPosition; + if (attachment.local_path != null && (attachment.local_path.endsWith("png") || attachment.local_path.endsWith("jpg") || attachment.local_path.endsWith("jpeg"))) { + composeAttachmentItemBinding.editPreview.setVisibility(View.VISIBLE); + } else { + composeAttachmentItemBinding.editPreview.setVisibility(View.GONE); + } + composeAttachmentItemBinding.editPreview.setOnClickListener(v -> { + Intent intent = new Intent(requireActivity(), EditImageActivity.class); + Bundle b = new Bundle(); + intent.putExtra("imageUri", attachment.local_path); + intent.putExtras(b); + startActivity(intent); + }); + composeAttachmentItemBinding.buttonDescription.setOnClickListener(v -> { + AlertDialog.Builder builderInner = new MaterialAlertDialogBuilder(requireActivity()); + // builderInner.setTitle(R.string.upload_form_description); + PopupMediaDescriptionBinding popupMediaDescriptionBinding = PopupMediaDescriptionBinding.inflate(LayoutInflater.from(requireActivity()), null, false); + builderInner.setView(popupMediaDescriptionBinding.getRoot()); + + popupMediaDescriptionBinding.mediaDescription.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1500)}); + popupMediaDescriptionBinding.mediaDescription.requestFocus(); + Glide.with(popupMediaDescriptionBinding.mediaPicture.getContext()) + .asBitmap() + .load(attachmentPath) + .into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition transition) { + popupMediaDescriptionBinding.mediaPicture.setImageBitmap(resource); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + super.onLoadFailed(errorDrawable); + } + }); + builderInner.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + if (attachment.description != null) { + popupMediaDescriptionBinding.mediaDescription.setText(attachment.description); + popupMediaDescriptionBinding.mediaDescription.setSelection(popupMediaDescriptionBinding.mediaDescription.getText().length()); + } + builderInner.setPositiveButton(R.string.validate, (dialog, which) -> { + attachment.description = popupMediaDescriptionBinding.mediaDescription.getText().toString(); + displayAttachments(finalMediaPosition); + dialog.dismiss(); + }); + AlertDialog alertDialog = builderInner.create(); + Objects.requireNonNull(alertDialog.getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + alertDialog.show(); + popupMediaDescriptionBinding.mediaDescription.requestFocus(); + + }); + + composeAttachmentItemBinding.buttonOrderUp.setOnClickListener(v -> { + if (finalMediaPosition > 0 && attachmentList.size() > 1) { + Attachment at1 = attachmentList.get(finalMediaPosition); + Attachment at2 = attachmentList.get(finalMediaPosition - 1); + attachmentList.set(finalMediaPosition - 1, at1); + attachmentList.set(finalMediaPosition, at2); + displayAttachments(finalMediaPosition - 1); + } + }); + composeAttachmentItemBinding.buttonOrderDown.setOnClickListener(v -> { + if (finalMediaPosition < (attachmentList.size() - 1) && attachmentList.size() > 1) { + Attachment at1 = attachmentList.get(finalMediaPosition); + Attachment at2 = attachmentList.get(finalMediaPosition + 1); + attachmentList.set(finalMediaPosition, at2); + attachmentList.set(finalMediaPosition + 1, at1); + displayAttachments(finalMediaPosition + 1); + } + }); + composeAttachmentItemBinding.buttonRemove.setOnClickListener(v -> { + AlertDialog.Builder builderInner = new MaterialAlertDialogBuilder(requireActivity()); + builderInner.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + builderInner.setPositiveButton(R.string.delete, (dialog, which) -> { + attachmentList.remove(attachment); + displayAttachments(finalMediaPosition); + new Thread(() -> { + if (attachment.local_path != null) { + File fileToDelete = new File(attachment.local_path); + if (fileToDelete.exists()) { + //noinspection ResultOfMethodCallIgnored + fileToDelete.delete(); + } + } + }).start(); + + }); + builderInner.setMessage(R.string.toot_delete_media); + builderInner.show(); + }); + composeAttachmentItemBinding.preview.setOnClickListener(v -> displayAttachments(finalMediaPosition)); + if (attachment.description == null || attachment.description.trim().isEmpty()) { + composeAttachmentItemBinding.buttonDescription.setChipIconResource(R.drawable.ic_baseline_warning_24); + composeAttachmentItemBinding.buttonDescription.setTextColor(ContextCompat.getColor(requireActivity(), R.color.black)); + composeAttachmentItemBinding.buttonDescription.setChipIconTintResource(R.color.black); + composeAttachmentItemBinding.buttonDescription.setChipBackgroundColor(ThemeHelper.getNoDescriptionColorStateList(requireActivity())); + } else { + composeAttachmentItemBinding.buttonDescription.setChipIconResource(R.drawable.ic_baseline_check_circle_24); + composeAttachmentItemBinding.buttonDescription.setTextColor(ContextCompat.getColor(requireActivity(), R.color.white)); + composeAttachmentItemBinding.buttonDescription.setChipIconTintResource(R.color.white); + composeAttachmentItemBinding.buttonDescription.setChipBackgroundColor(ThemeHelper.getHavingDescriptionColorStateList(requireActivity())); + } + binding.attachmentsList.addView(composeAttachmentItemBinding.getRoot()); + mediaPosition++; + } + binding.attachmentsList.setVisibility(View.VISIBLE); + if (scrollToMediaPosition >= 0 && binding.attachmentsList.getChildCount() < scrollToMediaPosition) { + binding.attachmentsList.requestChildFocus(binding.attachmentsList.getChildAt(scrollToMediaPosition), binding.attachmentsList.getChildAt(scrollToMediaPosition)); + } + } else { + binding.attachmentsList.setVisibility(View.GONE); + } + } else { + binding.attachmentsList.setVisibility(View.GONE); + } + buttonState(); + } + + + /** + * Manage state of media and poll button + */ + private void buttonState() { + if (BaseMainActivity.software == null || BaseMainActivity.software.toUpperCase().compareTo("MASTODON") == 0) { + if (statusCompose.poll == null) { + binding.buttonAttachImage.setEnabled(true); + binding.buttonAttachVideo.setEnabled(true); + binding.buttonAttachAudio.setEnabled(true); + binding.buttonAttachManual.setEnabled(true); + } else { + binding.buttonAttachImage.setEnabled(false); + binding.buttonAttachVideo.setEnabled(false); + binding.buttonAttachAudio.setEnabled(false); + binding.buttonAttachManual.setEnabled(false); + binding.buttonPoll.setEnabled(true); + } + binding.buttonPoll.setEnabled(statusCompose.media_attachments == null || statusCompose.media_attachments.size() <= 0); + } + } + + /** + * Intialize the common view for the context + * + * @param context {@link Context} + */ + private void initializeContextView(final Context context) { + + if (context == null) { + Helper.sendToastMessage(requireActivity(), Helper.RECEIVE_TOAST_TYPE_ERROR, getString(R.string.toast_error)); + return; + } + if (binding == null || !isAdded() || getActivity() == null) { + return; + } + if (pullToRefresh) { + pullToRefresh = false; + int size = this.statuses.size(); + statuses.clear(); + statusDirectMessageAdapter.notifyItemRangeRemoved(0, size); + statuses.add(focusedStatus); + } + if (context.ancestors.size() > 0) { + firstStatus = context.ancestors.get(0); + } else { + firstStatus = statuses.get(0); + } + if (firstMessage != null) { + firstMessage.get(firstStatus); + } + + int statusPosition = context.ancestors.size(); + //Build the array of statuses + statuses.addAll(0, context.ancestors); + statusDirectMessageAdapter.notifyItemRangeInserted(0, statusPosition); + statuses.addAll(statusPosition + 1, context.descendants); + statusDirectMessageAdapter.notifyItemRangeInserted(statusPosition + 1, context.descendants.size()); + binding.swipeContainer.setRefreshing(false); + initiliazeStatus(); + } + + public interface FirstMessage { + void get(Status status); + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java b/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java index 8596ade3..066d978e 100644 --- a/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java +++ b/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java @@ -166,7 +166,7 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { badgeCount = 0; headerMenuOpen = false; binding.navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); - + startInForeground(); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayShowTitleEnabled(false); } @@ -377,7 +377,7 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { peertubeInformation.setPrivacies(new LinkedHashMap<>()); peertubeInformation.setPlaylistPrivacies(new LinkedHashMap<>()); peertubeInformation.setTranslations(new LinkedHashMap<>()); - startInForeground(); + //noinspection ConstantConditions if (BuildConfig.FLAVOR.compareTo("playstore") == 0) { @@ -417,10 +417,13 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { private void startInForeground() { Intent notificationIntent = new Intent(this, RetrieveInfoService.class); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - startForegroundService(notificationIntent); - } else { - startService(notificationIntent); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(notificationIntent); + } else { + startService(notificationIntent); + } + } catch (Exception ignored) { } } diff --git a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java index 4c158990..7dfa4054 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java +++ b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java @@ -23,7 +23,7 @@ import android.database.sqlite.SQLiteOpenHelper; public class Sqlite extends SQLiteOpenHelper { - public static final int DB_VERSION = 9; + public static final int DB_VERSION = 10; public static final String DB_NAME = "fedilab_db"; //Table of owned accounts @@ -94,13 +94,16 @@ public class Sqlite extends SQLiteOpenHelper { public static final String COL_USER_INSTANCE = "USER_INSTANCE"; //Home fetch logs - public static final String TABLE_HOME_FETCH_LOGS = "TABLE_HOME_FETCH_LOGS"; + public static final String TABLE_HOME_FETCH_LOGS = "HOME_FETCH_LOGS"; public static final String COL_INSERTED = "INSERTED"; public static final String COL_UPDATED = "UPDATED"; public static final String COL_FAILED = "FAILED"; public static final String COL_FREQUENCY = "FREQUENCY"; public static final String COL_FETCHED_COUNT = "FETCHED_COUNT"; + public static final String TABLE_CACHE_TAGS = "CACHE_TAGS"; + public static final String COL_TAG = "TAG"; + private static final String CREATE_TABLE_USER_ACCOUNT = "CREATE TABLE " + TABLE_USER_ACCOUNT + " (" + COL_USER_ID + " TEXT NOT NULL, " @@ -211,6 +214,10 @@ public class Sqlite extends SQLiteOpenHelper { + COL_ABOUT + " TEXT NOT NULL, " + COL_USER_INSTANCE + " TEXT NOT NULL)"; + private final String CREATE_TABLE_CACHE_TAGS = "CREATE TABLE " + + TABLE_CACHE_TAGS + "(" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_TAG + " TEXT NOT NULL)"; public static SQLiteDatabase db; private static Sqlite sInstance; @@ -243,6 +250,7 @@ public class Sqlite extends SQLiteOpenHelper { db.execSQL(CREATE_DOMAINS_TRACKING); db.execSQL(CREATE_TABLE_MUTED); db.execSQL(CREATE_TABLE_STORED_INSTANCES); + db.execSQL(CREATE_TABLE_CACHE_TAGS); } @Override @@ -271,6 +279,8 @@ public class Sqlite extends SQLiteOpenHelper { db.execSQL(CREATE_TABLE_MUTED); case 8: db.execSQL(CREATE_TABLE_STORED_INSTANCES); + case 9: + db.execSQL(CREATE_TABLE_CACHE_TAGS); default: break; } diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/FragmentLoginMain.java b/app/src/main/java/app/fedilab/android/ui/fragment/FragmentLoginMain.java index 8ef6a8f3..87ab4bac 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/FragmentLoginMain.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/FragmentLoginMain.java @@ -25,6 +25,7 @@ import static app.fedilab.android.activities.LoginActivity.softwareLogin; import android.Manifest; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; @@ -43,9 +44,12 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.widget.PopupMenu; +import androidx.browser.customtabs.CustomTabColorSchemeParams; +import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.preference.PreferenceManager; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; @@ -60,6 +64,7 @@ import app.fedilab.android.mastodon.client.entities.app.Account; import app.fedilab.android.mastodon.client.entities.app.InstanceSocial; import app.fedilab.android.mastodon.helper.Helper; import app.fedilab.android.mastodon.helper.MastodonHelper; +import app.fedilab.android.mastodon.helper.ThemeHelper; import app.fedilab.android.mastodon.helper.ZipHelper; import app.fedilab.android.mastodon.viewmodel.mastodon.AppsVM; import app.fedilab.android.mastodon.viewmodel.mastodon.InstanceSocialVM; @@ -214,6 +219,10 @@ public class FragmentLoginMain extends Fragment { menuInflater.inflate(R.menu.main_login, popupMenu.getMenu()); MenuItem adminTabItem = popupMenu.getMenu().findItem(R.id.action_request_admin); adminTabItem.setChecked(requestedAdmin); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); + boolean customTab = sharedpreferences.getBoolean(getString(R.string.SET_CUSTOM_TABS), true); + popupMenu.getMenu().findItem(R.id.action_custom_tabs).setChecked(customTab); + popupMenu.setOnMenuItemClickListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.action_proxy) { @@ -242,6 +251,13 @@ public class FragmentLoginMain extends Fragment { } else { proceed(); } + } else if (itemId == R.id.action_custom_tabs) { + boolean newValue = !item.isChecked(); + item.setChecked(newValue); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putBoolean(getString(R.string.SET_CUSTOM_TABS), newValue); + editor.apply(); + return false; } return false; }); @@ -291,13 +307,26 @@ public class FragmentLoginMain extends Fragment { client_idLogin = app.client_id; client_secretLogin = app.client_secret; String redirectUrl = MastodonHelper.authorizeURL(currentInstanceLogin, client_idLogin, requestedAdmin); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setData(Uri.parse(redirectUrl)); - try { - startActivity(intent); - } catch (Exception e) { - Toasty.error(requireActivity(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); + boolean customTab = sharedpreferences.getBoolean(getString(R.string.SET_CUSTOM_TABS), true); + if (customTab) { + CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); + int colorInt = ThemeHelper.getAttColor(requireActivity(), R.attr.statusBar); + CustomTabColorSchemeParams defaultColors = new CustomTabColorSchemeParams.Builder() + .setToolbarColor(colorInt) + .build(); + builder.setDefaultColorSchemeParams(defaultColors); + CustomTabsIntent customTabsIntent = builder.build(); + customTabsIntent.launchUrl(requireActivity(), Uri.parse(redirectUrl)); + } else { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setData(Uri.parse(redirectUrl)); + try { + startActivity(intent); + } catch (Exception e) { + Toasty.error(requireActivity(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + } } } else { Toasty.error(requireActivity(), getString(R.string.client_error), Toasty.LENGTH_SHORT).show(); diff --git a/app/src/main/res/drawables/mastodon/drawable/browser_calls_blocked.xml b/app/src/main/res/drawables/mastodon/drawable/browser_calls_blocked.xml deleted file mode 100644 index 783a0a05..00000000 --- a/app/src/main/res/drawables/mastodon/drawable/browser_calls_blocked.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawables/mastodon/drawable/bubble_left.xml b/app/src/main/res/drawables/mastodon/drawable/bubble_left.xml new file mode 100644 index 00000000..125d8c6b --- /dev/null +++ b/app/src/main/res/drawables/mastodon/drawable/bubble_left.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawables/mastodon/drawable/bubble_left_tail.xml b/app/src/main/res/drawables/mastodon/drawable/bubble_left_tail.xml new file mode 100644 index 00000000..3cec7803 --- /dev/null +++ b/app/src/main/res/drawables/mastodon/drawable/bubble_left_tail.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawables/mastodon/drawable/bubble_right.xml b/app/src/main/res/drawables/mastodon/drawable/bubble_right.xml new file mode 100644 index 00000000..4ada7ec4 --- /dev/null +++ b/app/src/main/res/drawables/mastodon/drawable/bubble_right.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawables/mastodon/drawable/bubble_right_tail.xml b/app/src/main/res/drawables/mastodon/drawable/bubble_right_tail.xml new file mode 100644 index 00000000..b87980d6 --- /dev/null +++ b/app/src/main/res/drawables/mastodon/drawable/bubble_right_tail.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/activity_camel_tag.xml b/app/src/main/res/layouts/mastodon/layout/activity_camel_tag.xml new file mode 100644 index 00000000..43a1d5aa --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/activity_camel_tag.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/activity_direct_message.xml b/app/src/main/res/layouts/mastodon/layout/activity_direct_message.xml new file mode 100644 index 00000000..bf6a5933 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/activity_direct_message.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/drawer_status.xml b/app/src/main/res/layouts/mastodon/layout/drawer_status.xml index 7428ebd3..bf55ec3d 100644 --- a/app/src/main/res/layouts/mastodon/layout/drawer_status.xml +++ b/app/src/main/res/layouts/mastodon/layout/drawer_status.xml @@ -455,24 +455,17 @@ android:orientation="vertical" android:visibility="gone" /> - + android:visibility="gone" /> - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/drawer_status_compose.xml b/app/src/main/res/layouts/mastodon/layout/drawer_status_compose.xml index 0ad55de1..1c54a62f 100644 --- a/app/src/main/res/layouts/mastodon/layout/drawer_status_compose.xml +++ b/app/src/main/res/layouts/mastodon/layout/drawer_status_compose.xml @@ -77,7 +77,7 @@ android:focusable="true" android:gravity="top|start" android:inputType="textMultiLine|textCapSentences" - android:minLines="8" + android:minLines="10" app:layout_constraintEnd_toStartOf="@id/button_emoji" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/content_spoiler" /> diff --git a/app/src/main/res/layouts/mastodon/layout/drawer_tag_edit.xml b/app/src/main/res/layouts/mastodon/layout/drawer_tag_edit.xml new file mode 100644 index 00000000..429180ca --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/drawer_tag_edit.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/fragment_direct_message.xml b/app/src/main/res/layouts/mastodon/layout/fragment_direct_message.xml new file mode 100644 index 00000000..09b819bd --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/fragment_direct_message.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layouts/mastodon/layout/layout_bottom_compose.xml b/app/src/main/res/layouts/mastodon/layout/layout_bottom_compose.xml new file mode 100644 index 00000000..a7911056 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/layout_bottom_compose.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layouts/mastodon/layout/layout_drawer_attachments.xml b/app/src/main/res/layouts/mastodon/layout/layout_drawer_attachments.xml new file mode 100644 index 00000000..35eb0d37 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/layout/layout_drawer_attachments.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/layout_media.xml b/app/src/main/res/layouts/mastodon/layout/layout_media.xml index d1000e1f..b92359f2 100644 --- a/app/src/main/res/layouts/mastodon/layout/layout_media.xml +++ b/app/src/main/res/layouts/mastodon/layout/layout_media.xml @@ -4,13 +4,15 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/media_root" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="match_parent"> - \ No newline at end of file diff --git a/app/src/main/res/layouts/mastodon/layout/layout_poll.xml b/app/src/main/res/layouts/mastodon/layout/layout_poll.xml index 83d7065f..b5b94cb2 100644 --- a/app/src/main/res/layouts/mastodon/layout/layout_poll.xml +++ b/app/src/main/res/layouts/mastodon/layout/layout_poll.xml @@ -67,6 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:alpha="0.7" + android:id="@+id/refresh" android:text="@string/tap_here_to_refresh_poll" tools:ignore="HardcodedText" /> diff --git a/app/src/main/res/menus/mastodon/menu/main_login.xml b/app/src/main/res/menus/mastodon/menu/main_login.xml index cbfb46fe..30b14748 100644 --- a/app/src/main/res/menus/mastodon/menu/main_login.xml +++ b/app/src/main/res/menus/mastodon/menu/main_login.xml @@ -1,17 +1,7 @@ - - + + diff --git a/app/src/main/res/menus/mastodon/menu/main_webview.xml b/app/src/main/res/menus/mastodon/menu/main_webview.xml index abc6b247..d9977f82 100644 --- a/app/src/main/res/menus/mastodon/menu/main_webview.xml +++ b/app/src/main/res/menus/mastodon/menu/main_webview.xml @@ -1,14 +1,9 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/menus/mastodon/menu/menu_compose.xml b/app/src/main/res/menus/mastodon/menu/menu_compose.xml index 8fc21461..74ed80b4 100644 --- a/app/src/main/res/menus/mastodon/menu/menu_compose.xml +++ b/app/src/main/res/menus/mastodon/menu/menu_compose.xml @@ -21,4 +21,10 @@ android:icon="@drawable/ic_baseline_schedule_send_24" android:title="@string/schedule" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 911fbf16..025a139b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -805,4 +805,5 @@ Ara ja pots connectar-te al compte escrivint %1$s en el primer camp i fen Un missatge que havies difós ha estat editat Una usuària ha denunciat SOCKS + "Imatge de perfil" \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 162a0c8f..53a81224 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1013,4 +1013,8 @@ Počet odpovědí Datum aktualizace Obrázek karty + Tag byl změněn! + Tag byl odstraněn! + Tag byl uložen! + Spravovat tagy \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6685b087..efe49821 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1003,4 +1003,8 @@ Datum der Aktualisierung Angeheftet Bild der Karte + Der Hashtag wurde gespeichert! + Der Hashtag wurde geändert! + Der Hashtag wurde entfernt! + Hashtags verwalten \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 4b415865..1a4a12be 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -989,4 +989,12 @@ Recùpera in automàticu is messàgios de sa lìnia printzipale Mentovos in pitzos Rispondende, is mentovos s\'ant a annànghere a su cumintzu de su messàgiu + S\'eticheta est istada bogada! + S\'eticheta est istada archiviada! + Amministra is etichetas + Apicadu + Nùmeru de mèdios + S\'eticheta est istada modificada! + Nùmeru de rispostas + Data de atualizatzione \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d5a731c8..d424306d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1001,4 +1001,8 @@ Yanıt sayısı Sabitlendi Güncelleme tarihi + Etiket değiştirildi! + Etiket kaldırıldı! + Etiket kaydedildi! + Etiketleri yönet \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1afdd77e..bc7ab021 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -60,7 +60,7 @@ 定时消息 以下信息可能无法完整反映用户的个人资料。 插入表情符号 - 该应用程序暂时不收集自定义表情符号。 + 应用暂时未收集自定义表情符号。 您确定要注销@%1$s@%2$s 吗? 没有要显示的消息 @@ -74,7 +74,7 @@ 删除 复制 分享 - 提到 + 提及 定时静音 删除并重新起草 @@ -129,9 +129,9 @@ 没有可用的描述! - 发行版 %1$s - 开发商: - 许可: + 发行版本 %1$s + 开发者: + 许可证: GNU GPL V3 源代码: 搜索实例: @@ -159,7 +159,7 @@ \n 点击此处取消帐号静音。 没有可显示的通知 - 提到你 + 提及了您 写了一条新消息 转发了你的状态 喜欢你的状态 @@ -182,7 +182,7 @@ 该消息已添加到您的收藏夹! 该消息已从您的收藏夹中删除! 哎呀!发生错误! - 发生错误!该实例未返回授权码! + 发生错误!实例未返回授权码! 实例域名似乎无效! 在帐号之间切换时发生错误! 搜索时出错! @@ -194,7 +194,7 @@ 当有人关注你时通知 当有人提升您的地位时通知 当有人收藏您的状态时通知 - 当有人提到你时通知 + 当有人提及你时通知 投票结束时通知 通知新职位 转发前显示确认对话框 @@ -242,7 +242,7 @@ 关键词 关键字… - 公开 + 公共 不公开 私密 私信 @@ -274,7 +274,7 @@ 在此实例上未找到时间线! 关注实例 您已经关注了这个实例! - 伙伴关系 + 合作伙伴 隐藏来自 %s 的转发 个人资料上的功能 显示来自 %s 的转发 @@ -283,17 +283,17 @@ 过滤器 无过滤器可显示。您可以通过点击“+”按钮创建一个。 关键字或词组 - 主页时间轴 - 公共时间表 + 主页时间线 + 公共时间线 通知 对话 无论文本中的大小写或消息的内容警告都会被匹配 放下而不是隐藏 过滤后的消息将不可逆转地消失,即使过滤器稍后被删除 当关键字或短语仅为字母数字时,只有在匹配整个单词时才会应用 - 整个词 - 过滤上下文 - 应应用过滤器的一个或多个上下文 + 全词匹配 + 过滤背景 + 一个或多个应适用于过滤器的背景 过期于 删除过滤器? 更新过滤器 @@ -364,7 +364,7 @@ 更改列名 Misskey 实例 热门 - 当地的 + 本地 类别 描述 分享 @@ -377,7 +377,7 @@ 登出帐号 全部 复制链接 - 应用程序阻止的 http 调用 + 应用阻止的 http 调用 被屏蔽的调用列表 提交 使用标签过滤时间线 @@ -463,18 +463,18 @@ 已吊销 权限 停用 - 沉默 + 禁言 帐号 - 撤消沉默 + 撤消禁言 撤消禁用 吊销 撤消吊销 声音的 语音留言 - 在时间段内,应用程序将发送通知。您可以使用右侧的微调器反转(即:静音)此时间段。 - 预览不会在时间轴中被裁剪 + 在时间段内,应用将发送通知。您可以使用右侧的微调器反转(即:静音)此时间段。 + 预览不会在时间线中被裁剪 在提及后自动插入换行符以将第一个字母大写 - 允许内容创建者将状态分享到他们的 RSS 提要 + 允许内容创作者将状态分享到他们的 RSS 订阅源中 撰写 选择 添加实例 @@ -505,7 +505,7 @@ 您的投票不能有重复的选项! 离开时清除缓存 - 离开应用程序时,缓存(媒体、缓存消息、来自内置浏览器的数据)将自动清除。 + 离开应用时,缓存(媒体、缓存消息、来自内置浏览器的数据)将自动清除。 您要取消关注此帐号吗? 取消关注前显示确认对话框 Medium @@ -552,12 +552,12 @@ 此实例在 https://instances.social 上不可用 显示完整链接 分享链接 - 使用其他应用程序打开 + 使用其他应用打开 检查重定向 此 URL 不重定向 %1$s \n\n重定向到\n\n %2$s 删除 UTM 参数 - 在访问链接之前,该应用程序会自动从 URL 中删除 UTM 参数。 + 在访问链接之前,应用会自动从 URL 中删除 UTM 参数。 %d 人正在讨论 Twitter 帐号(来自 Nitter) Twitter 用户名空格分隔 @@ -573,12 +573,12 @@ 以 MB 为单位的视频缓存,零表示没有缓存。 水印 自动在图片底部添加水印。可以为每个帐号自定义文本。 - 没有找到经销商! + 没有找到分发器! 您需要一个分发器来接收推送通知。 \n您可以在 %1$s 找到更多详细信息。 \n \n您也可以在设置中禁用推送通知以忽略该消息。 - 选择分销商 + 选择分发器 仍然显示 该消息已添加到您的书签! 图标尺寸 @@ -590,7 +590,7 @@ 删除时间线中的左边距以使消息更紧凑 翻译器 翻译器 API 密钥 - 通过启用该选项,该应用程序将显示额外的功能。此功能适用于 Pleroma、Akkoma 或 Glitch Social 等社交软件 + 通过启用该选项,该应用将显示额外的功能。此功能适用于 Pleroma、Akkoma 或 Glitch Social 等社交软件 通知声音 禁用通知 选择主题的底色是深色还是浅色 @@ -641,20 +641,20 @@ 已确认 近期IP 重启 - 您应该重新启动应用程序以应用更改。 + 您应该重新启动应用以应用更改。 选择器中的语言 允许在撰写消息时减少选择器中的语言列表。 保留通知 通知更新 新注册(监察员) - 该应用程序未找到远程消息。 + 应用未找到远程消息。 已屏蔽域名 域名 使用默认系统语言 - 将在选项卡时间轴中显示新消息的气泡计数器 + 将在选项卡时间线中显示新消息的气泡计数器 %1$s 编辑了 %2$s 它只涉及“公共”回复。启用后,您的回复将自动具有“不公开”可见性,而不是“公开” - 帐号取消静音 + 帐号取消禁言 帐号被禁言 已过滤:%1$s 严重程度 @@ -667,7 +667,7 @@ 这是另一回事 列表名称无效! 找不到此列表的帐号! - 已定时 + 定时 通知已从缓存中删除。 您正在关注此帐号。要在您的主页中不再看到他们的帖子,请取消关注他们。 来自人们的更新 @@ -680,7 +680,7 @@ 选择一个图标 加载导出的设置 单操作栏 - 启用后,该应用程序将只有一个时间轴栏 + 启用后,应用将只有一个时间线栏 显示消息计数器 显示选项 显示计数器 @@ -692,7 +692,7 @@ 私人评论 评论此域名限制供监察员内部使用。 默认深色主题 - 启用后,时间轴中的项目将具有阴影和高程。 + 启用后,时间线中的项目将具有阴影和高程。 版本 您可以安全地将这些图标隐藏在底部以获得更多空间。它们也在子菜单中。 附加功能的图标 @@ -704,14 +704,14 @@ 使用缓存 删除固定的时间线? 域名 - 此域名屏蔽不会阻止在数据库中创建帐号条目,但会追溯并自动对这些帐号应用特定的审核方法。 + 域名屏蔽不会阻止在数据库中创建帐号条目,但会追溯并自动对这些帐号应用特定的审核方法。 正在关注 远程配置文件 您确定取消固定该时间线吗? 用另一个帐号打开 拒绝媒体 拒绝举报 - 沉默将使该帐号的帖子对任何未关注它们的人都是不可见的。吊销将删除帐号的所有内容、媒体和个人资料数据。如果您只想拒绝媒体文件,请勿使用。 + 禁言将使该帐号的帖子对任何未关注它们的人都是不可见的。吊销将删除帐号的所有内容、媒体和个人资料数据。如果您只想拒绝媒体文件,请勿使用。 拒绝媒体文件 忽略来自该域名的所有举报。与吊销无关 拒绝举报 @@ -728,7 +728,7 @@ 该问题不属于其他类别 导出设置 列表中的时间线 - 时间线将被缓存,因此应用程序会更快。 + 时间线将被缓存,因此应用会更快。 加载媒体缩略图 展示媒体 缓存消息 @@ -736,7 +736,7 @@ 开启时,应用会收起相关通知 在通知中显示媒体 更改图标 - 更改设备上应用程序的图标 + 更改设备上应用的图标 取消置顶消息 翻译信息 强制翻译成特定语言。选择第一个值以重置为设备设置 @@ -748,7 +748,7 @@ 已加入 警告 已举报状态 - 已沉默 + 已禁言 用户 监察员 分配给我 @@ -758,7 +758,7 @@ 帐号已禁用 举报 状态 - 重启应用程序? + 重启应用? 取消关注标签 您确定要取消关注此标签吗? 取消关注 @@ -776,14 +776,14 @@ 完全隐藏过滤后的内容,表现得好像不存在一样 主页和列表 标题 - 该应用程序找不到远程数据! + 应用找不到远程数据! 提交举报 发送举报 取消屏蔽域名 您没有屏蔽域名 您确定取消屏蔽 %1$s 吗? 隐私政策 - 删除固定的时间轴? + 删除固定的时间线? 未确认 告诉我们这个帖子是怎么回事 管理员 @@ -798,7 +798,7 @@ 解决 帐号已吊销 写下要关注的标签 - + 新增 为 Reddit 使用替代前端 Reddit 前端域名 Reddit @@ -820,14 +820,14 @@ 帐号可发现 文件缓存大小 导入设置 - 显示时间表 + 显示时间线 获取通知 打开原始消息 - 记住时间轴位置 + 记住时间线位置 将显示转发和收藏通知中的媒体 - 建议 + 推荐 列表 - 该应用程序将公开显示配置文件以获取所有消息。交互将需要一个额外的步骤来联合消息。 + 应用将公开显示配置文件以获取所有消息。交互将需要一个额外的步骤来联合消息。 仅限本地 用于媒体的 Pixelfed 演示文稿 紧凑操作按钮 @@ -960,11 +960,11 @@ 主页时间线的所有帐号都将被静音。 全部静音 导入数据 - 在主页时间线中群组转发 + 在主页时间线中聚合转发 管理帐号 删除左边距 翻译器 - 译者版 + 翻译器版本 额外功能 图标可见性 显示“引用”按钮 @@ -975,16 +975,16 @@ 自己 显示转发的原始日期 禁用发行说明 - 发布新版本时,您不会在应用程序内部收到提醒。 + 发布新版本时,您不会在应用内部收到提醒。 公式 - 写公式 + 撰写公式 数学格式 有链接预览时隐藏单个媒体 更改订阅的语言 过滤语言 翻译成 撰写 - 您的 Peertube 太旧,应用程序不支持。 + 您的 Peertube 太旧,应用不支持。 自定义时间线 关注者: 双因素身份验证令牌 @@ -993,7 +993,7 @@ 获取主页消息 主页获取延迟 获取主页消息每隔 - 自动获取缺失的消息 + 自动获取缺失消息 置顶提及 回复时提及将全部添加到消息的开头 已置顶 @@ -1001,4 +1001,8 @@ 回复数 更新日期 媒体数 + 该标签已更改! + 该标签已删除! + 该标签已储存! + 管理标签 \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7821d5dd..89f739b8 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -206,4 +206,8 @@ #BBD144 #46483B #000000 + + + #E0E0E0 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3dd4479b..8167f835 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -796,6 +796,7 @@ Fedilab + Lingva DeepL @@ -805,6 +806,7 @@ FEDILAB + LINGVA DEEPL @@ -900,374 +902,7 @@ szl sc - - aa - ab - ae - af - ak - am - an - ar - as - av - ay - az - ba - be - bg - bh - bi - bm - bn - bo - br - bs - ca - ce - ch - co - cr - cs - cu - cv - cy - da - de - dv - dz - ee - el - en - eo - es - et - eu - fa - ff - fi - fj - fo - fr - fy - ga - gd - gl - gu - gv - ha - he - hi - ho - hr - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - io - is - it - iu - ja - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ku - kv - kw - ky - la - lb - lg - li - ln - lo - lt - lu - lv - mg - mh - mi - mk - ml - mn - mr - ms - mt - my - na - nb - nd - ne - ng - nl - nn - no - nr - nv - ny - oc - oj - om - or - os - pa - pi - pl - ps - pt - qu - rm - rn - ro - ru - rw - sa - sc - sd - se - sg - si - sk - sl - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - tg - th - ti - tk - tl - tn - to - tr - ts - tt - tw - ty - ug - uk - ur - uz - ve - vi - vo - wa - wo - xh - yi - yo - za - zh - zu - - - Afaraf - аҧсуа бызшәа - avesta - Afrikaans - Akan - አማርኛ - aragonés - اللغة العربية - অসমীয়া - авар мацӀ - aymar aru - azərbaycan dili - башҡорт теле - беларуская мова - български език - भोजपुरी - Bislama - bamanankan - বাংলা - བོད་ཡིག - brezhoneg - bosanski jezik - Català - нохчийн мотт - Chamoru - corsu - ᓀᐦᐃᔭᐍᐏᐣ - čeština - ѩзыкъ словѣньскъ - чӑваш чӗлхи - Cymraeg - dansk - Deutsch - Dhivehi - རྫོང་ཁ - Eʋegbe - Ελληνικά - English - Esperanto - Español - eesti - euskara - فارسی - Fulfulde - suomi - Vakaviti - føroyskt - Français - Frysk - Gaeilge - Gàidhlig - galego - ગુજરાતી - Gaelg - هَوُسَ - עברית - हिन्दी - Hiri Motu - Hrvatski - Kreyòl ayisyen - magyar - Հայերեն - Otjiherero - Interlingua - Bahasa Indonesia - Interlingue - Asụsụ Igbo - ꆈꌠ꒿ Nuosuhxop - Iñupiaq - Ido - Íslenska - Italiano - ᐃᓄᒃᑎᑐᑦ - 日本語 - basa Jawa - ქართული - Kikongo - Gĩkũyũ - Kuanyama - қазақ тілі - kalaallisut - ខេមរភាសា - ಕನ್ನಡ - 한국어 - Kanuri - कश्मीरी - Kurmancî - коми кыв - Kernewek - Кыргызча - latine - Lëtzebuergesch - Luganda - Limburgs - Lingála - ພາສາ - lietuvių kalba - Tshiluba - latviešu valoda - fiteny malagasy - Kajin M̧ajeļ - te reo Māori - македонски јазик - മലയാളം - Монгол хэл - मराठी - Bahasa Melayu - Malti - ဗမာစာ - Ekakairũ Naoero - Norsk bokmål - isiNdebele - नेपाली - Owambo - Nederlands - Norsk Nynorsk - Norsk - isiNdebele - Diné bizaad - chiCheŵa - occitan - ᐊᓂᔑᓈᐯᒧᐎᓐ - Afaan Oromoo - ଓଡ଼ିଆ - ирон æвзаг - ਪੰਜਾਬੀ - पाऴि - Polski - پښتو - Português - Runa Simi - rumantsch grischun - Ikirundi - Română - Русский - Ikinyarwanda - संस्कृतम् - sardu - सिन्धी - Davvisámegiella - yângâ tî sängö - සිංහල - slovenčina - slovenščina - chiShona - Soomaaliga - Shqip - српски језик - SiSwati - Sesotho - Basa Sunda - Svenska - Kiswahili - தமிழ் - తెలుగు - тоҷикӣ - ไทย - ትግርኛ - Türkmen - Wikang Tagalog - Setswana - faka Tonga - Türkçe - Xitsonga - татар теле - Twi - Reo Tahiti - ئۇيغۇرچە‎ - Українська - اردو - Ўзбек - Tshivenḓa - Tiếng Việt - Volapük - walon - Wollof - isiXhosa - ייִדיש - Yorùbá - Saɯ cueŋƅ - 中文 - isiZulu - + en fr @@ -1396,6 +1031,8 @@ SET_DYNAMICCOLOR SET_CARDVIEW SET_CUSTOMIZE_LIGHT_COLORS + SET_CHAT_FOR_CONVERSATION + SET_CUSTOMIZE_LIGHT_COLORS_ACTION SET_CUSTOMIZE_DARK_COLORS SET_CUSTOMIZE_DARK_COLORS_ACTION @@ -1462,6 +1099,8 @@ SET_POST_FORMAT SET_COMPOSE_LOCAL_ONLY + lingva.ml + SET_TRANSLATOR_DOMAIN SET_TRANSLATOR SET_TRANSLATOR_VERSION @@ -1509,6 +1148,7 @@ SET_NITTER_HOST nitter.net SET_USE_CACHE + SET_CUSTOM_TABS SET_BIBLIOGRAM SET_BIBLIOGRAM_HOST bibliogram.art @@ -2256,4 +1896,11 @@ Number of media Number of replies Update date + + The tag has been changed! + The tag has been removed! + he tag has been stored! + Manage tags + + Translator domain \ No newline at end of file diff --git a/app/src/main/res/xml/pref_compose.xml b/app/src/main/res/xml/pref_compose.xml index 52fc8276..3eb2363d 100644 --- a/app/src/main/res/xml/pref_compose.xml +++ b/app/src/main/res/xml/pref_compose.xml @@ -47,8 +47,6 @@ app:title="@string/set_unlisted_replies" /> + + + Erzwungene Indexierung -- Eigener Browser erlaubt keinen Admin Kontext -- Einige Abstürze diff --git a/src/fdroid/fastlane/metadata/android/de/changelogs/435.txt b/src/fdroid/fastlane/metadata/android/de/changelogs/435.txt deleted file mode 100644 index 98483747..00000000 --- a/src/fdroid/fastlane/metadata/android/de/changelogs/435.txt +++ /dev/null @@ -1,9 +0,0 @@ -Hinzugefügt: -- Migration zu Material Design 3 -- 5 Designs (Hell, Dunkel, Solarized Hell/Dunkel, Schwarz) -- Automatischer Wechsel zwischen Hell/Dunkel -- Helles und dunkles Design mit zeitgesteuertem Wechsel -- Android 12+: Dynamische Farben - -Behoben: -- Sprünge in der Zeitleiste diff --git a/src/fdroid/fastlane/metadata/android/de/changelogs/436.txt b/src/fdroid/fastlane/metadata/android/de/changelogs/436.txt deleted file mode 100644 index 710fbbd9..00000000 --- a/src/fdroid/fastlane/metadata/android/de/changelogs/436.txt +++ /dev/null @@ -1,10 +0,0 @@ -Geändert: -- Integrierte Browser Unterstützung entfernt -- Mehr Platz zwischen den Aktionsschaltflächen in Nachrichten - -Behoben: -- Probleme mit der Textgröße -- Überlappende Texte -- Falscher Hintergrund für Solarized Schwarz -- Vertauschung zwischen hellem und dunklem Design -- Speichern Schaltfläche versteckt diff --git a/src/fdroid/fastlane/metadata/android/de/changelogs/455.txt b/src/fdroid/fastlane/metadata/android/de/changelogs/455.txt deleted file mode 100644 index fa1fe51d..00000000 --- a/src/fdroid/fastlane/metadata/android/de/changelogs/455.txt +++ /dev/null @@ -1,9 +0,0 @@ -Hinzugefügt: -- DeepL Übersetzung unterstützt Free/Pro-Tasten - -Geändert: -- Schaltflächen für Medien beim Bearbeiten ausblenden - -Behoben: -- GIFs werden als statische Bilder geladen -- Vorgeschlagene Konten können nicht verfolgt werden diff --git a/src/fdroid/fastlane/metadata/android/de/changelogs/456.txt b/src/fdroid/fastlane/metadata/android/de/changelogs/456.txt deleted file mode 100644 index 41166966..00000000 --- a/src/fdroid/fastlane/metadata/android/de/changelogs/456.txt +++ /dev/null @@ -1,10 +0,0 @@ -Geändert: -- Ausgeblendete Medien mit Vorschaubildern - -Behoben: -- Problem mit Medien für Android 11+ -- Absturz, wenn kein Übersetzungsschlüssel gesetzt wurde -- Behoben DeepL für API pro -- Absturz beim Besuch eines Profils mit vielen Medien -- Stummgeschaltete Konten funktionieren nicht ohne Filter -- Animierte benutzerdefinierte Emoji werden nicht angezeigt diff --git a/src/fdroid/fastlane/metadata/android/de/changelogs/457.txt b/src/fdroid/fastlane/metadata/android/de/changelogs/457.txt deleted file mode 100644 index d1e37186..00000000 --- a/src/fdroid/fastlane/metadata/android/de/changelogs/457.txt +++ /dev/null @@ -1,14 +0,0 @@ -Hinzugefügt: -- Zusätzliche Funktionen in den Einstellungen -- Anpassbare Einstellungen für zusätzliche Funktionen -- Unterstützung von Zitaten, Reaktionen mit Nachrichten -- Unterstützung von Textformaten (html, markdown, etc.) beim Verfassen - -Geändert: -- Kontextmenü bei langem Drücken eines Links -- Lesezeichen und Übersetzungsschaltflächen werden jetzt pro Konto angezeigt - -Behoben: -- CW funktioniert nicht mit Medien -- Medien werden bei älteren Instanzen nicht angezeigt -- Einige Abstürze diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/478.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/478.txt new file mode 100644 index 00000000..ae962fc4 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/478.txt @@ -0,0 +1,15 @@ +Added: +- Support camel case tags (automatically recorded when composing) +- Manage tags when composing (top right menu) +- Custom tabs (default: enabled) + +Changed: +- Media heights now use the screen size +- Remove horizontal scroll for media +- Reduce size of emoji when text size is increased +- Update available languages in picker + +Fixed: +- Forwarded tags are added back after being deleted +- TalkBack issues +- Some crashes \ No newline at end of file diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/390.txt deleted file mode 100644 index 7fb6b127..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Nouvelle version de Fedilab avec de nouvelles fonctionnalités. --Vous pouvez maintenant composer des fils. --Voir le fil complet pendant que vous répondez --Support du cache --Nouveau design diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/391.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/391.txt deleted file mode 100644 index 7fb6b127..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/391.txt +++ /dev/null @@ -1,5 +0,0 @@ -Nouvelle version de Fedilab avec de nouvelles fonctionnalités. --Vous pouvez maintenant composer des fils. --Voir le fil complet pendant que vous répondez --Support du cache --Nouveau design diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/393.txt deleted file mode 100644 index 086c85a4..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/393.txt +++ /dev/null @@ -1,2 +0,0 @@ --Quelques corrections de bugs --Amélioration des fils épinglés diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/394.txt deleted file mode 100644 index 943bdf96..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ --Réparation des plantages pour les instances pleroma diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/395.txt deleted file mode 100644 index c44047b9..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Résolution de quelques bugs -- Possibilité de partager avec l'application diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/396.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/396.txt deleted file mode 100644 index f5457cee..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/396.txt +++ /dev/null @@ -1,13 +0,0 @@ -Ajouté : -- Possibilité d'ajouter un point de focalisation sur les aperçus (éditeur de média) -- Respect du point de focalisation des aperçus -- Pagination avec le support du bouton "Récupérer plus de messages" lisant vers le haut ou le bas. -- Tendances - -Réparé : -- Seule la dernière notification poussée est affichée (pas groupées) -- Mauvais comportement du défilement gauche/droit -- Longs profils pas complètement affichés -- Problèmes avec certains sondages -- Plantages -- Mauvais comportements diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/397.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/397.txt deleted file mode 100644 index 08ca99c5..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/397.txt +++ /dev/null @@ -1 +0,0 @@ -- Résolutions de certains bugs signalés. diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/398.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/398.txt deleted file mode 100644 index 445e1873..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/398.txt +++ /dev/null @@ -1,6 +0,0 @@ -- Poursuite de l'amélioration du défilement -- Défiler vers le haut (re-sélection de la barre du haut) récupérera les nouveaux messages et défilera ensuite vers le haut. -- Retrait du point de focalisation pour s'adapter aux aperçus des médias. -- Réparation de l'impossibilité de partager avec un compte -- Réparation du thème sombre -- Réparation des couleurs de certains boutons diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/399.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/399.txt deleted file mode 100644 index ca1dd136..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/399.txt +++ /dev/null @@ -1,16 +0,0 @@ -Ajouté : -- Choix de langue de rédaction (menu de rédaction -> 3 points verticaux) -- Support des réactions pour Pleroma -- Indicateur vie privée en haut à droite - -Changé : -- Amélioration du défilement -- Défilement vers le haut (re-sélection d'onglet) cherchera de nouveaux messages puis défilera vers le haut - -Résolu : -- Fils d'étiquettes vides -- Retrait du point de focalisation pour s'adapter aux miniatures -- Partage avec un compte -- Thème sombre -- Choix du thème -- Couleurs de certains boutons diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/400.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/400.txt deleted file mode 100644 index 3145fdcf..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/400.txt +++ /dev/null @@ -1,9 +0,0 @@ -Ajouté : -- Possibilité de définir le nombre de caractère maximum quand il n'est pas détecté (dans à propos de l'instance) -- Ajout du sélecteur d’émoji one lors de la rédaction (doit être activé dans les paramètres) -- Ajout des notes de changement de version et la possibilité de les traduire - -Résolu : -- Emojis personnalisé de Friendica non-affichés -- Appui long pour stocker les médias -- Quelques corrections de bugs diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/401.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/401.txt deleted file mode 100644 index 0b56f8ae..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/401.txt +++ /dev/null @@ -1,11 +0,0 @@ -Changé : -- La composition des message n'est plus soumise aux caractères maximum - -Résolu : -- Suivi entre comptes -- Impossibilité de s'abonner aux notifications pour un compte -- Problèmes de partage -- Mauvais profil pour les réactions en émoji dans les notifications -- Problèmes de cartes -- Plantages avec les onglets -- Onglets non-re-nommables diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/402.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/402.txt deleted file mode 100644 index b6076f9b..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/402.txt +++ /dev/null @@ -1,15 +0,0 @@ -Ajouté : -- Nouveau thème : Dark Elephant de S1m -- Messages d'erreur du serveur lorsque la publication échoue -- Choix du délai de récupération pour les notifications différées - -Changé : -- Boutons "Charger plus de messages" plus visibles - -Résolu : -- Problème lors de la récupération de messages manquants -- Quelques problèmes avec les thèmes -- Trop d'espace perdu avec les réactions (Pleroma) -- Plantages de Supprimer & Réécrire -- Plantage lors du visionnage d'une vidéo -- Autres plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/405.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/405.txt deleted file mode 100644 index 9c936106..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/405.txt +++ /dev/null @@ -1,20 +0,0 @@ -Ajouté : -- Exporter paramètres -- Réorganisation des listes propagée aux sous-menus "Listes" -- Choix distributeur de notifications - -Changé : -- Meilleure adaptation des aperçus -- Amélioration notifications -- Médias de profil en grille - -Résolu : -- Fonctionnement de certaines vidéos Peertube -- Visibilité par défaut du compte lors d'une réponse -- Distinction gif/images -- Plantage sur le fil d'une autre instance -- "Supprimer" du compositeur de fils fait planter l'appli -- "Retour" ouvre trop de vieilles activités avant de fermer l'appli -- Problèmes de partage -- Réorganisation des Listes avec problèmes d'IU en changeant la visibilité -- Liens depuis Friendica pas affichés correctement diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/407.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/407.txt deleted file mode 100644 index 21064a3a..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/407.txt +++ /dev/null @@ -1,9 +0,0 @@ -Ajouté : -- Paramètre pour mettre tous les fils en haut (désactivé par défaut) -- Paramètre pour afficher les fils en listes (désactivé par défaut) -- Affichage de compteurs pour favoris/reblog dans les fils (désactivé par défaut) - -Résolu : -- Problème de visibilité lors des réponses -- Problèmes de thème lors de la rédaction -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/408.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/408.txt deleted file mode 100644 index bf0a68e5..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/408.txt +++ /dev/null @@ -1,5 +0,0 @@ -- Amélioration de la vitesse de chargement pour les instances Nitter -- Possibilité d'éditer les comptes Nitter avec un appui long sur les onglets -- Résolution des problèmes de pagination sur les fils épinglés -- Réparation de quelques plantages -- Résolution de la visibilité lors de l'affichage des compteurs diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/409.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/409.txt deleted file mode 100644 index 7b9415f7..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/409.txt +++ /dev/null @@ -1,5 +0,0 @@ -- Résolution d'un problème du fil principal avec le cache -- Les fils Nitter utilisent l'instance personnalisée depuis les paramètres -- Résolution de problèmes Nitter (RT seulement) -- N'accepte plus les certificats invalides des URLs onion (Google) -- Résolution de quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/410.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/410.txt deleted file mode 100644 index 85255ae9..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/410.txt +++ /dev/null @@ -1,4 +0,0 @@ -- Nouveau mécanisme de cache -- Le cache peut être désactivé dans les paramètres -- Ajout de compteurs pour les nouveaux messages -- Quelques réparations. diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/411.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/411.txt deleted file mode 100644 index ff25d724..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/411.txt +++ /dev/null @@ -1,3 +0,0 @@ -- Réparation de la publication de message avec média -- Choix du chargement des miniatures Toujours/Wifi uniquement/Sur demande -- Quelques autres petites réparations diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/412.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/412.txt deleted file mode 100644 index 7a03e7fd..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/412.txt +++ /dev/null @@ -1,5 +0,0 @@ -- Réparation de la publication de message avec média -- Résolution du problème d'encodage avec les descriptions de médias -- Réparation de la recherche d'étiquettes Friendica -- Réparation de la rédaction -- D'autres petites réparations diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/413.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/413.txt deleted file mode 100644 index 5f5f176f..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/413.txt +++ /dev/null @@ -1,10 +0,0 @@ -Ajouté : -- Réparation de la publication de message avec média -- Choix du chargement des miniatures Toujours/Wifi uniquement/Sur demande -- Ajout de compteurs pour les nouveaux messages de fils -Résolu : -- Menu contextuel des fils ne fonctionne pas -- Problème de recherche d'étiquettes avec Friendica -- Le clique sur les notifications ouvre le mauvais onglet -- Problème d'encodage avec les descriptions de médias -- D'autres réparations. diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/414.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/414.txt deleted file mode 100644 index a2a60f31..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/414.txt +++ /dev/null @@ -1,7 +0,0 @@ -Ajouté : -- Désactiver les compteurs dans les paramètres -Résolu : -- Messages dupliqués depuis le cache -- Notifications en double -- Brouillons pas automatiquement supprimés -- Message pas retirés du cache après suppression diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/415.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/415.txt deleted file mode 100644 index 25f34525..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/415.txt +++ /dev/null @@ -1,2 +0,0 @@ -Résolu : -- Ajout d'un média à une réponse diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/416.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/416.txt deleted file mode 100644 index c8bc9b56..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/416.txt +++ /dev/null @@ -1,12 +0,0 @@ -Changé : -- Défilement entre les fils -- Amélioration du cache -- La taille des boutons dans les messages suit l'échelle définie - -Résolu : -- Pleroma : Réactions émoji -- Partage (plusieurs résolutions) -- Problèmes de thème -- Problème de rendu avec les liens -- Notifications non-enlevées du cache -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/417.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/417.txt deleted file mode 100644 index 26a55715..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/417.txt +++ /dev/null @@ -1,15 +0,0 @@ -Changé : -- Défilement entre les fils -- Amélioration du cache -- La taille des boutons peut être changée dans les paramètres -- Traduction en français - -Résolu : -- Pleroma : Réactions émoji -- Partage (plusieurs résolutions) -- Problèmes de thème -- Problème de rendu avec les liens -- Notifications non-enlevées du cache -- Problèmes avec les filigranes -- Pagination avec les marque-pages/favoris -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/418.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/418.txt deleted file mode 100644 index 55766196..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/418.txt +++ /dev/null @@ -1,15 +0,0 @@ -Ajouté : -- Changement de l'icône d'application (Paramètres>Interface) -- Dés/activer "Se souvenir de la position" dans les fils -- Dés/activer l’agrégation de notifications dans les paramètres - -Changé : -- Dés/activer les media dans les notifications - -Résolu : -- Publication perdant le "spoiler message" en ajoutant un média. -- Caméra ne fonctionnant pas sur Android 11 -- Agrégation de notifications -- Vibrations lors de la récupération de nouvelles notifications -- Fils média -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/419.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/419.txt deleted file mode 100644 index 044c21b3..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/419.txt +++ /dev/null @@ -1,11 +0,0 @@ -Ajouté : -- Dés/épingler les messages -- Choisir la langue par défaut pour les traductions - -Changé : -- Permettre de dés/activer les médias pour les notifications - -Résolu : -- Mauvaises images dans les fils de notification -- Bug de double icône -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/420.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/420.txt deleted file mode 100644 index 2e861ea4..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/420.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Edition des messages (si votre instance supporte cette fonctionnalité) -- Quelques résolutions diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/421.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/421.txt deleted file mode 100644 index 9fbe27ea..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/421.txt +++ /dev/null @@ -1,22 +0,0 @@ -Ajouté : -- Édition de messages (si supporté par l'instance) -- Épingler des messages -- Langage de traduction par défaut -- Choix d'icône de l'application -- Fonction "se souvenir de la position" dans les fils -- Fonction agrégation de notifications -- Icône sur miniatures s'il y a une description - -Changé : -- Dés/activer les média pour les notifications - -Résolu : -- "Spoiler message" perdu à l'ajout d'un média -- Caméra sur Android 11 -- Agrégation de notifications -- Vibration quand récupérations de notifications -- Fils de médias -- Problèmes de thème -- Navigateur intégré & openId -- Fils d'Art -- Plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/422.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/422.txt deleted file mode 100644 index cbee41f3..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/422.txt +++ /dev/null @@ -1,13 +0,0 @@ -Ajouté : -- Affichage du client dans les messages détaillés -- Support du visuel pour les citations commençant par ">" -- Augmentation de l'indentation des fils (zéro à 20, défaut 5) -- Visibilité des réponses publiques définies comme non-listée (peut être désactivé) - -Changé : -- Réduction de la taille du titre quand le texte est agrandi. - -Résolu : -- Filtres non-appliqués -- Bloquer un compte ne retire pas les messages du cache -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/423.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/423.txt deleted file mode 100644 index b444bc5f..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/423.txt +++ /dev/null @@ -1,5 +0,0 @@ -Résolu : -- Ordre des notifications -- URL lors du partage des messages boostés -- Pages vides au redémarrage -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/424.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/424.txt deleted file mode 100644 index 4195f4e3..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/424.txt +++ /dev/null @@ -1,4 +0,0 @@ -Résolu : -- Problèmes avec des messages/notifications affichés incorrectement -- Friendica : problèmes avec les mentions et étiquettes (ouvrir le navigateur) -- Amélioration du partage diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/425.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/425.txt deleted file mode 100644 index 16d47e47..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/425.txt +++ /dev/null @@ -1,9 +0,0 @@ -Changé : -- Les étiquettes sont classés par ordre de popularité dans la recherche - -Résolu : -- Impossible d'obtenir l'ID du client sur certains appareils -- Les messages/notifications n'étaient pas affichés correctement -- Notifications non-reçues -- Friendica : problèmes avec les mentions et les étiquettes (ouvre le navigateur) -- Amélioration du partage diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/426.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/426.txt deleted file mode 100644 index 99118e17..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/426.txt +++ /dev/null @@ -1,9 +0,0 @@ -Ajouté : -- 2 nouveaux thèmes clairs -- Fonctionnalités de modération - -Résolu : -- Filtres non-fonctionnels -- Plantages avec les tendances -- Contenu effacé lors de l'envoi de messages (mentions) -- Autres corrections de bugs diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/427.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/427.txt deleted file mode 100644 index aa5815fc..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/427.txt +++ /dev/null @@ -1,16 +0,0 @@ -Ajouté : -- Suivi des balises (entrée dédiée dans le menu) -- Réduction de la liste des langues lors de la rédaction (Paramètres > Composer) -- Indicateur de langue lors de la rédaction -- Les réponses sont automatiquement définies sur la langue du premier message -- Deux nouveaux thèmes de jour -- Plus de fonctionnalités de modération -- Le nom de la liste peut être modifié - -Résolu : -- Le filtre ne fonctionne pas -- Plantage avec les tendances -- Problème avec les thèmes -- Certains contenus perdus lors de l'envoi de messages (mentions) -- Correction des blocages dans les fils chronologiques -- Quelques autres correctifs diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/428.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/428.txt deleted file mode 100644 index 67ef5929..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/428.txt +++ /dev/null @@ -1,14 +0,0 @@ -Ajouté : -- Prise en charge des liens ouverts contenant /@display_name/ dans leur chemin (fonctionne sur les appareils plus anciens) -- Afficher le nombre de réponses lorsque les compteurs sont activés -- Ajout de la prise en charge du filtrage des messages de profil - -Modifié : -- La vue Composer prend toute la largeur même dans les fils -- Réinitialiser le marqueur de notification push lors de la suppression du cache - -Résolu : -- Brouillon stocké lors de la réponse "non" ou l'invite de dialogue sans modifications -- Les filtres ne fonctionnent pas avec les balises -- Ajout d'un message d'erreur spécifique pour les balises suivies -- Pages vides au démarrage de l'application diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/429.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/429.txt deleted file mode 100644 index d2b8e7cc..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/429.txt +++ /dev/null @@ -1,2 +0,0 @@ -Ajouté : -- Support complet des nouveaux filtres de Mastodon 4 diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/430.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/430.txt deleted file mode 100644 index 8b4526a0..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/430.txt +++ /dev/null @@ -1,5 +0,0 @@ -Ajouté : -- Visiter les profils sans être authentifié / Autoriser l'affichage de tous leurs messages - -Corrigé : -- L'enregistrement des médias échoue sur certains appareils diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/431.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/431.txt deleted file mode 100644 index 48c0eba4..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/431.txt +++ /dev/null @@ -1,14 +0,0 @@ -Ajouté : -- Prise en charge complète des nouveaux filtres pour Mastodon 4 -- Visiter les profils sans être authentifié / Autoriser l'affichage de tous leurs messages - -Modifié : -- La vue Composer prend toute la largeur même dans les fils -- Les comptes peuvent être mis en sourdine à partir de leur profil - -Résolu : -- Brouillon stocké lors de la réponse "non" ou de l'invite de dialogue sans modifications -- Pages vides au démarrage de l'application -- L'enregistrement et le partage de médias échouent sur certains appareils -- Ajout de la prise en charge des notifications d'administration -- Copier le contenu d'un message diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/432.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/432.txt deleted file mode 100644 index dc57b737..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/432.txt +++ /dev/null @@ -1,13 +0,0 @@ -Ajouté : -- Liste des domaines bloqués (permet de débloquer) -- Prise en charge des liens gemini -- Suggestion de Suiveurs - -Modifié : -- Autoriser la modification du terme de recherche - -Fixé : -- Brouillons supprimés sans avertissement -- L'application plante lorsque le proxy est défini -- Filtre non synchronisé après avoir été modifié -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/433.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/433.txt deleted file mode 100644 index ea7a195e..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/433.txt +++ /dev/null @@ -1,18 +0,0 @@ -Ajouté : -- Liste des domaines bloqués (permet de débloquer) -- Prise en charge des liens gemini -- Suiveurs suggérés -- Mod/Adm : gérer les domaines bloqués par l'instance -- Ouvrir des messages avec un autre compte -- Autoriser à désactiver les notifications pour les administrateurs -- Trier les listes - -Modifié : -- Autoriser la modification du terme de recherche - -Fixé : -- Brouillons supprimés sans avertissement -- Supprimer les listes de "Gérer les chronologies" -- L'application plante lorsque le proxy est défini -- Filtre non synchronisé après avoir été modifié -- Quelques plantages / améliorations diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/434.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/434.txt deleted file mode 100644 index ebd1a365..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/434.txt +++ /dev/null @@ -1,12 +0,0 @@ -Ajouté : -- Silencer les tags par un appui long dans les timelines - -Changé : -- Les messages de comptes silencés sont à présent retirés du cache - -Résolu : -- Ouvrir avec un autre compte -- Correction des sauts dans les profils -- Médias non-affichés dans les albums → Force l'indexation -- Le navigateur web intégré n'affiche pas le niveau admin -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/435.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/435.txt deleted file mode 100644 index 3bb919fa..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/435.txt +++ /dev/null @@ -1,9 +0,0 @@ -Ajouté : -- Migration vers Material Design 3 -- 5 thèmes (Clair, Sombre, Solarized Clair/Sombre, Noir) -- Basculement automatique entre Clair/Sombre -- Les thèmes Clair et Sombre peuvent être définis en fonction de l'heure -- Android 12+ : Couleur dynamique - -Résolu : -- Sauts dans les timelines diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/436.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/436.txt deleted file mode 100644 index 0b79d1a1..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/436.txt +++ /dev/null @@ -1,10 +0,0 @@ -Changé : -- Retrait du support du navigateur web intégré -- Plus d'espace entre les boutons d'action des messages - -Résolu : -- Problème de taille du texte -- Chevauchement de texte -- Mauvais fond pour le thème Solarized Sombre -- Mélange entre les thèmes Clair et Sombre -- Bouton de sauvegarde caché diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/437.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/437.txt deleted file mode 100644 index a52173cf..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/437.txt +++ /dev/null @@ -1,14 +0,0 @@ -Ajouté : -- Nouvelle apparence avec 5 thèmes - -Changé : -- Retrait du support du navigateur web intégré -- Ajuster l'image d'aperçu affiche l'image verticalement -- Ajout des compteurs à côté des images - -Résolu : -- Saut dans les timelines -- Réponses aux mauvais messages avec les instances suivies -- Bogue avec Supprimer & Réécrire avec un média -- Liste ne peut pas être caché -- Quelques plantages diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/439.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/439.txt deleted file mode 100644 index a3c7a41a..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/439.txt +++ /dev/null @@ -1,6 +0,0 @@ -Changé : -- Retrait de la carte de présentation -- Couleur des liens pour le thème Sombre - -Résolu : -- Crash lors du changement de thème diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/440.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/440.txt deleted file mode 100644 index 8f8e037f..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/440.txt +++ /dev/null @@ -1,4 +0,0 @@ -Résolu : -- Les émojis personnalisés ne sont pas toujours affichés -- Sauts dans les timelines quand "ajuster les images" est utilisé -- Thème sombre : boutons de timeline sans toggle diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/441.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/441.txt deleted file mode 100644 index 98e706e9..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/441.txt +++ /dev/null @@ -1,3 +0,0 @@ -Résolu : -- Sauts lors du défilement avec ajustement des images -- Bouton de récupération cassé avec le cache diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/442.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/442.txt deleted file mode 100644 index 6a39fa3c..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/442.txt +++ /dev/null @@ -1,11 +0,0 @@ -Ajouté : -- Thème Dracula - -Changé : -- Couleurs des thèmes Clair/Sombre/Noir - -Résolu : -- Images animés de profils non-affichées -- Mentions cassées dans les descriptions et champs de profil -- Les modèles de balises dans les URL cassent les liens -- Faute de frappe dans les tags suivis diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/443.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/443.txt deleted file mode 100644 index 630212db..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/443.txt +++ /dev/null @@ -1,16 +0,0 @@ -Ajouté : -- Thème Dracula -- Couleurs de messages personnalisées -- Activer/Désactiver les cartes de présentation - -Changé : -- Couleurs pour certains thèmes -- Espaces entre les boutons - -Résolu : -- Images animés sur les profils non-affichées -- Mentions cassées dans les descriptions et champs de profil -- Sauts lors du défilement avec les ajustements de miniatures -- Bouton de récupération cassé avec le cache -- Les modèles de balises dans les URL cassent les liens -- Faute de frappe dans les tags suivis diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/444.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/444.txt deleted file mode 100644 index 721466b6..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/444.txt +++ /dev/null @@ -1,4 +0,0 @@ -Ajouté : -- Afficher tous les messages d'une enfilade depuis l'instance distante (si possible) -* Seulement pour les messages publiques des instances utilisant l'API Mastodon -* Un bouton dédié est affiché en haut à droite quand les conditions sont remplies. diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/445.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/445.txt deleted file mode 100644 index 2d928b11..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/445.txt +++ /dev/null @@ -1,11 +0,0 @@ -Ajouté : -- Permettre de rétablir/ne plus suivre/désépingler une étiquette depuis les timelines des étiquettes -- Automatiquement ajouter l'étiquette quand on écrit depuis une timeline d'étiquette -- Ajout d'un bouton de traduction en bas des messages (par défaut : désactivé) -- Ajout des rôles de comptes dans les profils - -Résolu : -- Contact impossible quand on écrit -- Barre de status pour le thème Noir -- Message dupliqué dans les conversations lorsque édité -- Problème de couleur sur Android 5 diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/446.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/446.txt deleted file mode 100644 index 7738f6bf..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/446.txt +++ /dev/null @@ -1,18 +0,0 @@ -Ajouté : -- Afficher tout les messages des fils d'instances distantes (si possible) -- Possibilité de ne plus suivre/silencer/épingler un tag de la timeline des tags -- Affiche les comptes les plus utilisés dans l'en-tête du menu pour un changement rapide -- Ajoute automatiquement le tag lorsque l'on poste depuis la timeline des tags -- Ajoute un bouton traduire en bas des messages (désactivé par défaut) -- Ajoute des rôles de comptes dans les profils -- Traduction du morse - -Modifié : -- Désactive les animations après une actualisation - -Réparé : -- Le contact ne marche pas lors de la rédaction d'un post -- Barre de statut pour le thème noir -- Message copié dans les conversations lorsqu'il est édité -- Problèmes de couleurs avec Android 5 -- Plusieurs crashes diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/447.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/447.txt deleted file mode 100644 index 41473dc8..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/447.txt +++ /dev/null @@ -1,4 +0,0 @@ -Ajouté : -- Silencer/désilencer les comptes dans la timeline accueil depuis leurs messages ou leurs profils -- Ajouter tout les utilisateurs d'une liste à "Silencer sur l'accueil" en un clic -- Afficher/gérer les utilisateurs silencés sur l'accueil diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/448.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/448.txt deleted file mode 100644 index fd5cf639..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/448.txt +++ /dev/null @@ -1,7 +0,0 @@ -Ajouté : -- Silencer/désilencer les comptes dans la timeline accueil depuis leurs messages ou leurs profils -- Ajouter tout les utilisateurs d'une liste à "Silencer sur l'accueil" en un clic -- Afficher/gérer les utilisateurs silencés sur l'accueil - -Réparé : -- Crashs de la timeline diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/449.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/449.txt deleted file mode 100644 index 7f3a7882..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/449.txt +++ /dev/null @@ -1,9 +0,0 @@ -Ajouté : -- Ajoute plus de langues cibles dans picker pour les traductions -- Ajoute le nom du compte dans les notifications push - -Réparé : -- Répare le crash lors du changement de langue -- Répare les contre couleurs -- Répare la couleur de lien par défaut -- Répare le crash lorsque l'on clique sur les mentions diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/450.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/450.txt deleted file mode 100644 index c497861d..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/450.txt +++ /dev/null @@ -1,12 +0,0 @@ -Ajouté : -- Fonctionnalité d'importation/exportation des données complète -- Support des icônes du thème Android 13 - -Réparé : -- Répare une régression avec les filtres -- Répare le thème solarisé sombre -- Répare le lien de prévisualisation pour les CW -- Répare la couleur de la barre de statut pour tout les thèmes -- Réparer la langue dans la rédaction "..." -- Répare ajouter tout les comptes silencés dans l'accueil à partir de listes -- Répare les badges des top notofications diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/451.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/451.txt deleted file mode 100644 index e2edaeec..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/451.txt +++ /dev/null @@ -1,12 +0,0 @@ -Ajouté : -- Poster des citations aléatoires -- Re-blog de groupe dans la timeline d'accueil - -Modifié : -- Affiche le bouton traduire seulement lorsque la langue est différente -- Respecte les espaces blancs entre les mots dans les messages -- Le bouton focus est plus accessible lorsque l'on édite un média - -Réparé : -- Comportement avec le bouton cw -- Lien gemini tronqués diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/452.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/452.txt deleted file mode 100644 index 62b4d307..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/452.txt +++ /dev/null @@ -1,16 +0,0 @@ -Ajouté : -- Renommer les timeline Nitter -- Support d'Android 13 - -Modifié : -- Feedback visuel pour bloquer sur la liste de comptes -- Changements visuels avec la barre écrire/favori - -Réparé : -- Bouton nav non visible avec les média (thème clair) -- Barre de statut avec Android 5 -- Répare les liens non cliquables -- Répare les liens profonds -- Répare les fils distants non importés depuis certaines instances -- Ajoute les descriptions aux médias partagés -- Répare des crashs diff --git a/src/fdroid/fastlane/metadata/android/fr/changelogs/453.txt b/src/fdroid/fastlane/metadata/android/fr/changelogs/453.txt deleted file mode 100644 index d7728801..00000000 --- a/src/fdroid/fastlane/metadata/android/fr/changelogs/453.txt +++ /dev/null @@ -1,8 +0,0 @@ -Ajoute : -- La pagination avec recherche / tendance - -Réparé : -- Appuyer longtemps sur les onglets Nitter -- Ouvrir avec d'autres comptes -- Taille de caractères non respectée pour Android 5-6 -- Mauvaise instance importée depuis instances.social diff --git a/src/fdroid/fastlane/metadata/android/gl/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/gl/changelogs/390.txt deleted file mode 100644 index d810d33a..00000000 --- a/src/fdroid/fastlane/metadata/android/gl/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Nova versión de Fedilab con novas funcións. -- Agora podes escribir fíos -- Ver o fío completo ao responder -- Soporte para caché -- Novo deseño diff --git a/src/fdroid/fastlane/metadata/android/ja/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/ja/changelogs/390.txt deleted file mode 100644 index daee8142..00000000 --- a/src/fdroid/fastlane/metadata/android/ja/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -新バージョンのFedilabの新機能 -- スレッドを作成できます -- 返信時にスレッド全体を確認できます -- キャッシュのサポート -- 新しいデザイン diff --git a/src/fdroid/fastlane/metadata/android/ja/changelogs/391.txt b/src/fdroid/fastlane/metadata/android/ja/changelogs/391.txt deleted file mode 100644 index daee8142..00000000 --- a/src/fdroid/fastlane/metadata/android/ja/changelogs/391.txt +++ /dev/null @@ -1,5 +0,0 @@ -新バージョンのFedilabの新機能 -- スレッドを作成できます -- 返信時にスレッド全体を確認できます -- キャッシュのサポート -- 新しいデザイン diff --git a/src/fdroid/fastlane/metadata/android/ja/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/ja/changelogs/393.txt deleted file mode 100644 index 8cd8b494..00000000 --- a/src/fdroid/fastlane/metadata/android/ja/changelogs/393.txt +++ /dev/null @@ -1,2 +0,0 @@ -- バグ修正 -- ピン留めされたタイムラインの改善 diff --git a/src/fdroid/fastlane/metadata/android/ja/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/ja/changelogs/394.txt deleted file mode 100644 index 2035ba22..00000000 --- a/src/fdroid/fastlane/metadata/android/ja/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ -- 一部のPleromaインスタンスでクラッシュする問題の修正 diff --git a/src/fdroid/fastlane/metadata/android/ja/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/ja/changelogs/395.txt deleted file mode 100644 index 669f0094..00000000 --- a/src/fdroid/fastlane/metadata/android/ja/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- バグの修正 -- Fedilabに共有できるように diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/390.txt deleted file mode 100644 index e5ce13b8..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Nova versão do Fedilab com nova funcionalidade. -- Agora é possível compor threads -- Vê o thread completo ao responder -- Suporte de cache -- Novo design diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/393.txt deleted file mode 100644 index 88a074ca..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/393.txt +++ /dev/null @@ -1,3 +0,0 @@ -- Algumas correcções de bugs - -- Melhorar as linhas de tempo fixadas diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/394.txt deleted file mode 100644 index a833e934..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ -‐ Correcção de crashes para algumas instâncias do pleroma diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/395.txt deleted file mode 100644 index e7fc7bca..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Corrigidos alguns bugs -- Permite compartilhar com o aplicativo diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/396.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/396.txt deleted file mode 100644 index 7bf813f6..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/396.txt +++ /dev/null @@ -1,13 +0,0 @@ -Adicionado: -- Permite definir um ponto de foco em nas prévias (editor de mídia) -- Respeite o ponto de foco com prévias -- Paginação com o suporte ao botão buscar mais leitura para cima ou para baixo -- Adicionar tendências - -Fixo: -- Somente a última notificação por push é exibida (não agrupada) -- Mau comportamento com a rolagem direita/esquerda -- Corrigir perfis longos não totalmente exibidos -- Problemas com algumas enquetes -- Algumas falhas -- Alguns maus comportamentos diff --git a/src/fdroid/fastlane/metadata/android/pt/changelogs/397.txt b/src/fdroid/fastlane/metadata/android/pt/changelogs/397.txt deleted file mode 100644 index fbdf14da..00000000 --- a/src/fdroid/fastlane/metadata/android/pt/changelogs/397.txt +++ /dev/null @@ -1 +0,0 @@ -- Corrigidos alguns bugs relatados. diff --git a/src/fdroid/fastlane/metadata/android/sc/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/sc/changelogs/390.txt deleted file mode 100644 index dd5f0974..00000000 --- a/src/fdroid/fastlane/metadata/android/sc/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Versione noa de Fedilab cun funtzionalidades noas. -- Como podes cumpònnere discussiones -- Pòmpia sa discussione intrea cando ses rispondende -- Suportu pro sa memòria temporànea -- Aspetu nou diff --git a/src/fdroid/fastlane/metadata/android/sc/changelogs/391.txt b/src/fdroid/fastlane/metadata/android/sc/changelogs/391.txt deleted file mode 100644 index dd5f0974..00000000 --- a/src/fdroid/fastlane/metadata/android/sc/changelogs/391.txt +++ /dev/null @@ -1,5 +0,0 @@ -Versione noa de Fedilab cun funtzionalidades noas. -- Como podes cumpònnere discussiones -- Pòmpia sa discussione intrea cando ses rispondende -- Suportu pro sa memòria temporànea -- Aspetu nou diff --git a/src/fdroid/fastlane/metadata/android/sc/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/sc/changelogs/393.txt deleted file mode 100644 index 15fe2303..00000000 --- a/src/fdroid/fastlane/metadata/android/sc/changelogs/393.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Unos cantos acontzos de errores -- Megioramentu de sas lìnias de tempus apicadas diff --git a/src/fdroid/fastlane/metadata/android/sc/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/sc/changelogs/394.txt deleted file mode 100644 index f8cf156f..00000000 --- a/src/fdroid/fastlane/metadata/android/sc/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ -- Risoltu su problema de sas serraduras improvisas pro unas cantas istàntzias de pleroma diff --git a/src/fdroid/fastlane/metadata/android/sc/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/sc/changelogs/395.txt deleted file mode 100644 index ee89de59..00000000 --- a/src/fdroid/fastlane/metadata/android/sc/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Acontzu de unas cantas faddinas in su còdighe -- Permissu pro cumpartzire cun s'aplicatzione diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/390.txt deleted file mode 100644 index 0470b30c..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Fedilab'ın yeni özelliklere sahip yeni sürümü. -- Artık mesaj dizileri oluşturabilirsiniz -- Yanıt verirken tüm mesaj dizisini görün -- Önbellek desteği -- Yeni tasarım diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/391.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/391.txt deleted file mode 100644 index 0470b30c..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/391.txt +++ /dev/null @@ -1,5 +0,0 @@ -Fedilab'ın yeni özelliklere sahip yeni sürümü. -- Artık mesaj dizileri oluşturabilirsiniz -- Yanıt verirken tüm mesaj dizisini görün -- Önbellek desteği -- Yeni tasarım diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/393.txt deleted file mode 100644 index 0bed0628..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/393.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Birkaç hata düzeltmesi -- Sabitlenmiş zaman çizelgeleri iyileştirildi diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/394.txt deleted file mode 100644 index f7de23fc..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ -- Bazı pleroma örnekleri için çökmeler düzeltildi diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/395.txt deleted file mode 100644 index 7dc9f16a..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Birkaç hata düzeltmesi -- Uygulama ile paylaşmaya izin ver diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/396.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/396.txt deleted file mode 100644 index 5209cfd1..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/396.txt +++ /dev/null @@ -1,13 +0,0 @@ -Eklendi: -- Ön izlemelerde bir odak noktası ayarlamaya izin ver (medya düzenleyici) -- Ön izlemelerle odak noktasını dikkate al -- Daha fazla getir düğmesi ile sayfalandırma, yukarı veya aşağı okumayı destekler -- Trendler - -Düzeltildi: -- Yalnızca son anlık bildirimin görüntülenmesi (gruplandırılmamış) -- Sağa/sola kaydırma ile ilgili hatalı davranış -- Tam olarak görüntülenmeyen uzun profiller -- Bazı anketlerle ilgili sorunlar -- Bazı çökmeler -- Bazı hatalı davranışlar diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/397.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/397.txt deleted file mode 100644 index ed38ba3b..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/397.txt +++ /dev/null @@ -1 +0,0 @@ -- Bildirilen bazı hatalar düzeltildi. diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/398.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/398.txt deleted file mode 100644 index a69f593d..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/398.txt +++ /dev/null @@ -1,6 +0,0 @@ -- Kaydırma davranışının iyileştirilmesine devam edildi -- En üste kaydırma (sekme yeniden seçimi) yeni mesajları getirir ve ardından en üste kaydırır -- Sığdırma medya ön izlemesi için odak noktasını kaldır -- Tek bir hesapla paylaşılamaması düzeltildi -- Siyah tema düzeltildi -- Bazı düğme renkleri düzeltildi diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/399.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/399.txt deleted file mode 100644 index 9789a678..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/399.txt +++ /dev/null @@ -1,16 +0,0 @@ -Eklenenler: -- Oluşturma dilini ayarla (oluşturma menüsünden -> üç dikey nokta) -- Pleroma için etkileşim desteği -- Sağ üst kısma gizlilik göstergesi - -Değişenler: -- Kaydırma davranışı iyileştirildi -- En üste kaydırma (sekme yeniden seçimi) yeni mesajları getirir ve ardından en üste kaydırır - -Düzeltilenler: -- Boş etiket zaman çizelgeleri -- Sığdırma medya ön izlemesi için odak noktasını kaldır -- Tek bir hesapla paylaşılamaması -- Siyah tema -- Temanın seçilememesi -- Bazı düğme renkleri diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/400.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/400.txt deleted file mode 100644 index 6777e21d..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/400.txt +++ /dev/null @@ -1,9 +0,0 @@ -Eklendi: -- Algılanmadığında azami karakter sayısını tanımlamaya izin ver (Sunucu hakkında kısmında) -- Oluştururken bir emoji seçici ekle (ayarlarda etkinleştirilmelidir) -- Sürüm notlarını çevirme özelliğiyle birlikte ekle - -Düzeltildi: -- Friendica özel emojilerinin görüntülenmemesi -- Medyayı kaydetmek için uzun basma -- Bazı hata düzeltmeleri diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/401.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/401.txt deleted file mode 100644 index 98c97935..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/401.txt +++ /dev/null @@ -1,11 +0,0 @@ -Değiştirildi: -- Mesaj oluşturma artık azami karakter sayısına zorlanmıyor - -Düzeltildi: -- Hesaplar arası takip -- Bir hesap için bildirimlere abone olunamaması -- Paylaşım sırasında karşılaşılan sorunlar -- Bildirimlerdeki emoji tepkileri için yanlış profil -- Kartlarla ilgili sorun -- Sekmelerin çökmesi -- Sekmelerin yeniden adlandırılamaması diff --git a/src/fdroid/fastlane/metadata/android/tr/changelogs/402.txt b/src/fdroid/fastlane/metadata/android/tr/changelogs/402.txt deleted file mode 100644 index f431a408..00000000 --- a/src/fdroid/fastlane/metadata/android/tr/changelogs/402.txt +++ /dev/null @@ -1,15 +0,0 @@ -Eklenen: -- Yeni tema: S1m'den Dark Elephant -- Gönderim başarısız olduğunda sunucu tarafından gelen hata mesajları -- Gecikmeli bildirimler için getirme süresini ayarlamaya izin verildi - -Güncellenen: -- Bir çok buton daha görünür hale getirildi - -Düzeltilen: -- Eksik mesajlar alınırken oluşan problem -- Temalarla ilgili bazı sorunlar -- Reaksiyonla çok fazla alan kaybı (Pleroma) -- Çalışma esnasındaki hatalar kaldırıldı ve yeniden düzenlendi -- Video oynatırken oluşan hata -- Diğer hata düzeltmeleri diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/395.txt deleted file mode 100644 index 1eab41d8..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Виправлено деякі помилки -- Дозволити поділитися зі застосунком diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/405.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/405.txt deleted file mode 100644 index a6c1f4e7..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/405.txt +++ /dev/null @@ -1,20 +0,0 @@ -Додано: -- Налаштування експорту -- Поширення ручного переупорядкування списків на шкалі часу в підменю "Списки" -- Дозволено змінювати розподільник push-розсилок у налаштуваннях - -Виправлено: -- Покращено попередній перегляд зображень -- Покращено сповіщення -- Медіа профілю відображаються у сітці - -Виправлено: -- Не працюють деякі відео з Peertube -- Поважати обліковий запис видимості за замовчуванням під час відповіді -- Відрізняти gif від зображень -- Застосунок аварійно завершує роботу під час відкриття зовнішнього екземпляра на шкалі часу -- Кнопка "Видалити" у композиторі потоку призводить до аварійного завершення роботи програми -- Кнопка "Назад" відкриває багато старих активностей перед закриттям застосунку -- Проблеми зі спільним доступом -- Переупорядкування списків з проблемою інтерфейсу при зміні видимості -- Посилання неправильно відображається у повідомленнях з Friendica diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/418.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/418.txt deleted file mode 100644 index de00df24..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/418.txt +++ /dev/null @@ -1,15 +0,0 @@ -Додано: -- Зміна іконки застосунку (Налаштування > Інтерфейс) -- Дозволено відключати "запам'ятовувати позицію" в хронологіях -- Дозволено відключати агрегацію сповіщень у налаштуваннях - -Змінено: -- Дозволено вимикати/вмикати медіа для сповіщень - -Виправлено: -- Допис втрачав "спойлер" при додаванні медіа -- Камера не працює на Android 11 -- Агрегація сповіщень -- Вібрація при отриманні нових сповіщень -- Виправлено проблему з хронологією медіа -- Деякі збої в роботі diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/421.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/421.txt deleted file mode 100644 index 0c2ca28b..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/421.txt +++ /dev/null @@ -1,22 +0,0 @@ -Додано: -- Редагування повідомлень (якщо ваш екземпляр підтримує цю функцію) -- Закріплення/відкріплення повідомлень -- Встановлення мови за замовчуванням для перекладів -- Зміна іконки застосунку (Налаштування > Інтерфейс) -- Дозволити вимкнути "запам'ятовувати позицію" на часових шкалах -- Дозволити вимкнути агрегацію сповіщень у налаштуваннях -- Іконка на прев'ю медіа за наявності опису - -Змінено: -- Дозволено вимикати/вмикати медіа для сповіщень - -Виправлено: -- Допис втрачав "спойлер" при додаванні медіа -- Камера не працює на Android 11 -- Агрегація сповіщень -- Вібрація при отриманні нових сповіщень -- Виправлено проблему зі шкалою часу для медіа -- Виправлено деякі проблеми з темами -- Вирішено проблему з вбудованим браузером та openId -- Погана поведінка з Хронологією Артів -- Деякі збої diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/422.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/422.txt deleted file mode 100644 index 76ca33fe..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/422.txt +++ /dev/null @@ -1,13 +0,0 @@ -Додано: -- Відображення клієнта в детальних повідомленнях -- Візуальна підтримка лапок, що починаються з ">" -- Збільшення відступів для потоків (від нуля до 20, за замовчуванням 5) -- Видимість публічних відповідей встановлено на unlisted (можна вимкнути) - -Змінено: -- Зменшено розмір заголовка при збільшенні розміру тексту - -Виправлено: -- Фільтри не застосовуються -- Блокування акаунта не видаляє повідомлення у кеші -- Виправлено деякі збої diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/428.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/428.txt deleted file mode 100644 index b0ff07a4..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/428.txt +++ /dev/null @@ -1,14 +0,0 @@ -Додано: -- Підтримка відкриття посилань, що містять у своєму шляху /@display_name/ (працює на старих пристроях) -- Відображення кількості відповідей при увімкнених лічильниках -- Додано підтримку фільтрації повідомлень профілю - -Змінено: -- Складання подання займає всю ширину навіть у потоках -- Скинуто маркер push-сповіщення при очищенні кешу - -Виправлено: -- Чернетка зберігається при відповіді "ні" або діалоговому запиті без змін -- Фільтри не працюють з теґами -- Додано спеціальне повідомлення про помилку для теґів, за якими слідкують -- Порожні сторінки під час запуску застосунку diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/431.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/431.txt deleted file mode 100644 index b21d3286..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/431.txt +++ /dev/null @@ -1,14 +0,0 @@ -Додано: -- Повна підтримка нових фільтрів для Mastodon 4 -- Відвідувати профілі без авторизації / Дозволити відображати всі їхні повідомлення - -Змінено: -- Компонування перегляду займає всю ширину навіть у потоках -- Облікові записи можна вимкнути за таймером з їхнього профілю - -Виправлено: -- Чернетка зберігається при відповіді "ні" або діалоговому запиті без змін -- Порожні сторінки під час запуску застосунку -- На деяких пристроях не вдається зберігати та ділитися медіа на деяких пристроях -- Додано підтримку сповіщень адміністратора -- Копіювання вмісту повідомлення diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/432.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/432.txt deleted file mode 100644 index e1de5020..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/432.txt +++ /dev/null @@ -1,13 +0,0 @@ -Додано: -- Список заблокованих доменів (дозволити розблокувати) -- Підтримати посилання gemini -- Запропоновані підписники - -Змінено: -- Дозволено редагування пошукового запиту - -Виправлено: -- Чернетки видалялися без попередження -- Застосунок вилітає, коли встановлено проксі -- Фільтр не синхронізується після редагування -- Деякі збої diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/433.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/433.txt deleted file mode 100644 index 230cd002..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/433.txt +++ /dev/null @@ -1,18 +0,0 @@ -Додано: -- Список заблокованих доменів (дозволити розблокувати) -- Підтримати посилання gemini -- Запропоновані підписники -- Мод/Адмін: Керування екземплярами заблокованих доменів -- Відкривати повідомлення з іншим обліковим записом -- Дозволити відключити сповіщення для адміністраторів -- Сортування списків - -Змінено: -- Дозволено редагування пошукового запиту - -Виправлено: -- Чернетки видалялися без попередження -- Видалено списки з "Керування термінами" -- Застосунок вилітає, коли встановлено проксі -- Фільтр не синхронізується після редагування -- Деякі збої / покращення diff --git a/src/fdroid/fastlane/metadata/android/uk/changelogs/454.txt b/src/fdroid/fastlane/metadata/android/uk/changelogs/454.txt deleted file mode 100644 index 7e5bbb0a..00000000 --- a/src/fdroid/fastlane/metadata/android/uk/changelogs/454.txt +++ /dev/null @@ -1,33 +0,0 @@ -Додано: -- Публікуйте випадкові цитати -- Групові репости на домашній шкалі часу -- Перейменування часових шкал Nitter -- Підтримка Android 13 -- Нумерація з пошуком / трендом -- Дозволити видалення лівого поля в повідомленнях (за замовчуванням: вимкнено) - -Змінено: -- Відображати кнопку перекладу лише тоді, коли мова відрізняється -- Повага до пробілів між словами у повідомленнях -- Кнопка фокусування стала доступнішою під час редагування медіа -- Візуальний зворотний зв'язок для блокування у списку облікових записів -- Візуальні зміни за допомогою композиції / верхньої панелі -- Використовуйте власну назву часової шкали Nitter для керування часовими шкалами - -Виправлено: -- Поведінка з перемикачем cw -- Урізані посилання на gimini -- Кнопки навігації не видно з медіа (Світла тема) -- Рядок стану з Android 5 -- Виправлено посилання, на які не можна натиснути -- Виправлено глибокі посилання -- Виправлення віддалених потоків, які не відображаються у деяких випадках -- Додавання опису до спільних медіафайлів -- Відкриття з іншими обліковими записами -- Розмір символів не дотримується для Android 5-6 -- Неправильний екземпляр отримано для instances.social -- Стрибає шкала часу при оновленні -- Посилання на згадки, теґи, URL-адреси не відображаються. -- Кастомні звуки каналів не застосовуються -- Користувачі з коротким іменем користувача не пов'язані між собою -- Виправлено збої diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/390.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/390.txt deleted file mode 100644 index 5cd2b226..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/390.txt +++ /dev/null @@ -1,5 +0,0 @@ -Những tính năng mới của Fedilab. -- Bạn có thể thu gọn chuỗi tút -- Xem trước chuỗi tút khi trả lời -- Hỗ trợ bộ nhớ đệm -- Thiết kế mới diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/391.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/391.txt deleted file mode 100644 index 5cd2b226..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/391.txt +++ /dev/null @@ -1,5 +0,0 @@ -Những tính năng mới của Fedilab. -- Bạn có thể thu gọn chuỗi tút -- Xem trước chuỗi tút khi trả lời -- Hỗ trợ bộ nhớ đệm -- Thiết kế mới diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/393.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/393.txt deleted file mode 100644 index a170f281..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/393.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Sửa nhiều lỗi -- Cải thiện tút ghim diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/394.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/394.txt deleted file mode 100644 index a35f3ae6..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/394.txt +++ /dev/null @@ -1 +0,0 @@ -- Sửa lỗi crash trên một số máy chủ Pleroma diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/395.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/395.txt deleted file mode 100644 index 2077b252..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/395.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Sửa lỗi -- Cho phép chia sẻ với app diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/396.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/396.txt deleted file mode 100644 index 4fb09298..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/396.txt +++ /dev/null @@ -1,13 +0,0 @@ -Thêm: -- Cho phép đặt điểm lấy nét trên các bản xem trước (trình chỉnh sửa media) -- Tôn trọng điểm lấy nét với các bản xem trước -- Phân trang với nút tìm nạp thêm hỗ trợ đọc lên hoặc xuống -- Thêm xu hướng - -Sửa: -- Chỉ thông báo đẩy cuối cùng được hiển thị (không được nhóm lại) -- Hành vi xấu với cuộn phải / trái -- Sửa các cấu hình dài không hiển thị đầy đủ -- Vấn đề với một số cuộc thăm dò -- Một số sự cố -- Một số hành vi xấu diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/397.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/397.txt deleted file mode 100644 index fd9fb2b3..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/397.txt +++ /dev/null @@ -1 +0,0 @@ -- Sửa lỗi được báo cáo. diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/398.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/398.txt deleted file mode 100644 index e19e446d..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/398.txt +++ /dev/null @@ -1,6 +0,0 @@ -- Tiếp tục cải thiện hành vi cuộn -- Cuộn lên đầu (chọn lại tab) sẽ tìm nạp các tin nhắn mới và sau đó cuộn lên trên cùng -- Xóa điểm lấy nét để xem trước phương tiện phù hợp -- Sửa lỗi không thể chia sẻ với một tài khoản -- Sửa chủ đề màu đen -- Sửa một số màu nút diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/399.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/399.txt deleted file mode 100644 index ac219593..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/399.txt +++ /dev/null @@ -1,16 +0,0 @@ -Thêm: -- Đặt ngôn ngữ soạn thư (từ menu soạn thư -> ba chấm dọc) -- Thêm hỗ trợ phản ứng cho Pleroma -- Thêm chỉ báo quyền riêng tư ở trên cùng bên phải - -Đã thay đổi -- Cải thiện hành vi cuộn -- Cuộn lên đầu (chọn lại tab) sẽ tìm nạp các tin nhắn mới và sau đó cuộn lên trên cùng - -Đã sửa: -- Dòng thời gian thẻ trống -- Xóa điểm lấy nét để xem trước phương tiện phù hợp -- Sửa lỗi không thể chia sẻ với một tài khoản -- Sửa chủ đề màu đen -- Không thể chọn chủ đề -- Sửa một số màu nút diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/400.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/400.txt deleted file mode 100644 index 34e4cdf7..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/400.txt +++ /dev/null @@ -1,9 +0,0 @@ -Thêm: -- Cho phép xác định số lượng ký tự tối đa khi không được phát hiện (Trong trường hợp) -- Thêm biểu tượng cảm xúc một bộ chọn khi sáng tác (phải được bật trong cài đặt) -- Thêm ghi chú phát hành với khả năng dịch chúng - -Đã sửa: -- Biểu tượng cảm xúc tùy chỉnh Friendica không được hiển thị -- Nhấn lâu để lưu trữ phương tiện -- Một số bản sửa lỗi diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/401.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/401.txt deleted file mode 100644 index 04046146..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/401.txt +++ /dev/null @@ -1,11 +0,0 @@ -Thay đổi: -- Soạn tin nhắn không còn bị buộc phải tối đa ký tự - -Sửa: -- Theo dõi nhiều tài khoản -- Không thể đăng ký nhận thông báo cho một tài khoản -- Các vấn đề khi chia sẻ -- Hồ sơ sai cho áp dụng biểu tượng cảm xúc trong thông báo -- Phát hành thẻ -- Sự cố với các tab -- Không thể đổi tên các tab diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/402.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/402.txt deleted file mode 100644 index e1becaf1..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/402.txt +++ /dev/null @@ -1,15 +0,0 @@ -Thêm: -- Chủ đề mới: Con voi bóng tối từ S1m -- Thông báo lỗi từ phía máy chủ khi đăng không thành công -- Cho phép đặt thời gian tìm nạp cho các thông báo bị trì hoãn - -Đã thay đổi: -- Tìm nạp nhiều nút hiển thị hơn - -Đã sửa: -- Sự cố khi tìm nạp các thư bị thiếu -- Một số vấn đề với chủ đề -- Mất quá nhiều không gian với phản ứng (Pleroma) -- Xóa và tạo lại các sự cố -- Sự cố khi phát video -- Các bản sửa lỗi khác diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/405.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/405.txt deleted file mode 100644 index 21cd8428..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/405.txt +++ /dev/null @@ -1,20 +0,0 @@ -Thêm: -- Xuất Cài đặt -- Tuyên truyền việc sắp xếp lại thủ công các danh sách trong dòng thời gian tới menu con "Danh sách" -- Cho phép thay đổi bộ phân phối đẩy trong cài đặt - -Đã thay đổi: -- Cải thiện hình ảnh xem trước phù hợp -- Cải thiện thông báo -- Phương tiện hồ sơ được hiển thị dưới dạng lưới - -Đã sửa: -- Một số video Peertube không hoạt động -- Tôn trọng tài khoản hiển thị mặc định khi trả lời -- GIF phân biệt đối xử từ hình ảnh -- Ứng dụng gặp sự cố khi mở dòng thời gian phiên bản bên ngoài -- Xóa nút trong trình soạn chủ đề làm hỏng ứng dụng -- Nút quay lại mở nhiều hoạt động cũ trước khi đóng ứng dụng -- Các vấn đề với việc chia sẻ -- Sắp xếp lại danh sách có vấn đề về giao diện người dùng khi thay đổi khả năng hiển thị -- Liên kết không được hiển thị chính xác trong các bài đăng từ Friendica diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/407.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/407.txt deleted file mode 100644 index c0b2080b..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/407.txt +++ /dev/null @@ -1,9 +0,0 @@ -Thêm: -- Cài đặt để đặt tất cả các mốc thời gian ở trên cùng (mặc định bị tắt) -- Cài đặt hiển thị mốc thời gian trong danh sách (mặc định bị tắt) -- Hiển thị bộ đếm cho fav / reblog trong dòng thời gian (mặc định bị vô hiệu hóa) - -Đã sửa: -- Vấn đề hiển thị khi trả lời -- Một số vấn đề về chủ đề khi sáng tác -- Một số sự cố diff --git a/src/fdroid/fastlane/metadata/android/vi/changelogs/408.txt b/src/fdroid/fastlane/metadata/android/vi/changelogs/408.txt deleted file mode 100644 index 8ca85df0..00000000 --- a/src/fdroid/fastlane/metadata/android/vi/changelogs/408.txt +++ /dev/null @@ -1,5 +0,0 @@ -- Cải thiện tốc độ cho các phiên bản Nitter -- Cho phép chỉnh sửa tài khoản Nitter bằng cách nhấn và giữ các tab -- Khắc phục sự cố phân trang với các mốc thời gian được ghim -- Sửa một số lỗi -- Khắc phục khả năng hiển thị khi hiển thị quầy