* Show reblog/favourite confirmations as menus not dialogs
The previous code used dialogs and displayed the text of the status when
reblogging or favouriting.
This didn't work when the post just contained images, and other material
from the status (content warning, polls) was not shown either.
Fix this by displaying a popup menu instead. The status remains visible so
the user can clearly see what they're acting on.
In addition, this lays the groundwork for supporting a long-press menu
in the future to allow the user to reblog/favourite from a different
account.
Fixes https://github.com/tuskyapp/Tusky/issues/3308
* Revert the change that puts the menu immediately over the icon
Although this behavious is consistent with how the option menu works, I
decided that the risk of someone inadvertently double-tapping in the same
location, and the first tap opens the menu and the second tap confirms the
action was too great.
So now the menu appears either above or below the icon depending on space,
and the user has to tap in two slightly different spaces.
This is also consistent with the previous behaviour, where it's highly
unlikely that the confirm button on the dialog would have been directly
under the user's finger if they double-tapped.
* Change "Load more" to load oldest statuses first in home timeline
Previous behaviour loaded missing statuses by using "since_id" and "max_id".
This loads the most recent N statuses, looking backwards from "max_id".
Change to load the oldest statuses first, assuming the user is scrolling
up through the timeline and will want to load statuses in reverse
chronological order.
* Scroll to the bottom of new entries added by "Load more"
- Remember the position of the "Load more" placeholder
- Check the position of inserted entries
- If they match, scroll to the bottom
* Change "Load more" to load oldest statuses first in home timeline
Previous behaviour loaded missing statuses by using "since_id" and "max_id".
This loads the most recent N statuses, looking backwards from "max_id".
Change to load the oldest statuses first, assuming the user is scrolling
up through the timeline and will want to load statuses in reverse
chronological order.
* Scroll to the bottom of new entries added by "Load more"
- Remember the position of the "Load more" placeholder
- Check the position of inserted entries
- If they match, scroll to the bottom
* Ensure the user can't have two simultaneous "Load more" coroutines
Having two simultanous coroutines would break the calculation used to figure
out which item in the list to scroll to after a "Load more" in the timeline.
Do this by:
- Creating a TimelineUiState and associated flow that tracks the "Load more"
state
- Updating this in the (Cached|Network)TimelineViewModel
- Listening for changes to it in TimelineFragment, and notifying the adapter
- The adapter will disable any placeholder views while "Load more" is active
* Revert changes that loaded the oldest statuses instead of the newest
* Be more robust about locating the status to scroll to
Weirdness with the PagingData library meant that positionStart could still be
wrong after "Load more" was clicked.
Instead, remember the position of the "Load more" item and the ID of the
status immediately after it.
When new items are added, search for the remembered status at the position of
the "Load more" item. This is quick, testing at most LOAD_AT_ONCE items in
the adapter.
If the remembered status is not visible on screen then scroll to it.
* Lint
* Add a preference to specify the reading order
Default behaviour (oldest first) is for "load more" to load statuses and
stay at the oldest of the new statuses.
Alternative behaviour (if the user is reading from top to bottom) is to
stay at the newest of the new statuses.
* Move ReadingOrder enum construction logic in to the enum
* Jump to top if swipe/refresh while preferring newest-first order
* Show a circular progress spinner during "Load more" operations
Remove a dedicated view, and use an icon on the button instead.
Adjust the placeholder attributes and styles accordingly.
* Remove the "loadMoreActive" property
Complicates the code and doesn't really achieve the desired effect. If the
user wants to tap multiple "Load more" buttons they can.
* Update comments in TimelineFragment
* Respect the user's reading order preference if it changes
* Add developer tools
This is for functionality that makes it easier for developers to interact
with the app, or get it in to a known-state.
These features are for use by users, so are only visible in debug builds.
* Adjust how content is loaded based on preferred reading order
- Add the readingOrder to TimelineViewModel so derived classes can use it.
- Update the homeTimeline API to support the `minId` parameter and update
calls in NetworkTimelineViewModel
In CachedTimelineViewModel:
- Set the bounds of the load to be the status IDs on either side of the
placeholder ID (update TimelineDao with a new query for this)
- Load statuses using either minId or sinceId depending on the reading order
- Is there was no overlap then insert the new placeholder at the start/end
of the list depending on reading order
* Lint
* Rename unused dialog parameter to _
* Update API arguments in tests
* Simplify ReadingOrder preference handling
* Fix bug with Placeholder and the "expanded" property
If a status is a Placeholder the "expanded" propery is used to indicate
whether or not it is loading.
replaceStatusRange() set this property based on the old value, and the user's
alwaysOpenSpoiler preference setting.
This shouldn't have been used if the status is a Placeholder, as it can lead
to incorrect loading states.
Fix this.
While I'm here, introduce an explicit computed property for whether a
TimelineStatusEntity is a placeholder, and use that for code clarity.
* Set the "Load more" button background to transparent
* Fix typo.
* Inline spec, update comment
* Revert 1480c6aa3ac5c0c2d362fb271f47ea2259ab14e2
Turns out the behaviour is not desired.
* Remove unnecessary Log call
* Extract function
* Change default to newest first
These aren't necessary for the app, and are overwritten with the actual style
in `BaseActivity.onCreate()`.
But if they're missing the Android Studio layout preview renderer crashes.
* convert MainActivity to Kotlin
* migrate to MaterialDrawer 8
* fix drawer styles
* revert removing BezelImageView and material_drawer_header override
* fix tests
* add lost comment back to material_drawer_header.xml
* add tools:parentTag to material_drawer_header.xml
* use when instead of if in MainActivity
* fix statusbar color over the drawer
* cleanup drawer item creation
* tint secondary drawer items as well
* remove unnecessary ids
* fix header text color in the light theme
* improve header text contrast
* Theme refactoring
* disable the automatic tinting of surfaces with elevation in dark mode
* make the media warning visible again with the dark theme
* fix nav bar on api 27+
* use correct color for all media warnings
* Use blurhash as image preview and as sensitive media cover, close#1571
* Fix focal point for blurhashes
* Fix video indicator overlapping sensitive media indicator
* Add a preference for blurhash
* Add blurhash to report UI.
* Introduce StatusDisplayOptions
* Convert ComposeActivity to Kotlin
* More ComposeActivity cleanups
* Move ComposeActivity to it's own package
* Remove ComposeActivity.IntentBuilder
* Re-do part of the media downsizing/uploading
* Add sending of status to ViewModel, draft media descriptions
* Allow uploading video, update description after uploading
* Enable camera, enable upload cancelling
* Cleanup of ComposeActivity
* Extract CaptionDialog, extract ComposeActivity methods
* Fix handling of redrafted media
* Add initial state and media uploading out of Activity
* Change ComposeOptions.mentionedUsernames to be Set rather than List
We probably don't want repeated usernames when we are writing a post
and Set provides such guarantee for free plus it tells it to the
callers. The only disadvantage is lack of order but it shouldn't be a
problem.
* Add combineOptionalLiveData. Add docs.
It it useful for nullable LiveData's. I think we cannot differentiate
between value not being set and value being null so I just added the
variant without null check.
* Add poll support to Compose.
* cleanup code
* move more classes into compose package
* cleanup code
* fix button behavior
* add error handling for media upload
* add caching for instance data again
* merge develop
* fix scheduled toots
* delete unused string
* cleanup ComposeActivity
* fix restoring media from drafts
* make media upload code a little bit clearer
* cleanup autocomplete search code
* avoid duplicate object creation in SavedTootActivity
* perf: avoid unnecessary work when initializing ComposeActivity
* add license header to new files
* use small toot button on bigger displays
* fix ComposeActivityTest
* fix bad merge
* use Singles.zip instead of Single.zip
* Remove unnecessary //noinspection ConstantConditions
* Add autocompletion for custom emoji
* Update MentionTagTokenizer tests for emoji autocomplete support
* Move 1) emoji list retrieval notifying and 2) setting of emojiList field into setEmojiList() method of ComposeActivity
* Convert RelativeLayout in item_autocomplete_emoji.xml to LinearLayout
* Rename MentionTag* to Compose*
* Improve emoji autocomplete matching
* Make hashtag autocomplete results bold
* Use Context.getString()'s built-in formatting
* Add a divider between emoji autocomplete results that *start with* the token and those that *contain* it
* upgrade to AndroidX, upgrade libraries
* move to MaterialComponents theme
* make sure the compose button looks good everywhere
* fix tollbar title/button alignment on tablet
* move to new material color theming, consolidate colors and themes
* fix build, fix imports
* set error on TextInputLayout instead of EditText
* fix imports, TootButton when
* improve snackbar style
* fix task description color
* Add black theme
On amoled screens a completely black theme helps save battery,
besides looking awesome!
* Fix first set of merge request issues except the dialog.
* Black theme inherits from dark and only the different values
are declared
* Make nav bar translucent (for some reason content does not
go behind it in main activity. Need to investigate)
* Remove nav bar line
* Fix toolbar color
* Fix dialog issue with black theme.
Revert translucent navigation.
* Translations updated, as well as possible from online sources.
* Make login screen respect black theme
* Refactor-all-the-things version of the fix for issue #573
* Migrate SpanUtils to kotlin because why not
* Minimal fix for issue #573
* Add tests for compose spanning
* Clean up code suggestions
* Make FakeSpannable.getSpans implementation less awkward
* Add secondary validation pass for urls
* Address code review feedback
* Fixup type filtering in FakeSpannable again
* Make all mentions in compose activity use the default link color
* new layout for AccountActivity
* fix the light theme
* convert AccountActivity to Kotlin
* introduce AccountViewModel
* Merge branch 'master' into account-activity-redesign
# Conflicts:
# app/src/main/java/com/keylesspalace/tusky/AccountActivity.java
* add Bot badge to profile
* parse custom emojis in usernames
* add possibility to cancel follow request
* add third tab on profiles
* add account fields to profile
* add support for moved accounts
* set click listener on account moved view
* fix tests
* use 24dp as statusbar size
* add ability to hide reblogs from followed accounts
* add button to edit own account to AccountActivity
* set toolbar top margin programmatically
* fix crash
* add shadow behind statusbar
* introduce ViewExtensions to clean up code
* move code out of offsetChangedListener for perf reasons
* clean up stuff
* add error handling
* improve type safety
* fix ConstraintLayout warning
* remove unneeded ressources
* fix event dispatching
* fix crash in event handling
* set correct emoji on title
* improve some things
* wrap follower/foillowing/status views
* show ComposeActivity as Dialog on tablets
* limit timeline width on large devices
* limit width on large devices for thread view and search
* increase media preview size on large devices
* Add circleci
* Commit to maybe fix ci
* Suppress false positives in lint
* Disable linting for tests in ci
* Add image descriptions to gallery
* Fix test
* [CI] Attempt to fix OOM error
* [CI] Attempt to fix OOM error, 2
* Add option to open status from media
* fix theme issue
* increase linespacing on media description
* do not add media urls to status text
* add scrolling to content
* add arrow icon and animation to replying-to toggle
* remove unnecessary compose_button_colors.xml
* improve toot button
* improve bottom bar, add bottom sheet for compose options, dedicated cw button
* fix crash on Android < API 21
* move media picking from dialog to bottom sheet
* add small style tootbutton
* fix colors/button background for light theme
* add icons to media chose bottom sheet
* improve hide media button, delete unused styles
* fix crash on dev build when taking photo
* consolidate drawables
* consolidate strings and ids, add tooltips to buttons
* allow media only toots
* change error message to show max size of upload correctly
* fix button color
* add emoji
* code cleanup
* Merge branch 'master' into compose_activity_refactoring
# Conflicts:
# app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java
* fix hidden snackbar
* improve hint text color
* add SendTootService
* fix timeline refreshing
* toot saving and error handling for sendtootservice
* restructure some code
* convert EditTextTyped to Kotlin
* fixed pick media button disabled color
* force sensitive media when content warning is shown
* add db cache for emojis & fix tests
* reorder buttons to match mastodon web
* add possibility to cancel sending of toot
* correctly delete sent toots
* refresh SavedTootActivity after toot was sent
* remove unused resources
* correct params for toot saving in SendTootService
* consolidate strings
* bugfix
* remove unused resources
* fix notifications on old android for SendTootService
* fix crash
* Split theme definitions into day and night
* Add support for Night Mode in code
* Add theme chooser in preferences
* Fix translations
* Adjust IDs
* Adjust preferences for custom themes
* UI tweaks for custom theme support
* Added code for custom theme support 🍅
* Fixed resource display in Kotlin 🍅
* Restored styles
* Updated strings
* Fixed getIdentifier() to fit into setTheme()
* Removed redundant resources
* Reset default theme to "Dusky"
* Fixed night mode handler to maintain compatibility
* Refactor functions to use helper methods
* Added license block
* Added preview to theme selector
* Added color identifier getter helper method
* Fixed reference in AccountMediaFragment
* Cleanup
* Fixed navbar foreground not changing color
* Fix fallback theme switch(){}
* Enable location-based daylight trigger
* Cleanup
* Modified theming strategy to reduce clutter in preferences
* Updated translations for latest version
* Removed "Default" theme flavor from settings
* Updated Polish translations 🇵🇱
* Modified TwilightManager handling code to support Android M's UiModeManager features and moved it to its own function
* Updated Polish translations 🇵🇱
* Cleanup; Fixed hardcoded string
* Added missing escape in string
* Removed permission request dialog.
As we now use native UiModeManager APIs that don't need special permission for Android 6.0 and above, we no longer need to bother user with Android M+ specific location permission request dialog.
* Increased readability of ThemeUtil class
* Refactored ThemeUtils.setAppNightMode method
* Cleanup