diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 3370f64a..d1349ddc 100644 Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/VkConversation.kt b/app/src/main/kotlin/com/meloda/fast/api/model/VkConversation.kt index 0ef30970..55d3ecec 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/VkConversation.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/model/VkConversation.kt @@ -11,6 +11,7 @@ import kotlinx.parcelize.Parcelize data class VkConversation( @PrimaryKey(autoGenerate = false) val id: Int, + val ownerId: Int?, val title: String?, val photo200: String?, val type: String, @@ -22,7 +23,8 @@ data class VkConversation( val isMarkedUnread: Boolean, val lastMessageId: Int, val unreadCount: Int?, - val membersCount: Int? + val membersCount: Int?, + val isPinned: Boolean ) : Parcelable { @Ignore var lastMessage: VkMessage? = null diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/base/BaseVkConversation.kt b/app/src/main/kotlin/com/meloda/fast/api/model/base/BaseVkConversation.kt index d69818f8..be2f3380 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/base/BaseVkConversation.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/model/base/BaseVkConversation.kt @@ -51,7 +51,9 @@ data class BaseVkConversation( isMarkedUnread = isMarkedUnread, lastMessageId = lastMessageId, unreadCount = unreadCount, - membersCount = chatSettings?.membersCount + membersCount = chatSettings?.membersCount, + ownerId = chatSettings?.ownerId, + isPinned = sortId.majorId > 0 ).apply { this.lastMessage = lastMessage } @Parcelize diff --git a/app/src/main/kotlin/com/meloda/fast/database/AppDatabase.kt b/app/src/main/kotlin/com/meloda/fast/database/AppDatabase.kt index 0494344a..00967ddd 100644 --- a/app/src/main/kotlin/com/meloda/fast/database/AppDatabase.kt +++ b/app/src/main/kotlin/com/meloda/fast/database/AppDatabase.kt @@ -18,7 +18,7 @@ import com.meloda.fast.database.dao.UsersDao VkUser::class, VkGroup::class ], - version = 13, + version = 15, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { diff --git a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsAdapter.kt b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsAdapter.kt index f89a67c5..726257c0 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsAdapter.kt @@ -1,15 +1,19 @@ package com.meloda.fast.screens.conversations import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.ColorDrawable import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import androidx.core.view.setPadding import androidx.recyclerview.widget.DiffUtil import coil.load import com.meloda.fast.R import com.meloda.fast.api.UserConfig +import com.meloda.fast.api.VKConstants import com.meloda.fast.api.VkUtils import com.meloda.fast.api.model.VkConversation import com.meloda.fast.api.model.VkGroup @@ -76,6 +80,7 @@ class ConversationsAdapter constructor( } else null val avatar = when { + conversation.ownerId == VKConstants.FAST_GROUP_ID -> null conversation.isUser() && chatUser != null && !chatUser.photo200.isNullOrBlank() -> chatUser.photo200 conversation.isGroup() && chatGroup != null && !chatGroup.photo200.isNullOrBlank() -> chatGroup.photo200 conversation.isChat() && !conversation.photo200.isNullOrBlank() -> conversation.photo200 @@ -86,13 +91,36 @@ class ConversationsAdapter constructor( binding.avatarPlaceholder.isVisible = avatar == null if (avatar == null) { - binding.avatar.setImageDrawable(null) + if (conversation.ownerId == VKConstants.FAST_GROUP_ID) { + binding.placeholderBack.setImageDrawable( + ColorDrawable( + ContextCompat.getColor(context, R.color.a1_400) + ) + ) + binding.placeholder.imageTintList = + ColorStateList.valueOf(ContextCompat.getColor(context, R.color.a1_0)) + binding.placeholder.setImageResource(R.drawable.ic_fast_logo) + binding.placeholder.setPadding(18) + } else { + binding.placeholderBack.setImageDrawable( + ColorDrawable( + ContextCompat.getColor(context, R.color.n1_50) + ) + ) + binding.placeholder.imageTintList = + ColorStateList.valueOf(ContextCompat.getColor(context, R.color.n2_500)) + binding.placeholder.setImageResource(R.drawable.ic_account_circle_cut) + binding.placeholder.setPadding(0) + binding.avatar.setImageDrawable(null) + } } else { binding.avatar.load(avatar) { crossfade(200) } } binding.online.isVisible = chatUser?.online == true + binding.pin.isVisible = conversation.isPinned + val actionMessage = VkUtils.getActionConversationText( message = message, youPrefix = youPrefix, @@ -157,10 +185,8 @@ class ConversationsAdapter constructor( prefix.length + coloredMessage.length, 0 ) + binding.message.text = spanMessage -// } else { -// binding.message.text = messageText -// } binding.title.text = getItem(position).title ?: chatUser?.toString() ?: chatGroup?.name ?: "..." diff --git a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt index 006f37db..a7c4192f 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt @@ -8,6 +8,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import coil.load +import com.google.android.material.appbar.AppBarLayout import com.google.android.material.snackbar.Snackbar import com.meloda.fast.R import com.meloda.fast.api.UserConfig @@ -19,6 +20,7 @@ import com.meloda.fast.base.viewmodel.VKEvent import com.meloda.fast.databinding.FragmentConversationsBinding import com.meloda.fast.util.AndroidUtils import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs @AndroidEntryPoint class ConversationsFragment : @@ -57,6 +59,19 @@ class ConversationsFragment : UserConfig.vkUser.observe(viewLifecycleOwner) { it?.let { user -> binding.avatar.load(user.photo200) { crossfade(100) } } } + + binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + if (verticalOffset <= -100) { + binding.avatarContainer.alpha = 0f + return@OnOffsetChangedListener + } + + val alpha = 1 - abs(verticalOffset * 0.01).toFloat() + +// println("offset: $verticalOffset; alpha: $alpha") + + binding.avatarContainer.alpha = alpha + }) } override fun onEvent(event: VKEvent) { diff --git a/app/src/main/res/drawable/ic_fast_logo.xml b/app/src/main/res/drawable/ic_fast_logo.xml new file mode 100644 index 00000000..23f3e85f --- /dev/null +++ b/app/src/main/res/drawable/ic_fast_logo.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index a74b6bd7..d6bc8e98 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -3,15 +3,23 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + android:pathData="M371.796,170.753L288.208,298.822C280.722,310.291 288.951,325.49 302.648,325.49H371.796V170.753Z" + android:strokeAlpha="0.7" + android:fillColor="#ffffff" + android:fillAlpha="0.7"/> + android:pathData="M308.429,65.884C327.174,37.164 371.796,50.438 371.796,84.733V430.872H133.9C106.507,430.872 90.048,400.474 105.02,377.536L308.429,65.884ZM288.208,298.822L371.796,170.753V325.49H302.648C288.951,325.49 280.722,310.291 288.208,298.822Z" + android:strokeAlpha="0.5" + android:fillColor="#ffffff" + android:fillType="evenOdd" + android:fillAlpha="0.5"/> + diff --git a/app/src/main/res/drawable/ic_round_push_pin_24.xml b/app/src/main/res/drawable/ic_round_push_pin_24.xml new file mode 100644 index 00000000..da0a81d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_push_pin_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_conversations.xml b/app/src/main/res/layout/fragment_conversations.xml index b14e8b2c..732ade60 100644 --- a/app/src/main/res/layout/fragment_conversations.xml +++ b/app/src/main/res/layout/fragment_conversations.xml @@ -8,6 +8,7 @@ android:layout_height="match_parent"> @@ -25,9 +26,9 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?actionBarSize" - android:background="@color/n1_50" + android:background="?android:windowBackground" android:elevation="0dp" - app:layout_collapseMode="pin" + app:layout_collapseMode="parallax" app:menu="@menu/fragment_conversations" /> + android:orientation="horizontal" + app:layout_collapseParallaxMultiplier="0.5"> + android:tint="?colorSecondary3Variant" /> diff --git a/app/src/main/res/layout/fragment_messages_history.xml b/app/src/main/res/layout/fragment_messages_history.xml index 93020318..a0ae29ea 100644 --- a/app/src/main/res/layout/fragment_messages_history.xml +++ b/app/src/main/res/layout/fragment_messages_history.xml @@ -195,7 +195,7 @@ android:layout_gravity="bottom" android:layout_margin="12dp" android:background="@drawable/ic_message_panel_background" - android:backgroundTint="@color/a1_0" + android:backgroundTint="?colorSurface" android:clickable="true" android:elevation="3dp" android:focusable="true" @@ -220,7 +220,7 @@ android:layout_marginEnd="18dp" android:background="?selectableItemBackgroundBorderless" android:src="@drawable/ic_baseline_attach_file_24" - android:tint="@color/a1_500" /> + android:tint="?colorOnSurface" /> + android:tint="?colorOnSurface" /> diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index 359be593..7c917926 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -38,11 +38,13 @@ android:visibility="gone"> + app:tint="?colorSecondary2" /> + + + + + + + + @@ -137,7 +166,7 @@ android:layout_weight="1" android:fontFamily="@font/google_sans_regular" android:maxLines="2" - android:textColor="@color/n1_900" + android:textColor="?textColorPrimary" android:textSize="22sp" tools:text="Title" /> @@ -150,10 +179,10 @@ android:layout_marginEnd="4dp" android:layout_weight="0" android:background="@drawable/ic_back" - android:backgroundTint="@color/a1_600" + android:backgroundTint="?colorSecondary3" android:gravity="center" android:minWidth="18dp" - android:textColor="@color/a1_0" + android:textColor="?colorOnSecondary3" android:textSize="10sp" android:visibility="gone" tools:text="12" @@ -171,7 +200,7 @@ android:alpha="0.5" android:fontFamily="@font/roboto_regular" android:gravity="end|center_vertical" - android:textColor="@color/n2_500" + android:textColor="?textColorSecondaryVariant" tools:text="20:00" /> @@ -198,7 +227,7 @@ android:layout_marginEnd="4dp" android:src="@drawable/ic_baseline_attach_file_24" android:visibility="gone" - app:tint="@color/n2_500" + app:tint="?textColorSecondaryVariant" tools:visibility="visible" /> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 2d95290f..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 2d95290f..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 7aa4db3a..00000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 7aa4db3a..00000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 03a242be..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 03a242be..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 13ceda1b..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 13ceda1b..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 19b32ab5..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 19b32ab5..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/values-night-v31/colors.xml b/app/src/main/res/values-night-v31/colors.xml new file mode 100644 index 00000000..d5350c0e --- /dev/null +++ b/app/src/main/res/values-night-v31/colors.xml @@ -0,0 +1,26 @@ + + + + @android:color/system_accent1_0 + @android:color/system_accent1_400 + @android:color/system_accent1_500 + @android:color/system_accent1_600 + + @android:color/system_accent2_200 + @android:color/system_accent2_700 + + @android:color/system_accent3_200 + @android:color/system_accent3_700 + + @android:color/system_neutral1_10 + @android:color/system_neutral1_50 + @android:color/system_neutral1_100 + @android:color/system_neutral1_800 + @android:color/system_neutral1_900 + + @android:color/system_neutral2_0 + @android:color/system_neutral2_10 + @android:color/system_neutral2_100 + @android:color/system_neutral2_500 + + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 00000000..a7ba55f9 --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,19 @@ + + + + @color/n1_900 + + @color/colorBackground + @color/colorBackground + @color/n1_900 + + @color/a2_100 + @color/a2_700 + @color/a2_700 + + @color/n1_100 + @color/n1_100 + + @color/a1_0 + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 4edb3e22..fbf2abae 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -2,19 +2,26 @@ \ No newline at end of file diff --git a/app/src/main/res/values-v31/colors.xml b/app/src/main/res/values-v31/colors.xml index 6c942c29..d48c5157 100644 --- a/app/src/main/res/values-v31/colors.xml +++ b/app/src/main/res/values-v31/colors.xml @@ -2,11 +2,15 @@ @android:color/system_accent1_0 + @android:color/system_accent1_200 + @android:color/system_accent1_400 @android:color/system_accent1_500 @android:color/system_accent1_600 + @android:color/system_accent2_100 @android:color/system_accent2_200 @android:color/system_accent2_700 + @android:color/system_accent2_1000 @android:color/system_accent3_200 @android:color/system_accent3_700 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 9a6c0402..68202721 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,6 +1,18 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9ed74021..dbcf47c4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,13 +1,42 @@ + @color/n1_50 + + @color/colorBackground + @color/colorBackground + @color/n1_900 + + @color/a2_200 + @color/a2_700 + @color/a2_700 + + @color/a3_200 + @color/a3_100 + @color/a3_700 + + @color/a1_600 + @color/a1_500 + @color/a1_0 + + @color/n1_900 + @color/n1_900 + @color/n2_500 + + @color/a1_0 + #FFFFFF + #B1C6FA + #4184F5 #3771DF #2559BC + #000000 + #DCE1F7 #C0C6DA #414757 + #F8D6FC #DEBAE5 #583C61 diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index 70a24a75..f1503161 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #4284F4 + #4184F5 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index fffc5c4b..b5a6103c 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,23 +2,42 @@