Skip to content

Commit 1877d84

Browse files
authored
Merge pull request #9818 from wmontwe/feat-message-list-change-item-layout
feat(message-list): change item layout
2 parents 08162d0 + 8c172c3 commit 1877d84

File tree

22 files changed

+404
-58
lines changed

22 files changed

+404
-58
lines changed

app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.k9mail.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -16,6 +17,7 @@ class K9FeatureFlagFactory : FeatureFlagFactory {
1617
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true),
1718
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = true),
1819
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = true),
20+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
1921
)
2022
}
2123
}

app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.k9mail.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -20,6 +21,7 @@ class K9FeatureFlagFactory : FeatureFlagFactory {
2021
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = false),
2122
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = false),
2223
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = false),
24+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
2325
)
2426
}
2527
}

app-thunderbird/src/beta/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.thunderbird.android.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -19,6 +20,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1920
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true),
2021
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = true),
2122
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = false),
23+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
2224
)
2325
}
2426
}

app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.thunderbird.android.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -19,6 +20,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1920
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true),
2021
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = true),
2122
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = true),
23+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
2224
)
2325
}
2426
}

app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.thunderbird.android.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -19,6 +20,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1920
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true),
2021
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = true),
2122
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = true),
23+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
2224
)
2325
}
2426
}

app-thunderbird/src/release/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.thunderbird.android.featureflag
22

3+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags
34
import net.thunderbird.core.featureflag.FeatureFlag
45
import net.thunderbird.core.featureflag.FeatureFlagFactory
56
import net.thunderbird.core.featureflag.FeatureFlagKey
@@ -19,6 +20,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1920
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = false),
2021
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = false),
2122
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = false),
23+
FeatureFlag(MessageListFeatureFlags.UseComposeForMessageListItems, enabled = false),
2224
)
2325
}
2426
}

legacy/ui/legacy/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
implementation(projects.core.ui.theme.api)
2121
implementation(projects.feature.launcher)
2222
implementation(projects.core.common)
23+
implementation(projects.core.ui.compose.designsystem)
2324
implementation(projects.feature.navigation.drawer.api)
2425
implementation(projects.feature.navigation.drawer.dropdown)
2526
implementation(projects.feature.navigation.drawer.siderail)
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.fsck.k9.ui.messagelist.item
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.tooling.preview.PreviewLightDark
5+
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemesLightDark
6+
import com.fsck.k9.FontSizes
7+
import com.fsck.k9.UiDensity
8+
import com.fsck.k9.mail.AuthType
9+
import com.fsck.k9.mail.ConnectionSecurity
10+
import com.fsck.k9.mail.ServerSettings
11+
import com.fsck.k9.ui.messagelist.MessageListAppearance
12+
import com.fsck.k9.ui.messagelist.MessageListItem
13+
import net.thunderbird.core.android.account.Identity
14+
import net.thunderbird.core.android.account.LegacyAccount
15+
import net.thunderbird.feature.account.AccountIdFactory
16+
import net.thunderbird.feature.account.storage.profile.AvatarDto
17+
import net.thunderbird.feature.account.storage.profile.AvatarTypeDto
18+
import net.thunderbird.feature.account.storage.profile.ProfileDto
19+
20+
@Composable
21+
@PreviewLightDark
22+
internal fun MessageItemContentPreview() {
23+
PreviewWithThemesLightDark {
24+
MessageItemContent(
25+
item = fakeMessageListItem,
26+
isActive = true,
27+
isSelected = false,
28+
onClick = {},
29+
onLongClick = {},
30+
onAvatarClick = {},
31+
onFavouriteClick = {},
32+
appearance = fakeMessageListAppearance,
33+
)
34+
}
35+
}
36+
37+
private val accountId = AccountIdFactory.create()
38+
39+
private val serverSettings = ServerSettings(
40+
type = "imap",
41+
host = "imap.example.com",
42+
port = 993,
43+
connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED,
44+
authenticationType = AuthType.PLAIN,
45+
username = "username",
46+
password = "password",
47+
clientCertificateAlias = null,
48+
)
49+
private val fakeMessageListItem = MessageListItem(
50+
account = LegacyAccount(
51+
id = accountId,
52+
name = "Name",
53+
email = "test@example.com",
54+
profile = ProfileDto(
55+
id = accountId,
56+
name = "Name",
57+
color = 0xFF0000FF.toInt(),
58+
avatar = AvatarDto(
59+
avatarType = AvatarTypeDto.MONOGRAM,
60+
avatarMonogram = "AB",
61+
avatarImageUri = null,
62+
avatarIconName = null,
63+
),
64+
),
65+
incomingServerSettings = serverSettings,
66+
outgoingServerSettings = serverSettings,
67+
identities = listOf(Identity()),
68+
),
69+
subject = "Subject",
70+
threadCount = 0,
71+
messageDate = 1234456789L,
72+
internalDate = 1234456789L,
73+
displayName = "Sender Name",
74+
displayAddress = null,
75+
previewText = "This is the preview text.",
76+
isMessageEncrypted = false,
77+
isRead = false,
78+
isStarred = false,
79+
isAnswered = false,
80+
isForwarded = false,
81+
hasAttachments = false,
82+
uniqueId = 42L,
83+
folderId = 123L,
84+
messageUid = "654321",
85+
databaseId = 1L,
86+
threadRoot = 1L,
87+
)
88+
89+
private val fakeMessageListAppearance = MessageListAppearance(
90+
fontSizes = FontSizes(),
91+
previewLines = 2,
92+
stars = true,
93+
senderAboveSubject = false,
94+
showContactPicture = true,
95+
showingThreadedList = false,
96+
backGroundAsReadIndicator = false,
97+
showAccountIndicator = true,
98+
density = UiDensity.Default,
99+
)

legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ open class MessageList :
141141
private var messageListWasDisplayed = false
142142
private var viewSwitcher: ViewSwitcher? = null
143143

144-
private val isShowAccountChip: Boolean
145-
get() = messageListFragment?.isShowAccountChip ?: true
144+
private val isShowAccountIndicator: Boolean
145+
get() = messageListFragment?.isShowAccountIndicator ?: true
146146

147147
public override fun onCreate(savedInstanceState: Bundle?) {
148148
super.onCreate(savedInstanceState)
@@ -1106,7 +1106,7 @@ open class MessageList :
11061106
} else {
11071107
val fragment = MessageViewContainerFragment.newInstance(
11081108
reference = messageReference,
1109-
showAccountChip = isShowAccountChip,
1109+
isShowAccountIndicator = isShowAccountIndicator,
11101110
)
11111111
supportFragmentManager.commitNow {
11121112
replace(R.id.message_view_container, fragment, FRAGMENT_TAG_MESSAGE_VIEW_CONTAINER)

legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListAdapter.kt

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ import app.k9mail.feature.launcher.FeatureLauncherTarget
1717
import app.k9mail.legacy.message.controller.MessageReference
1818
import com.fsck.k9.contacts.ContactPictureLoader
1919
import com.fsck.k9.ui.helper.RelativeDateTimeFormatter
20+
import com.fsck.k9.ui.messagelist.MessageListFeatureFlags.UseComposeForMessageListItems
2021
import com.fsck.k9.ui.messagelist.item.BannerInlineListInAppNotificationViewHolder
22+
import com.fsck.k9.ui.messagelist.item.ComposableMessageViewHolder
2123
import com.fsck.k9.ui.messagelist.item.FooterViewHolder
2224
import com.fsck.k9.ui.messagelist.item.MessageListViewHolder
2325
import com.fsck.k9.ui.messagelist.item.MessageViewHolder
2426
import com.fsck.k9.ui.messagelist.item.MessageViewHolderColors
2527
import net.thunderbird.core.featureflag.FeatureFlagKey
2628
import net.thunderbird.core.featureflag.FeatureFlagProvider
2729
import net.thunderbird.core.featureflag.FeatureFlagResult
30+
import net.thunderbird.core.ui.theme.api.FeatureThemeProvider
2831
import net.thunderbird.feature.notification.api.ui.action.NotificationAction
2932

3033
private const val FOOTER_ID = 1L
@@ -42,6 +45,7 @@ class MessageListAdapter internal constructor(
4245
private val listItemListener: MessageListItemActionListener,
4346
private val appearance: MessageListAppearance,
4447
private val relativeDateTimeFormatter: RelativeDateTimeFormatter,
48+
private val themeProvider: FeatureThemeProvider,
4549
private val featureFlagProvider: FeatureFlagProvider,
4650
) : RecyclerView.Adapter<MessageListViewHolder>() {
4751

@@ -227,7 +231,15 @@ class MessageListAdapter internal constructor(
227231

228232
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageListViewHolder {
229233
return when (viewType) {
230-
TYPE_MESSAGE -> createMessageViewHolder(parent)
234+
TYPE_MESSAGE -> {
235+
val result = featureFlagProvider.provide(UseComposeForMessageListItems)
236+
if (result.isEnabled()) {
237+
createComposableMessageViewHolder(parent)
238+
} else {
239+
createMessageViewHolder(parent)
240+
}
241+
}
242+
231243
TYPE_FOOTER -> FooterViewHolder.create(layoutInflater, parent, footerClickListener)
232244
TYPE_IN_APP_NOTIFICATION_BANNER_INLINE_LIST if isInAppNotificationEnabled ->
233245
BannerInlineListInAppNotificationViewHolder(
@@ -259,7 +271,7 @@ class MessageListAdapter internal constructor(
259271
}
260272
}
261273

262-
private fun createMessageViewHolder(parent: ViewGroup?): MessageViewHolder =
274+
private fun createMessageViewHolder(parent: ViewGroup): MessageViewHolder =
263275
MessageViewHolder.create(
264276
layoutInflater = layoutInflater,
265277
parent = parent,
@@ -275,19 +287,40 @@ class MessageListAdapter internal constructor(
275287
starClickListener = starClickListener,
276288
)
277289

290+
private fun createComposableMessageViewHolder(parent: ViewGroup): MessageListViewHolder =
291+
ComposableMessageViewHolder.create(
292+
context = parent.context,
293+
themeProvider = themeProvider,
294+
onClick = { listItemListener.onMessageClicked(it) },
295+
onLongClick = { listItemListener.onToggleMessageSelection(it) },
296+
onFavouriteClick = { listItemListener.onToggleMessageFlag(it) },
297+
onAvatarClick = { listItemListener.onToggleMessageSelection(it) },
298+
appearance = appearance,
299+
)
300+
278301
override fun onBindViewHolder(holder: MessageListViewHolder, position: Int) {
279302
when (val viewType = getItemViewType(position)) {
280303
TYPE_IN_APP_NOTIFICATION_BANNER_INLINE_LIST if isInAppNotificationEnabled ->
281304
(holder as BannerInlineListInAppNotificationViewHolder).bind()
282305

283306
TYPE_MESSAGE -> {
284307
val messageListItem = getItem(position)
285-
val messageViewHolder = holder as MessageViewHolder
286-
messageViewHolder.bind(
287-
messageListItem = messageListItem,
288-
isActive = isActiveMessage(messageListItem),
289-
isSelected = isSelected(messageListItem),
290-
)
308+
val result = featureFlagProvider.provide(UseComposeForMessageListItems)
309+
if (result.isEnabled()) {
310+
val messageViewHolder = holder as ComposableMessageViewHolder
311+
messageViewHolder.bind(
312+
item = messageListItem,
313+
isActive = isActiveMessage(messageListItem),
314+
isSelected = isSelected(messageListItem),
315+
)
316+
} else {
317+
val messageViewHolder = holder as MessageViewHolder
318+
messageViewHolder.bind(
319+
messageListItem = messageListItem,
320+
isActive = isActiveMessage(messageListItem),
321+
isSelected = isSelected(messageListItem),
322+
)
323+
}
291324
}
292325

293326
TYPE_FOOTER -> {
@@ -368,8 +401,13 @@ class MessageListAdapter internal constructor(
368401
}
369402

370403
private fun getItemFromView(view: View): MessageListItem? {
371-
val messageViewHolder = view.tag as MessageViewHolder
372-
return getItemById(messageViewHolder.uniqueId)
404+
if (featureFlagProvider.provide(UseComposeForMessageListItems).isEnabled()) {
405+
val messageViewHolder = view.tag as ComposableMessageViewHolder
406+
return getItemById(messageViewHolder.uniqueId)
407+
} else {
408+
val messageViewHolder = view.tag as MessageViewHolder
409+
return getItemById(messageViewHolder.uniqueId)
410+
}
373411
}
374412
}
375413

0 commit comments

Comments
 (0)