1680 Commits

Author SHA1 Message Date
Nik Clayton
a441576bf6
style: Require trailing comma, and break lines
Requiring trailing commas on multi-line lists of items (declarations
and call sites) reduces future repository churn when those lines are
changed, but introduces additional churn now.

Bite the bullet and make the change, as well as adjusting lines that
were too long / indented incorrectly.

The changes were performed automatically, using the `ktlintFormat` task.

Based on https://github.com/tuskyapp/Tusky/pull/3968 by
https://github.com/tinsukE
2023-09-04 20:22:10 +02:00
Nik Clayton
cf26af25d8
docs: Update copyright statement on relevant files
Update the copyright statement on files I wrote or substantially
rewrote.
2023-09-04 20:22:09 +02:00
Nik Clayton
72ebeb3400
fix: Add support for filtering notifications
Filters that the user had set for the notifications timeline were not
being applied.

Fix this in NotificationsViewModel; fetch the user's filters and apply
them against the status in a notification. If the status should be
hidden it is removed, and if it should show a warning it does so.

The user can click through the warning to show the status.
2023-09-04 20:22:09 +02:00
Nik Clayton
fc2a830ea1
feat: Remove explicit "Load more", load on demand
Prior to this change the user had to repeatedly tap "Load more" when
scrolling. This is tedious for the user.

In addition, the previous code had bugs that meant that not all statuses
were being loaded. Users could leave the app for a while (overnight,
say), and when returning would discover far fewer statuses than had
actually been posted.

Fix this, following the architecture first introduced for notifications
(Fragment -> ViewModel -> Repository -> Source/Mediator).

- Load statuses for cached and non-cached timelines using Paging3
- Show Failures during a load, and the user can retry
- Delete the "Reading order" preference, it is no longer necessary
2023-09-04 20:22:08 +02:00
Nik Clayton
6539146b58
feat: Allow the user to choose a different font
Android's choices for font customisation can be limited, depending on
the vendor. Allow users to choose from a small collection of embedded
fonts, chosen by asking users for recommendations.

The font choice is implemented as a preference. Provide a custom dialog
that shows the fonts (in that font) so the user can see what they're
choosing between.

Ensure the font's license information is displayed in the "About"
section.
2023-09-04 20:22:07 +02:00
Nik Clayton
dfc16c0351
fix: Ensure third party code is properly credited
The previous code did not credit all third party code used in the app,
or provide access to the licenses.

Fix this by adopting the "aboutlibraries" library, which processes
dependencies at build time and generates a list of dependencies,
versions, and license information to display to the user.

Use this to also ensure that the non-source dependencies (artwork,
emoji) are given appropriate credit.
2023-09-04 20:22:07 +02:00
Nik Clayton
369979a60e
feat: Allow the user to specify an arbitrary number of tabs
- Remove the existing restriction on the number of tabs
- Allow the tabs to scroll to display more
- Update UI and text resources to remove obsolete content
2023-09-04 20:22:05 +02:00
Nik Clayton
b1fd20e005
feat: Support "Trending posts"
- Implement the trending posts API
- Display trending statuses as a new Timeline kind
- Allow the user to add trending statuses to a dedicated tab
- Always show the "Trending" option in the navigation menu
2023-09-04 20:22:04 +02:00
Nik Clayton
049710e0b0
feat: Support "Trending links"
- Implement the trending links API
- Provide a Fragment/ViewModel/Repository and Adapter/ViewHolder set
  to display the content
