Commit Graph

3351 Commits

Author SHA1 Message Date
Konrad Pozniak b8c77a795c
prevent adding multiple tabs of the same type (#3390)
* prevent adding multiple tabs of the same type

* use Objects.hash
2023-03-01 19:59:40 +01:00
Nik Clayton 1b6108ca94
Add "Refresh" accessibility menu (#3121)
* Add "Refresh" accessibility menu to TimelineFragment

Per https://developer.android.com/reference/androidx/swiperefreshlayout/widget/SwipeRefreshLayout
the layout does not provide accessibility events, and a menu item should be
provided as an alternative method for refreshing the content.

In `TimelineFragment`:
- Implement the `MenuProvider` interface so it can populate the action bar
  menu in activities that host the fragment
- Create a "Refresh" menu item, and refresh the state when it is selected

`MainActivity` has to change how the menu is created, so that fragments
can add items to it.

In `MainActivity`:
- Call `setSupportActionBar` so `mainToolbar` participates in menus
- Implement the `MenuProvider` interface, and move menu creation there
- Set the title via supportActionBar

* Never show the refresh item as a menubar action

Per guidelines in https://developer.android.com/develop/ui/views/touch-and-input/swipe/add-swipe-interface#AddRefreshAction

* Add "Refresh" menu item for AccountMediaFragment

Also, fix the colour of the refresh progress indicator

* Implement "Refresh" for AnnouncementsActivity

* Add "Refresh" menu for ConversationsFragment

* Keep the tabs adapter over the life of the viewpager

Make `tabs` `var` instead of `val` in `MainPagerAdapter` so it can be updated
when tabs change.

Then detach the `tabLayoutMediator`, update the tabs, and call
`notifyItemRangeChanged` in `setupTabs()`.

This fixes a bug (not sure if it's this code, or in ViewPager2) where
assigning a new adapter to the view pager seemed to result in a leak of one
or more fragments. This wasn't user-visible, but it's a leak, and it becomes
user-visible when fragments want to display menus.

This also fixes two other bugs:

1. Be on the left-most tab. Scroll down a bit. Then modify the tabs at
   "Account preferences > tabs", but keep the left-most tab as-is.

   Then go back to MainActivity. Your reading position in the left-most
   tab has been jumped to the top.

2. Be on any non-left-most tab. Then modify the tab list by reordering tabs
   (adding/removing tabs is also OK).

   Then go back to MainActivity. Your tab selection has been overridden,
   and the left-most tab has been selected.

Because the fragments are not destroyed unnecessarily your reading position
is retained. And it remembers the tab you had selected, and as long as that
tab is still present you will be returned to it, even if it's changed
position in the list.

Fixes https://github.com/tuskyapp/Tusky/issues/3251

* Add "Refresh" menu for ScheduledStatusActivity

* Lint

* Add "Refresh" menu for SearchFragment / SearchActivity

* Explicitly set the searchview width

Using "collapseActionView" requires the user to press "Back" twice to exit
the activity, which is not acceptable.

* Move toolbar handling in to ViewThreadActivity

Previous code had the toolbar in the fragment's layout. Refactor to make
consistent with other activities, and move the toolbar in to the activity
layout.

Implement MenuProvider in ViewThreadFragment to adjust the menu in the
activity.

* Add "Refresh" menu to ViewThreadFragment

* Implement "Refresh" for ViewEditsFragment

* Lint

* Add "Refresh" menu to ReportStatusesFragment

* Add "Refresh" menu to NotificationsFragment

* Rename menu resource files

Be consistent with the layout resource files, which have an activity/fragment
prefix, then the lower_snake_case name of the activity or fragment it's for.

* Only enable refresh menu if swiptorefresh is enabled

Some timelines don't have swipetorefresh enabled (e.g., those shown on
AccountActivity). In those cases don't add the refresh menu, rely on the
hosting activity to provide it.

Update AccountActivity to provide the refresh menu item.
2023-03-01 19:58:18 +01:00
Mārtiņš Bruņenieks 29fc449f04 Translated using Weblate (Latvian)
Currently translated at 95.0% (538 of 566 strings)

Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/lv/
Translation: Tusky/Tusky
2023-02-28 21:35:54 +00:00
Nik Clayton ddc4d76c41
Lazily load activities in Robolectric tests (#3397)
Not all Robolectric tests interact with activities, so lazy loading the activity can speed them up.

I benchmarked the impact with gradle-profiler. Each test run performed 6 warmup runs, and then 10 benchmarked runs with and without this change.

Without this change (all values rounded to nearest second):
Mean: 151
Median: 149
P75: 157
StdDev: 10

With this change:
Mean: 127
Median: 125
P75: 130
StdDev: 7

So a ~ 18% reduction in median and P75 times,
2023-02-28 21:28:05 +01:00
UlrichKu b4d10c9613
3204: Add an account based preference store (#3205)
* 3204: Add an account based preference store

* 3204: (related) reformat a bit, add todo

* 3204: Use the preference data store for all three account settings

* 3204: Move event handling to account settings handler

* 3204: Correct includes

* 3204: Appease linter

* 3204: Appease linter again

* 3204: Add an account based preference store

* 3204: Use the preference data store for all three account settings

* 3204: Move event handling to account settings handler

* 3204: Correct includes

* 3204: Add general "preference upgrade loop stepper"; use it for removing obsolete account settings (in shared)

* 3204: Add missing spaces

* 3204: Key is non-nullable

* 3204: Upgrade to new settings migration code

* 3204: Remove (commented) DI code
2023-02-27 14:07:28 +01:00
Ricard Torres 7751b88a57 Translated using Weblate (Catalan)
Currently translated at 100.0% (566 of 566 strings)

Co-authored-by: Ricard Torres <ricard@ricard.dev>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ca/
Translation: Tusky/Tusky
2023-02-27 12:03:21 +00:00
XoseM 46d00a3108 Translated using Weblate (Galician)
Currently translated at 100.0% (566 of 566 strings)

Co-authored-by: XoseM <xosem@disroot.org>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/gl/
Translation: Tusky/Tusky
2023-02-27 12:03:21 +00:00
Garutmaan Garuda 81f3474583 Translated using Weblate (Sanskrit)
Currently translated at 88.8% (503 of 566 strings)

Co-authored-by: Garutmaan Garuda <garutmaangaruda@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/
Translation: Tusky/Tusky
2023-02-27 12:03:21 +00:00
Quentí 03640c8ce7 Translated using Weblate (Occitan)
Currently translated at 100.0% (566 of 566 strings)

Co-authored-by: Quentí <quentinantonin@free.fr>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/
Translation: Tusky/Tusky
2023-02-27 12:03:21 +00:00
UlrichKu 6b9db02c08
3311 load more more prominent (#3376)
* 3311: Add a zig-zag line to top and bottom of "load more"

* 3311: Remove unneeded extensions

* 3311: Use a simple gradient instead of zigzag line

* 3311: Use a simple gradient drawable (remove custom view)

* 3311: Remove gradient lines
2023-02-27 11:33:11 +01:00
Nik Clayton 10f983c953
Ignore clicks outside the start/end of a line (#3380)
* Ignore clicks outside the start/end of a line

`LinkMovementMethod` has a bug in its calculation of the clickable width of a span on a line. If the span is the last thing on the line the clickable area extends to the end of the view. So the user can tap what appears to be whitespace and open a link.

Previous code tried to fix this by adding a zero-width space after the link so that `LinkMovementMethod` wouldn't consider it empty. However the ZWS was selected by copy/paste operations, resulting in junk results if users tried to copy the link.

Fix this by subclassing `LinkMovementMethod` and fixing the click detection code to ignore clicks that are outside the bounds of the line that was clicked on.

Remove the code that adds the ZWS.

Fixes https://github.com/tuskyapp/Tusky/issues/1567

* Assume arguments are all non-null

* Use `object` for singleton

* getInstance as a one-liner
2023-02-27 08:54:51 +01:00
Konrad Pozniak 9340e7a6f4
update Glide to 4.15.0 (#3384) 2023-02-27 08:54:26 +01:00
Goooler 000681c702
Add extra proguard rules for OkHttp (#3350)
* Add extra proguard rules for OkHttp

339732e3a1/okhttp/src/jvmMain/resources/META-INF/proguard/okhttp3.pro (L11-L14)

* Update proguard-rules.pro
2023-02-25 21:40:13 +01:00
Goooler 2da7bc5bc8
Use TypedArray.use to obtain attrs (#3349)
17346638ff/core/core-ktx/src/main/java/androidx/core/content/res/TypedArray.kt (L227-L236)
2023-02-25 21:30:52 +01:00
fruyek d4eb744241
Perform unicode text isolation on user names in post edit history view (#3342) 2023-02-25 21:27:54 +01:00
Levi Bard 2e189a17dc
When looking up fediverse urls, verify that account results returned match the input query. (#3341)
Fixes #2804
2023-02-25 21:27:26 +01:00
Nik Clayton fda8c80949
Use an explicit SCHEMA_VERSION instead of BuildConfig.VERSION_CODE (#3324)
* Use an explicit SCHEMA_VERSION instead of BuildConfig.VERSION_CODE

Every nightly release has a new BuildConfig.VERSION_CODE, so the previous
code would not do the right thing.

Require the schema version to be explicitly set. While I'm here, provide
a clear set of guidelines as to what has to happen when the schema changes.

* Improve documentation links
2023-02-25 21:22:49 +01:00
UlrichKu 4ab305f3dc
2528: Do not remove notifications on general resume (#3312)
* 2528: Do not remove notifications on general resume

* 2528: Have notification removal in the right onResume
2023-02-25 21:18:03 +01:00
Levi Bard f2b07196e6
Improve language list prioritization. (#3293)
Partially addresses #3277
2023-02-25 21:15:21 +01:00
Nik Clayton 4a0251800d
Fix lifecycle handling bug (#3319)
Fragments can go `onCreate` -> `onCreateView` -> `onViewCreated` -> `onDestroyView` without transitioning through `onStart`.

The previous code assumed `onStart` was always called. 

Se https://itnext.io/an-update-to-the-fragmentviewbindingdelegate-the-bug-weve-inherited-from-autoclearedvalue-7fc0a89fcae1
2023-02-25 21:06:22 +01:00
Goooler c6f7ecdb5b
Gradle 8.0.1 (#3338)
https://docs.gradle.org/8.0/release-notes.html
2023-02-25 20:59:39 +01:00
Eric Frohnhoefer 9e0ff78fb4
Fix media controller UI not showing during audio playback (#3286)
* Update ViewVideoFragment.kt

Testing
 - Open audio attachment: https://solarpunk.moe/@vv/109562659215759090
 - Ensure media control UI and alt text is shown once playback starts

Fixes #3261

* Fix commit issue

* Fix spacing
2023-02-23 19:41:16 +01:00
Nik Clayton 70092c8de2
Make "Up" and "Overflow" menu icons more visible in AccountProfile (#3272)
* Make "Up" and "Overflow" menu icons more visible in AccountProfile

The toolbar in AccountProfile is transparent, so any profile image the user
has chosen is shown under it.

This makes the "Up" and "Overflow" menu icons also have transparent
backgrouns.

Consequently, they can be hard to spot, or possibly invisible, on backgrounds
that are very dark or very light.

Fix this by compositing the icons in a LayerDrawable, with a circular
background identical to the surface colour. This ensures they stand out
against the background image, and blend in when the user scrolls.

* Get and reuse the background drawable

* Apply a smidgen of transparency
2023-02-23 19:30:27 +01:00
Danial Behzadi 837a91e12c Translated using Weblate (Persian)
Currently translated at 100.0% (566 of 566 strings)

Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Deleted User 766dab2173 Translated using Weblate (German)
Currently translated at 100.0% (566 of 566 strings)

Co-authored-by: Deleted User <noreply+263@weblate.org>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Mārtiņš Bruņenieks 5e3d6a8f97 Translated using Weblate (Latvian)
Currently translated at 95.0% (536 of 564 strings)

Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/lv/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
XoseM d82200569e Translated using Weblate (Galician)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: XoseM <xosem@disroot.org>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/gl/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Garutmaan Garuda 6923a4e06d Translated using Weblate (Sanskrit)
Currently translated at 85.1% (480 of 564 strings)

Co-authored-by: Garutmaan Garuda <garutmaangaruda@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Hồ Nhất Duy 78a6bde25a Translated using Weblate (Vietnamese)
Currently translated at 100.0% (566 of 566 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Hồ Nhất Duy <mastoduy@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/vi/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Ihor Hordiichuk 2b92fabdc0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (566 of 566 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/uk/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Sveinn í Felli e6c5f61da6 Translated using Weblate (Icelandic)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/is/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Eric afebee1f27 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (566 of 566 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Eric <alchemillatruth@purelymail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Manuel b0df135b99 Translated using Weblate (Italian)
Currently translated at 99.2% (560 of 564 strings)

Co-authored-by: Manuel <mannivuwiki@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/it/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Gera, Zoltan 94a4926259 Translated using Weblate (Hungarian)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Gera, Zoltan <gerazo@manioka.hu>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hu/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Paul Sanz 6a3cc8cbd2 Translated using Weblate (Spanish)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Paul Sanz <registro@polkillas.net>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Enzo Martín Segovia 3a151b7660 Translated using Weblate (Spanish)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Enzo Martín Segovia <enzo_seg@outlook.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Deleted User 37440b333e Translated using Weblate (German)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Deleted User <noreply+259@weblate.org>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
puf fe2cc4a8e5 Translated using Weblate (Welsh)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: puf <puffinux@tutanota.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cy/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Newidyn dd89fe53c4 Translated using Weblate (Welsh)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Newidyn <grugallt@protonmail.ch>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cy/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Ricard Torres b5e33e5730 Translated using Weblate (Catalan)
Currently translated at 100.0% (564 of 564 strings)

Co-authored-by: Ricard Torres <ricard@ricard.dev>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ca/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
ButterflyOfFire 640a6faaae Translated using Weblate (French)
Currently translated at 84.3% (476 of 564 strings)

Translated using Weblate (Arabic)

Currently translated at 97.6% (551 of 564 strings)

Co-authored-by: ButterflyOfFire <butterflyoffire@protonmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ar/
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/
Translation: Tusky/Tusky
2023-02-21 18:37:00 +00:00
Nik Clayton 2974265c4a
Use the adapter position when responding to clicks on followed tags (#3334)
This ensures that the position is valid w.r.t. to the backing array.

Fixes https://github.com/tuskyapp/Tusky/issues/3333
2023-02-20 20:36:37 +01:00
Nik Clayton 15fb8ad43f
Update avatar size/placement for follow requests (#3280)
Use the same icon size/placement as other notifications.

Fixes https://github.com/tuskyapp/Tusky/issues/3279
2023-02-20 20:30:32 +01:00
Goooler 6cc79c8d75
Use unsafeLazy to simplify thread unsafe lazy initializations (#3276) 2023-02-20 20:14:54 +01:00
Nik Clayton 27f6976295
Add FAB to follow new hashtags from FollowedTagsActivity (#3275)
- Add a FAB for user interaction (hide on scroll if appropriate)
- Show a dialog to collect the new hashtag
- Autocomplete hashtags the same as when composing a status
2023-02-20 20:14:16 +01:00
Levi Bard 41d493e72a
Allow viewing of the account header image. (#3274)
Fixes #3254
2023-02-20 20:06:50 +01:00
Goooler cfea5700b0
Code cleanups (#3264)
* Kotlin 1.8.10

https://github.com/JetBrains/kotlin/releases/tag/v1.8.10

* Migrate onActivityCreated to onViewCreated

* More final modifiers

* Java Cleanups

* Kotlin cleanups

* More final modifiers

* Const value TOOLBAR_HIDE_DELAY_MS

* Revert
2023-02-20 19:58:37 +01:00
Nik Clayton 52c98749e6
Fetch list title from second values in arguments (#3327)
Previous code was:

```
for (i in tabs.indices) {
    // ...
    if (tabs[i].id == LIST) {
        tab.contentDescription = tabs[i].arguments[1]
    } else {
        tab.setContentDescription(tabs[i].text)
    }
    // ...
```

When I converted it over, `i` was replaced with `position`, but I misread `tab.contentDescription = tabs[i].arguments[1]` as `tab.contentDescription = tabs[i].arguments[i]`.

Put the `1` back.
2023-02-16 20:43:44 +01:00
mcclure ab364712fe
Previous attempt to fix git sha on non-git build broke git build. (#3322)
This uses unusual code provided by Mikhail Lopatkin of Gradle Inc:
https://github.com/gradle/gradle/issues/23914#issuecomment-1431909019
It wraps the git sha function in a "value source". This allows it to interact correctly with configuration caching.
Because the code is longer than before, it is now broken out into its own file getGitSha.gradle.
2023-02-16 20:20:52 +01:00
Nik Clayton 196ebdb386
Keep the tabs adapter over the life of the viewpager (#3255)
Make `tabs` `var` instead of `val` in `MainPagerAdapter` so it can be updated
when tabs change.

Then detach the `tabLayoutMediator`, update the tabs, and call
`notifyItemRangeChanged` in `setupTabs()`.

This fixes a bug (not sure if it's this code, or in ViewPager2) where
assigning a new adapter to the view pager seemed to result in a leak of one
or more fragments. This wasn't user-visible, but it's a leak, and it becomes
user-visible when fragments want to display menus.

This also fixes two other bugs:

1. Be on the left-most tab. Scroll down a bit. Then modify the tabs at
   "Account preferences > tabs", but keep the left-most tab as-is.

   Then go back to MainActivity. Your reading position in the left-most
   tab has been jumped to the top.

2. Be on any non-left-most tab. Then modify the tab list by reordering tabs
   (adding/removing tabs is also OK).

   Then go back to MainActivity. Your tab selection has been overridden,
   and the left-most tab has been selected.

Because the fragments are not destroyed unnecessarily your reading position
is retained. And it remembers the tab you had selected, and as long as that
tab is still present you will be returned to it, even if it's changed
position in the list.

Fixes https://github.com/tuskyapp/Tusky/issues/3251
2023-02-15 19:17:59 +01:00