builds upon work from #4082
Additionally fixes some deprecations and adds support for [predictive
back](https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture).
I also refactored how the activity transitions work because they are
closely related to predictive back. The awkward
`finishWithoutSlideOutAnimation` is gone, activities that have been
started with slide in will now automatically close with slide out.
To test predictive back you need an emulator or device with Sdk 34
(Android 14) and then enable it in the developer settings.
Predictive back requires the back action to be determined before it
actually occurs so the system can play the right predictive animation,
which made a few reorganisations necessary.
closes#4082closes#4005
unlocks a bunch of dependency upgrades that require sdk 34
---------
Co-authored-by: Goooler <wangzongler@gmail.com>
There are some new rules, I think they mostly make sense, except for the
max line length which I had to disable because we are over it in a lot
of places.
---------
Co-authored-by: Goooler <wangzongler@gmail.com>
When viewing a video in Tusky, there is a top toolbar where the
description is shown and the bottom toolbar where play, forward,
backward, and scrub controls are found. In both Tusky 23 and the new
media3 video player code, the logic for showing these toolbars is
*unrelated*; Tusky catches tap events and shows and hides the
description, and the Android media library separately catches tap events
and shows and hides the bottom toolbar. Meanwhile, Tusky and the Android
media library each separately manage a set of logic for auto-hiding
their respective toolbars after a certain number of seconds has passed.
This all results in several problems:
- The top and bottom toolbars can desync, so that one is visible and the
other is not, and tapping to show/hide after this will only swap which
one is visible. This happens *every* time you switch to another
application then back to Tusky while the video player is up.
- You can also desync the top and bottom toolbars in this way by simply
tapping very rapidly.
- The autohide logic was difficult for us to control or customize,
because it was partially hidden inside the Android libraries (relevant
because under media3, the autohide delay increased from 3 to something
like 5 or 6 seconds).
In this patch, I disabled all auto- and tap-based show/hide logic in
media3 and set the Tusky-side show/hide to directly control the media3
toolbar. I then audited the code with printfs until I understood the
state machine of show/hide, and removed anything irrational (some code
was either unreachable, or redundant; either these lines were broken in
the media3 transition, or they never worked).¹
While doing this, I made two policy changes:
- As discussed on Matrix, the autohide delay is now 4 seconds. (In
discussions with users on Mastodon, some complained the previous 3
seconds was too short; but in my opinion and [I think?] charlag's, the
new 5 seconds is too long).
- In the pre-existing code, if the user has hidden the controls, and
they switch to another app and back, the controls display for 4 seconds
then re-hide themselves, just like if the video had been presented for
the first time. I think this is good and kept it— *however* I made a
decision if the user intentionally taps to display the controls, *then*
switches to another app and back, the controls should *not* auto-hide,
because the user most recently requested those controls be shown.
Tests I performed on the final PR (successfully):
- Start video. Expect: toolbar+description hides after 4 seconds.
- Start video. Pause. Resume. Expect: t+d hides after 4 seconds.
- Start video. Wait 4 seconds until t+d hide. Switch to other app.
Switch back. Expect: t+d reappears, then hides after 4 seconds.
- Start video. Wait 4 seconds until t+d hide. Tap to show t+d. Switch to
other app. Switch back. Expect: t+d appear, do NOT autohide.
- Start video. Before 4 seconds up, switch to other app. Switch back.
Expect: t+d reappears, then hides after 4 seconds.
- Start video. Pause. Resume. Before 4 seconds up, switch to other app.
Switch back. Expect: t+d reappears, then hides after 4 seconds.
- Start video. Wait 4 seconds until t+d hide. Tap rapidly over and over
for many seconds. Expect: Nothing weird
- Start *audio*. Expect: At no point does controller autohide, not even
if I switch to another app and back, but I can hide it by manually
tapping
These tests were performed on Android 13. There is an entirely separate
`Build.VERSION.SDK_INT <= 23` path I did not test, but Android Studio
says this is dead code (I think it thinks our minimum SDK is higher than
that?)
---
<small>¹ Incidentally, the underlying cause of #4073 (the show/resume
part of it anyway) turned out to be that the STATE_READY event was being
received not just on video load but also a second time on app resume,
causing certain parts of the initialization code to run a second time
although the fragment had already been fully initialized.</small>
* 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
* 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
* Fix auto play when swiping between attachments
Fixes an issue where attachment doesn't autoplay when swiping left/right from initial attachment.
Fixes#3066
* Fix lint error for wild card imports
* Support a swipe down to dismiss video
Images can already be dismissed with a swipe, this adds the same
functionality to videos.
- Add a VideoActionsListener interface for the hosting activity to dismiss
the fragment
- Add a gesture listener for swipes
- Dismiss the fragment if a swipe has a greated Y component than X
Fixes https://github.com/tuskyapp/Tusky/issues/2833
* Scale the video view when dragging
Provides identical visual feedback to the same operation on images.
* update to Api 33, fix some deprecations
* fix deprecated serializable/parcelable methods
* ask for notification permission
* fix code formatting
* add back comment in PreferencesActivity
* migrating to ViewBinding part 4: Fragment
* fix imports
* don't use viewBinding extension in ViewImage and ViewVideoFragment
* don't use viewBinding extension in ViewImage and ViewVideoFragment
* Increase character limit for media descriptions to 1500
It was increased in Mastodon 3.0.0 which was released in October 2019.
* Improve image description view
Since media descriptions can be longer now, we need to adjust the UI.
It is a common problem that description takes up the whole screen, it's
hard for readers and also discourages people from adding descriptions.
This commit uses bottom sheet to hide most of the description. Since we
know how much screen space it will cover, we can use darker background
which makes reading text easier.
* Adjust description handle
* Fix unable to dismiss image caption
* Resolving some issues with media playback.
* Changing ViewVideoFragment so that it fully handles autohiding the
media controller, allowing consistency between it and the toolbar
* Fixed an issue where the toolbar and description were not fading in
* Do not hide the toolbar/media player if the video is loading or paused
* Created "ExposedPlayPausedVideoView" to allow hooking play/pause
* Fix back button when viewing videos
* Back button did not work if video controls were visible.
* Tweak audio player
* Always show the controls when audio begins playing
* Do not auto-hide the controls if the player is playing audio
* Address PR comments
* Use overloaded constructor
* Remove m prefix
* Fix subtle media player issues
* Fix audio player incorrectly auto-hiding after hiding/showing toolbar
* Only subscribe touch listener once content is ready
- Prevents top toolbar visibility from getting out of phase with audio player visibility if hidden during load
* Fix media transitions, reduce code duplication between media fragments
* Remove redundant helper
* Fix occasional crash when swiping between mixed media
* Hide controls when swiping between media
* Migrate ImagePagerAdapter to kotlin
* Migrate ViewMediaFragment to kotlin
* Make images and videos share the same activity/pager
* Show descriptions above videos
* Cleanup
* Address code review feedback
* Migrate media fragments to constraint layout