diff --git a/CHANGELOG.md b/CHANGELOG.md
index 402e54c52..8e43c8862 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,14 @@
### Significant bug fixes
+## v27.2
+
+### Significant bug fixes
+
+- The title of a hashtag tab now shows the actual hashtags again (instead of just "Hashtags") https://github.com/tuskyapp/Tusky/pull/4868
+- Makes sure the background color of a dialogs is correct https://github.com/tuskyapp/Tusky/pull/4864
+- Fixes an issue where Tusky would freeze while loading a timeline gap https://github.com/tuskyapp/Tusky/pull/4865
+
## v27.1
### New features and other improvements
diff --git a/app/build.gradle b/app/build.gradle
index 5c640026a..b970cc7e1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -29,8 +29,8 @@ android {
namespace "com.keylesspalace.tusky"
minSdk 24
targetSdk 34
- versionCode 128
- versionName "27.1"
+ versionCode 129
+ versionName "27.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt
index 4bb46939b..d92b92ab0 100644
--- a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt
@@ -75,7 +75,7 @@ class AccountsInListFragment : DialogFragment() {
viewModel.load(listId)
}
- override fun getTheme() = R.style.TuskyDialogOverlay
+ override fun getTheme() = R.style.TuskyDialogFragment
override fun onStart() {
super.onStart()
diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
index f63da1551..e2721f162 100644
--- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
@@ -886,10 +886,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
tabLayoutMediator = TabLayoutMediator(activeTabLayout, binding.viewPager, true) {
tab: TabLayout.Tab, position: Int ->
tab.icon = AppCompatResources.getDrawable(this@MainActivity, tabs[position].icon)
- tab.contentDescription = when (tabs[position].id) {
- LIST -> tabs[position].arguments[1]
- else -> getString(tabs[position].text)
- }
+ tab.contentDescription = tabs[position].title(this)
if (tabs[position].id == DIRECT) {
val badge = tab.orCreateBadge
badge.isVisible = activeAccount.hasDirectMessageBadge
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
index 38d5b9854..c01aa5be3 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
@@ -308,27 +308,27 @@ class NotificationsViewModel @Inject constructor(
)
)
- val response = db.withTransaction {
- val idAbovePlaceholder = notificationsDao.getIdAbove(account.id, placeholderId)
- val idBelowPlaceholder = notificationsDao.getIdBelow(account.id, placeholderId)
- when (readingOrder) {
- // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately
- // after minId and no larger than maxId
- ReadingOrder.OLDEST_FIRST -> api.notifications(
- maxId = idAbovePlaceholder,
- minId = idBelowPlaceholder,
- limit = TimelineViewModel.LOAD_AT_ONCE,
- excludes = excludes.value
- )
- // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before
- // maxId, and no smaller than minId.
- ReadingOrder.NEWEST_FIRST -> api.notifications(
- maxId = idAbovePlaceholder,
- sinceId = idBelowPlaceholder,
- limit = TimelineViewModel.LOAD_AT_ONCE,
- excludes = excludes.value
- )
- }
+ val (idAbovePlaceholder, idBelowPlaceholder) = db.withTransaction {
+ notificationsDao.getIdAbove(account.id, placeholderId) to
+ notificationsDao.getIdBelow(account.id, placeholderId)
+ }
+ val response = when (readingOrder) {
+ // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately
+ // after minId and no larger than maxId
+ ReadingOrder.OLDEST_FIRST -> api.notifications(
+ maxId = idAbovePlaceholder,
+ minId = idBelowPlaceholder,
+ limit = TimelineViewModel.LOAD_AT_ONCE,
+ excludes = excludes.value
+ )
+ // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before
+ // maxId, and no smaller than minId.
+ ReadingOrder.NEWEST_FIRST -> api.notifications(
+ maxId = idAbovePlaceholder,
+ sinceId = idBelowPlaceholder,
+ limit = TimelineViewModel.LOAD_AT_ONCE,
+ excludes = excludes.value
+ )
}
val notifications = response.body()
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt
index e315d5252..b2b36829e 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt
@@ -157,25 +157,25 @@ class CachedTimelineViewModel @Inject constructor(
Placeholder(placeholderId, loading = true).toEntity(tuskyAccountId = account.id)
)
- val response = db.withTransaction {
- val idAbovePlaceholder = timelineDao.getIdAbove(account.id, placeholderId)
- val idBelowPlaceholder = timelineDao.getIdBelow(account.id, placeholderId)
- when (readingOrder) {
- // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately
- // after minId and no larger than maxId
- OLDEST_FIRST -> api.homeTimeline(
- maxId = idAbovePlaceholder,
- minId = idBelowPlaceholder,
- limit = LOAD_AT_ONCE
- )
- // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before
- // maxId, and no smaller than minId.
- NEWEST_FIRST -> api.homeTimeline(
- maxId = idAbovePlaceholder,
- sinceId = idBelowPlaceholder,
- limit = LOAD_AT_ONCE
- )
- }
+ val (idAbovePlaceholder, idBelowPlaceholder) = db.withTransaction {
+ timelineDao.getIdAbove(account.id, placeholderId) to
+ timelineDao.getIdBelow(account.id, placeholderId)
+ }
+ val response = when (readingOrder) {
+ // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately
+ // after minId and no larger than maxId
+ OLDEST_FIRST -> api.homeTimeline(
+ maxId = idAbovePlaceholder,
+ minId = idBelowPlaceholder,
+ limit = LOAD_AT_ONCE
+ )
+ // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before
+ // maxId, and no smaller than minId.
+ NEWEST_FIRST -> api.homeTimeline(
+ maxId = idAbovePlaceholder,
+ sinceId = idBelowPlaceholder,
+ limit = LOAD_AT_ONCE
+ )
}
val statuses = response.body()
diff --git a/app/src/main/res/drawable/dialog_background.xml b/app/src/main/res/drawable/dialog_background.xml
new file mode 100644
index 000000000..bde2b56d3
--- /dev/null
+++ b/app/src/main/res/drawable/dialog_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 21c5a1002..00afb9cf2 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -94,9 +94,9 @@
- @style/TuskyButton.TextButton
- - @style/TuskyDialogOverlay
+ - @style/TuskyMaterialDialogOverlay
- - @style/TuskyDialogOverlay
+ - @style/TuskyAlertDialog
- 16dp
- @style/TuskyTimePickerOverlay
@@ -146,12 +146,22 @@
- @color/white
-
-
+
+
+
+
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/01_timeline.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/01_timeline.png
index 439f560b6..0f8e3a1f7 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/01_timeline.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/01_timeline.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/03_profile.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/03_profile.png
index a1893f44c..080664578 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/03_profile.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/03_profile.png differ