- Show all trends (as a pageable fragment list) in TrendingActivity
- Allow the user to add trending links to a dedicated tab
- Always show the "Trending" option in the navigation menu
2023-09-04 20:22:04 +02:00
Levi Bard
10a6b1616a
Editing profile: No change warning on leave. (#3972)
### Objective
* Prevent data loss when the user inadvertently hits back or wants to
leave the profile edition with unsaved changes.

### Description
* To limit the number of changes to the existing codebase, I merely
re-used the same method used by `save()` in the ViewModel to decide
whether to make a network request or simply return the profile as-is.
* ~A bit of code juggling around in the ViewModel and I was able to use
the logic for all the encoding of each profile field (Which is what the
ViewModel caches in memory).~ Thanks @Lakoja for improving this in the
VM.
* A couple of internal data classes used as helpers to move all the
fields around (now that they are no longer used in one single place)
were introduced.

### Potential Optimizations
* ~The profile encoding is done twice (once for checking, and then again
if the user has to actually save it). I'd say this is a negligible price
to pay, since the alternative would be to create a different set of
comparisons and/or keeping another profile in memory for the purpose of
comparison.~

### Visual Improvement
* I believe the Dialog is difficult to see, but it's being displayed
with Tusky's theme. Perhaps there's a better style to apply in this
case? (or maybe the edit profile activity shouldn't have the same
background color as dialogs?!)


### Issue
* #3486
2023-08-28 14:13:24 +02:00
Mike Haynes
5764efa5d4
Allow the user to add a "bookmarks" tab (#3983)
Fixes #2368
2023-08-24 16:21:43 +02:00
Martin Marconcini
387c3989d7
Apply PR suggestions:
* Remove dialog title and string
* Rename Data Class
* Use liveData.value directly when possible
2023-08-24 10:06:25 +02:00
Martin Marconcini
2d52ab9072
Merge branch 'develop' into prompt_to_save_before_leaving_changed_profile 2023-08-23 15:50:43 +02:00
Lakoja
45d2fa1570 3486: (Appease linter) 2023-08-23 15:06:08 +02:00
SpaceFox
85888ac238
Uses the system theme as default theme (#3813)
Set the "System Design" as the default theme.

This ensures that the app's initial behaviour respect's the user's system-wide theme choice, while still allowing the user to adjust it later.

This is only done for new installs of Tusky. If the user is upgrading from a previous release and they did not have an explicit theme set then the dark theme is used, and the UX does not change.
2023-08-23 15:04:24 +02:00
Lakoja
3a40274003 3486: Re-introduce separate check method to not need a synthetic accessor (lint error) 2023-08-22 21:17:22 +02:00
Nik Clayton
f49b1cc744
Fix exception when updating summary notifications (#3976)
dc9e9f2aeb
modifed the code that fetched the value of EXTRA_NOTIFICATION_TYPE in an
intent, to use getSerializable().

However, the value was being placed in to the intent using putString().

This caused an exception when trying to update the summary notification,
so it would never update.

```
java.lang.ClassCastException: java.lang.String cannot be cast to com.keylesspalace.tusky.entity.Notification$Type
    at com.keylesspalace.tusky.components.notifications.NotificationHelper.updateSummaryNotifications(NotificationHelper.java:321)
    at com.keylesspalace.tusky.components.notifications.NotificationFetcher.fetchAndShow(NotificationFetcher.kt:87)
    at com.keylesspalace.tusky.components.notifications.NotificationFetcher$fetchAndShow$1.invokeSuspend(Unknown Source:14)
```

Fix this by placing the value in to the intent using putSerializable(),
to match how it will be fetched.
2023-08-22 18:22:45 +02:00
Lakoja
ba50ff5686 3486: Separate diff and encoding 2023-08-22 16:12:03 +02:00
Lakoja
f09f464667 3486: Rename stuff 2023-08-22 15:52:09 +02:00
Martin Marconcini
84915e6af5
Merge branch 'develop' into prompt_to_save_before_leaving_changed_profile 2023-08-22 13:06:27 +02:00
Martin Marconcini
e56c0cb5a3
Avoid synthetic accessors. 2023-08-22 12:49:33 +02:00
Martin Marconcini
8edc8d6422
Make profileData internal so there's no synthetic accessor required. 2023-08-22 12:19:38 +02:00
Martin Marconcini
c446d510e4
Fix lint double space. 2023-08-22 12:08:13 +02:00
Martin Marconcini
06239bb8a1
Fix synthetic accessor lint error. 2023-08-22 12:05:11 +02:00
Martin Marconcini
634f020ffa
Apply klint recommendations. 2023-08-19 17:57:25 +02:00
Martin Marconcini
461ec8d722
Prompt user before leaving edit profile when any field has been modified. 2023-08-19 17:36:00 +02:00
Nik Clayton
059352f471
Display notification filter/clear actions as menu items (#3877)
Previously the notification filter and clear actions were shown as
buttons in the UI, with a preference that determined whether they were
displayed.

Remove this preference, and display them as menu items.

- "Filter notifications" is shown as an icon, if possible
- "Clear notifications" is only ever shown as a menu item, to reduce the
chance the user inadvertently selects it

To ensure that the options menu appears correctly, remove the code that
creates a "fake" action bar, and adjust the layouts so that there are
three toolbars;

- mainToolbar -- displays the icons, and the current "location" (Home,
Notifications, etc)
- topNav -- displays the row of tabs at the top
- bottomNav -- displays the row of tabs at the bottom

Only one of them is set as the support action bar (depending on the
user's preferences). This provides the "show a logo" and "show the
options menu" functionality as standard, without needing to re-implement
as the previous code did.
2023-08-19 14:41:10 +02:00
Angelo Suzuki
c7ffc6ad93
Hide option to mute own domain from account profile page (it is a no-op). (#3937)
Muting your own server domain is a no-op. Check for this case, and remove the "mute" menu item if true.

Fixes #3798
2023-08-19 14:17:04 +02:00
Nik Clayton
b6102a755a
Rename "Trending" to "TrendingTags" or similar where necessary (#3906)
The "trending" functionality will expand to include trending links and
posts. But at the moment the "Trending" references in the code are
exclusively to hashtags.

Rename "Trending" to "TrendingTags" or similar everywhere necessary in
order to prepare for this.

This includes a database migration, as the identifier for the "Trending
tags" tab in the account preferences was changed from "Trending" to
"TrendingTags". The migration updates the stored value if necessary.
2023-08-19 12:54:35 +02:00
Konrad Pozniak
dc9e9f2aeb
Improve account switching intents (#3732)
Before, intent creation was scattered across multiple sites, with account switching logic in both `ComposeActivity` and `MainActivity`.

Now, intents are only created in `MainActivity` Companion, and account switching only occurs in `MainActivity`

Fixes #3695
2023-08-19 12:31:47 +02:00
Martin Marconcini
85f0b1f320
Prompt the user before deleting a filter
Prevent users from accidentally deleting filters by prompting them to confirm.

Add an AlertDialog extension that converts AlertDialog callbacks to linear control flow.

Fixes #3736.
2023-08-17 22:26:46 +02:00
Nik Clayton
58521b3370
Remove unnecessary log message in CompositeWithOpaqueBackground (#3955) 2023-08-14 12:00:21 +02:00
Nik Clayton
8529f309ff
Migrate to androidx-media3 video player (#3857)
Behaviour is consistent with previous player except that:

- Swapping apps while a video is playing, and then returning to Tusky,
will keep the seek position in the video instead of returning to the
start
- The controls/media description can be shown by tapping anywhere, not
just on the video itself
- The media description is on-screen for the same duration as the player
controls (5 seconds here, 3 seconds in the previous code)
- The user has options to control the playback speed
- Rotating the device does not squash/stretch the video
- Show the media preview when playing audio-only files

Fixes https://github.com/tuskyapp/Tusky/issues/3329,
https://github.com/tuskyapp/Tusky/issues/3141,
https://github.com/tuskyapp/Tusky/issues/3126,
https://github.com/tuskyapp/Tusky/issues/2753,
https://github.com/tuskyapp/Tusky/issues/3508,
https://github.com/tuskyapp/Tusky/issues/3291

---------

Co-authored-by: mcc <andi.m.mcclure@gmail.com>
2023-08-10 19:31:55 +02:00
Nik Clayton
09d4f62004
Start/end the thread divider in the middle of the avatar (#3892)
Previously, the thread indicator would start at the top of the avatar
for the status at the start of the thread, and end at the top of the
avatar for the status at the end of the thread.

If these avatars were partially transparent the thread indicator could
either (a) poke out of the top of the avatar at the start of the thread,
(b) not properly connect with the avatar at the end of the thread, or
(c) both.

Partially fix this by making the divider start/stop in the middle of the
avatar. This assumes that this area will typically have opaque content,
even if some of the rest of the avatar is transparent. This is not
always true, but it's still better than the current behaviour.
2023-08-10 19:25:33 +02:00
Nik Clayton
4169dc34c0
Composite semi-transparent avatars over a solid background (#3874)
Avatars that are semi-transparent are a problem when viewing a thread,
as the line that connects different statuses in the same thread is drawn
underneath the avatar and is visible.

Fix this with a CompositeWithOpaqueBackground Glide transformation that:

1. Extracts the alpha channel from the avatar image
2. Converts the alpha to a 1bpp mask
3. Draws that mask on a new bitmap, with the appropriate background
colour
4. Draws the original bitmap on top of that

So any partially transparent areas of the original image are drawn over
a solid background colour, so anything drawn under them will not appear.
2023-08-08 23:09:59 +02:00
Nik Clayton
791092ef13
Fix extra clicks on media tab (#3930)
If:

1. You're viewing an account's media tab
2. Some of the media was marked sensitivei
3. The `alwaysShowSensitiveMedia` setting was `true`

tapping on the image (once) would do nothing visible, because it was
treated as the "reveal sensitive media" tap. You had to tap on it a
second time to open it.

Fix this, by passing the preference value through to the relevant code.

---------

Co-authored-by: Tiga! <maxiinne@proton.me>
2023-08-07 19:30:56 +02:00
Nik Clayton
5d4c14aed9
Correct the calculations for choosing the earliest day to show in the calendar / selected day (#3923)
To determine the earliest day to show in the calendar, take the current
date/time, add the minimum scheduled seconds buffer (which may roll the
date/time over to the next day), and then clamp to the start of that
day. So it's either today (if the current time + minimum scheduled
seconds is less than midnight) or it's tomorrow.

When displaying the calendar work around a misfeature in Material Date
Picker. It accepts UTC seconds-since-epoch, but does not convert it to
the local time for display.

While I'm here, show the selected day in the time picker's title.

Fixes https://github.com/tuskyapp/Tusky/issues/3916
2023-08-07 19:30:08 +02:00
Nik Clayton
846289b8cc
Add support for setting a list's "exclusivity" option (#3932)
Fixes #3831
2023-08-06 20:29:34 +02:00
Mike Barnes
6766509977
Use case-insensitive checks when comparing account URLs in search (#3931)
Fixes #3929
2023-08-06 13:45:48 +02:00
Angelo Suzuki
a84d7f56a0
Filters> Tabs: use checkbox instead of switch (#3927)
Nowhere else in the preferences are checkboxes used.

Also removed the now unused extension function.

Fixes #3535
2023-08-06 11:50:11 +02:00
UlrichKu
cb8a09d3f7
Officially rename error elephant to errorphant (#3922)
In honor of
https://strangeobject.space/@esther/109866090382540100
https://masto.ai/@mynotaurus/110826349670549779
2023-08-05 15:39:07 +02:00
Nik Clayton
f5b89f855f
Show the correct tab title when opening the activity (#3915)
The previous code used `notificationTabPosition`, which was never
changed, so always 0.

This meant that if you e.g., got to `MainActivity` by clicking on a
notification, and the notification tab was current, the title would
still show "Home".

Fix that by using the existing `position` variable which represents the
currently selected tab, and ensure the correct title is shown.

Fixes #3864.
2023-08-03 21:49:19 +02:00
Nik Clayton
9cda091d03
Show additional bug report info in AboutActivity (#3802)
Make it easier for people to find information we need for a bug report,
and show it on AboutActivity.

New info is:

- Device manufacturer (e.g., "Google") and model (e.g., "Pixel 4a (5G)")
- Android version (e.g., "13")
- SDK version (e.g., "33")
- Active account (e.g., "@Tusky@mastodon.social")
- Server's version (e.g., "4.1.2+nightly-20230627")

All info is copyable to make it easy to include in a bug report. A
button to copy the information is also shown.
2023-08-03 12:20:35 +02:00
Goooler
40bd95d752
Kotlin 1.9.0 (#3835)
Update to Kotlin 1.9.0 and migrate to newer language idioms.

- Remove unnecessary @OptIn for features migrated to mainstream
- Use `data object` where appropriate
- Use new enum `entries` property
2023-08-02 09:04:24 +02:00
Nik Clayton
79ee2dc32c
Fix image zoom / pan / scroll / swipe (#3894)
Migrate to touchimageview from photoview, and adjust the touch logic to correctly handle single finger drag, two finger pinch/stretch, flings, taps, and swipes.

As before, the features are:

- Single tap, show/hide controls and media description
- Double tap, zoom in/out
- Single finger drag up/down, scale/translate image, dismiss if scrolled too far
- Single finger drag left/right
  - When not zoomed, swipe to next image if multiple images present
- When zoomed, scroll to edge of image, then to next image if multiple images present
- Two finger pinch/zoom, zoom in/out on the image

Behaviour differences to previous code

1. Bug fix: The image can't get "stuck" when zoomed, and impossible to scroll
2. Bug fix: Pinching is not mis-interpreted as a fling, closing the image
3. Bug fix: The zoom state of images is not lost or misinterpreted when the user swipes through multiple images
4. Bug fix: Double-tap zooms all the way, instead of stopping
5. Tapping outside the image does not dismiss it, controls and description show/hide

Fixes https://github.com/tuskyapp/Tusky/issues/3562, https://github.com/tuskyapp/Tusky/issues/2297
2023-07-31 12:44:01 +02:00
Konrad Pozniak
97713b06da
Always update the filter display, even when the list is empty (#3880)
Fixes #3839, https://github.com/tuskyapp/Tusky/issues/3525
2023-07-27 13:44:28 +02:00
Konrad Pozniak
ee711598c7
Cache locked state of connected accounts (#3790)
Small improvement to the behavior on bad/disconnected networks

Fixes https://github.com/tuskyapp/Tusky/issues/3773
2023-07-27 00:09:26 +02:00
Nik Clayton
e852aa64a5
Show the throwable error message when an upload fails (#3838) 2023-07-26 23:36:29 +02:00
Nik Clayton
406152d5b9
Clear listeners, hide icons when appropriate (#3870)
Preferences are shown using view holders.

The previous code did not clear the listeners or hide the icons if
necessary.

The practical upshot of this was that if you had two or more slider
preferences, *and* they were situated more than a screen's height apart,
the viewholder from the first one would get reused.

And if the first one enabled icons then the second one would show them.
And clicking on the second one would also call the listeners for the
first one.
2023-07-26 17:00:08 +02:00
UlrichKu
e4c2476f34
Retain text in search view when switching tabs before first search (#3540)
Fixes #3527
2023-07-19 11:40:08 +02:00