diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt b/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt new file mode 100644 index 0000000..8178222 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt @@ -0,0 +1,99 @@ +package otus.gpb.recyclerview + +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView + +enum class MessageState { + IS_READ, + IS_SENT, + IS_INCOMING +} + +class ChatAdapter(private val items: MutableList) : RecyclerView.Adapter() { + class ChatViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val name: TextView by lazy { itemView.findViewById(R.id.nameTV) } + private val isMuted: ImageView by lazy { itemView.findViewById(R.id.MutedIcon) } + private val isVerified: ImageView by lazy { itemView.findViewById(R.id.VerifiedIcon) } + private val isScam: TextView by lazy { itemView.findViewById(R.id.ScamIcon) } + private val title: TextView by lazy { itemView.findViewById(R.id.titleTV) } + private val hasPrevPic: ImageView by lazy { itemView.findViewById(R.id.prevPic) } + private val message: TextView by lazy { itemView.findViewById(R.id.messageTV) } + private val messageState: ImageView by lazy { itemView.findViewById(R.id.messageState) } + private val time: TextView by lazy { itemView.findViewById(R.id.timeTV) } + private val messageCounter: TextView by lazy { itemView.findViewById(R.id.messageCounter) } + private val image: ImageView by lazy { itemView.findViewById(R.id.imageAvatar) } + fun bind(item: ChatItem){ + name.text = item.name + if (item.isMuted) { + isMuted.visibility = View.VISIBLE + isMuted.setImageResource(R.drawable.volume_off) + } + else isMuted.visibility = View.GONE + if (item.isVerified) isVerified.setImageResource(R.drawable.check_decagram) + if (!item.isScam) isScam.visibility = View.GONE + else isScam.visibility = View.VISIBLE + if (item.hasPrevPic) { + val params = message.layoutParams as ConstraintLayout.LayoutParams + params.marginStart = 6 + message.layoutParams = params + hasPrevPic.visibility = View.VISIBLE + hasPrevPic.setImageResource(R.drawable.prevpic) + } + else { + hasPrevPic.visibility = View.GONE + val params = message.layoutParams as ConstraintLayout.LayoutParams + params.marginStart = 0 + message.layoutParams = params + } + + if (item.title.isNullOrEmpty()) { + title.visibility = View.GONE + } + else { + title.text = item.title + } + message.text = item.message + + if (item.messageState == MessageState.IS_SENT) messageState.setImageResource(R.drawable.check_svgrepo_com) + if (item.messageState == MessageState.IS_READ) messageState.setImageResource(R.drawable.check_read_svgrepo_com) + if (item.messageState == MessageState.IS_INCOMING) messageState.visibility = View.GONE + time.text = item.time + if (item.messageCounter != null) { + messageCounter.visibility = View.VISIBLE + messageCounter.text = item.messageCounter.toString() + } + else messageCounter.visibility = View.GONE + image.setImageResource(item.image) + + } + } +// init { +// setHasStableIds(true) +// } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.dialog_view_item, parent, false) + return ChatViewHolder(view) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onBindViewHolder(holder: ChatViewHolder, position: Int) { + holder.bind(items[position]) + } + + fun deleteItem(position: Int) { + items.removeAt(position) + notifyItemRemoved(position) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt b/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt new file mode 100644 index 0000000..fdefb70 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt @@ -0,0 +1,18 @@ +package otus.gpb.recyclerview + +data class ChatItem( + val id: Int, + val name: String, + val isMuted: Boolean, + val isVerified: Boolean, + val isScam: Boolean, + val hasPrevPic: Boolean, + val messageState: MessageState, + val title: String?, + val message: String, + val time: String, + val messageCounter: Int?, + val image: Int +) + + diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt b/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt new file mode 100644 index 0000000..543ed28 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt @@ -0,0 +1,25 @@ +package otus.gpb.recyclerview + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView + +class ChatViewHolder ( + private val view: View) : RecyclerView.ViewHolder(view) { + private val name: TextView by lazy { view.findViewById(R.id.nameTV) } + private val title: TextView by lazy { view.findViewById(R.id.titleTV) } + private val message: TextView by lazy { view.findViewById(R.id.messageTV) } + private val time: TextView by lazy { view.findViewById(R.id.timeTV) } + private val image: ImageView by lazy { view.findViewById(R.id.imageAvatar) } + fun bind(item: ChatItem){ + name.text = item.name + title.text = item.title + message.text = item.message + time.text = item.time + image.setImageResource(item.image) + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/Dialogs.kt b/app/src/main/java/otus/gpb/recyclerview/Dialogs.kt new file mode 100644 index 0000000..50391c2 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/Dialogs.kt @@ -0,0 +1,140 @@ +package otus.gpb.recyclerview + +class Dialogs { + + companion object { + fun generateList() : List { + val list = mutableListOf() + var person = ChatItem( + id = 1, + name = "Pizza", + isMuted = true, + isVerified = false, + isScam = false, + hasPrevPic = true, + title = "jija", + message = "Yes, they are necessary", + messageState = MessageState.IS_INCOMING, + time = "11:38 AM", + messageCounter = null, + image = R.drawable.avatar1 + ) + list.add(person) + + person = ChatItem( + id = 2, + name = "Elon", + isMuted = true, + isVerified = false, + isScam = false, + hasPrevPic = false, + title = "", + message = "I love /r/Reddit!", + messageState = MessageState.IS_INCOMING, + time = "12:44 AM", + messageCounter = null, + image = R.drawable.avatar2 + ) + list.add(person) + + person = ChatItem( + id = 3, + name = "Pasha", + isMuted = true, + isVerified = true, + isScam = false, + hasPrevPic = false, + title = null, + message = "How are u?", + messageState = MessageState.IS_INCOMING, + time = "Fri", + messageCounter = null, + image = R.drawable.avatar3 + ) + list.add(person) + + person = ChatItem( + id = 4, + name = "Tim Cook", + isMuted = true, + isVerified = true, + isScam = false, + hasPrevPic = false, + title = "Boss of Apple", + message = "Android is better", + messageState = MessageState.IS_READ, + time = "15:02 AM", + messageCounter = null, + image = R.drawable.avatar4 + ) + list.add(person) + + person = ChatItem( + id = 5, + name = "Telegram Support", + isMuted = false, + isVerified = true, + isScam = false, + hasPrevPic = false, + title = "Support", + message = "Yes it happened.", + messageState = MessageState.IS_INCOMING, + time = "Thu", + messageCounter = 1, + image = R.drawable.avatar5 + ) + list.add(person) + + person = ChatItem( + id = 6, + name = "Karina", + isMuted = false, + isVerified = false, + isScam = false, + hasPrevPic = false, + title = "", + message = "Okay", + messageState = MessageState.IS_SENT, + time = "Wed", + messageCounter = null, + image = R.drawable.avatar6 + ) + list.add(person) + + person = ChatItem( + id = 7, + name = "Marilyn", + isMuted = false, + isVerified = false, + isScam = true, + hasPrevPic = false, + title = "", + message = "Will it ever happen", + messageState = MessageState.IS_READ, + time = "May 02", + messageCounter = null, + image = R.drawable.avatar7 + ) + list.add(person) + + repeat(43){ + val person = ChatItem( + id = it + 8, + name = "Name ${it + 8}", + isMuted = false, + isVerified = true, + isScam = true, + hasPrevPic = false, + title = "Name title $it", + message = "This is message $it", + messageState = MessageState.IS_SENT, + time = "12:12 AM", + messageCounter = null, + image = R.drawable.default_avatar + ) + list.add(person) + } + return list.toList() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/DividerItemDecoration.kt b/app/src/main/java/otus/gpb/recyclerview/DividerItemDecoration.kt new file mode 100644 index 0000000..7c4d1f4 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/DividerItemDecoration.kt @@ -0,0 +1,30 @@ +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import otus.gpb.recyclerview.R + +class DividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { + private val dividerPaint: Paint = Paint() + + init { + dividerPaint.color = ContextCompat.getColor(context, R.color.divider_color) // Цвет полосы + dividerPaint.strokeWidth = 1F // Ширина полосы + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + val left = parent.paddingLeft + val right = parent.width - parent.paddingRight + + for (i in 0 until parent.childCount - 1) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val top = child.bottom + params.bottomMargin + val bottom = top + dividerPaint.strokeWidth + c.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom, dividerPaint) + } + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt index e2cdca7..61d210a 100644 --- a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt +++ b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt @@ -1,12 +1,122 @@ package otus.gpb.recyclerview +import DividerItemDecoration +import SwipeToDeleteCallback +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.drawable.ColorDrawable import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { + private lateinit var recyclerView: RecyclerView + private lateinit var adapter: ChatAdapter + private val items = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + val manager = LinearLayoutManager(this) + + recyclerView = findViewById(R.id.recyclerView) + adapter = ChatAdapter(items) + recyclerView.adapter = adapter + recyclerView.layoutManager = manager + val itemDecoration = DividerItemDecoration(this) + + + recyclerView.addItemDecoration(itemDecoration) + + + + // Свайп + val swipeHandler = object : SwipeToDeleteCallback(adapter) { + override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) { + val itemView = viewHolder.itemView + val swipeColor = ContextCompat.getColor(itemView.context, R.color.swipe_color) + val background = ColorDrawable(swipeColor) // Цвет фона при свайпе + + // Рисуем фон + background.setBounds(itemView.right + dX.toInt(), itemView.top, itemView.right, itemView.bottom) + background.draw(c) + + // Рисуем иконку удаления + val deleteIcon = ContextCompat.getDrawable(itemView.context, R.drawable.package_down) + val iconMargin = (itemView.height - deleteIcon?.intrinsicHeight!!) / 2 + val iconTop = itemView.top + (itemView.height - deleteIcon.intrinsicHeight) / 2 - 20 + val iconBottom = iconTop + deleteIcon.intrinsicHeight + + if (dX < -50) { + val iconLeft = itemView.right - iconMargin - deleteIcon.intrinsicWidth + val iconRight = itemView.right - iconMargin + deleteIcon.setBounds(iconLeft, iconTop, iconRight, iconBottom) + deleteIcon.draw(c) + + // Рисуем текст под иконкой + val textPaint = Paint().apply { + color = Color.WHITE + textSize = 32f // Размер текста + typeface = ResourcesCompat.getFont(itemView.context, R.font.roboto_medium) + } + val text = "Archive" // Текст под иконкой + val textWidth = textPaint.measureText(text) + val textX = (iconLeft + iconRight - textWidth) / 2 + val textY = iconBottom + 40F // Расстояние от иконки до текста + + c.drawText(text, textX, textY, textPaint) + } + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) + } + } + + val itemTouchHelper = ItemTouchHelper(swipeHandler) + itemTouchHelper.attachToRecyclerView(recyclerView) + + val paging = PageScrollListener(manager).apply{ + onLoadMore = { + Toast.makeText(this@MainActivity, "Loading more...", Toast.LENGTH_SHORT).show() + addNextItems() + adapter.notifyDataSetChanged() + //adapter.addItems() + } + } + recyclerView.addOnScrollListener(paging) + + addNextItems() + + adapter.notifyDataSetChanged() + + } + +// fun generateList() = run { +// val list = mutableListOf() +// repeat(50){ +// val person = ChatItem( +// name = "Name $it", +// title = "Name title $it", +// message = "This is message $it", +// time = "12:12 AM", +// image = R.drawable.default_avatar +// ) +// list.add(person) +// } +// list.toList() +// } + + private fun addNextItems() { + if (items.count() != Dialogs.generateList().size){ + val newItems = Dialogs.generateList().subList(items.size, items.size + 10).toMutableList() + items.addAll(newItems) + } + + } } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/PageScrollListener.kt b/app/src/main/java/otus/gpb/recyclerview/PageScrollListener.kt new file mode 100644 index 0000000..e7174f9 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/PageScrollListener.kt @@ -0,0 +1,19 @@ +package otus.gpb.recyclerview + +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +class PageScrollListener(private val layoutManager: LinearLayoutManager) + : RecyclerView.OnScrollListener() { + var onLoadMore: (() -> Unit)? = null + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val totalItemCount = layoutManager.itemCount + val visibleItemCount = layoutManager.childCount + val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() + if (visibleItemCount + firstVisibleItemPosition >= totalItemCount) { + onLoadMore?.invoke() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/SwipeToDeleteCallback.kt b/app/src/main/java/otus/gpb/recyclerview/SwipeToDeleteCallback.kt new file mode 100644 index 0000000..f067246 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/SwipeToDeleteCallback.kt @@ -0,0 +1,26 @@ +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import otus.gpb.recyclerview.ChatAdapter +import otus.gpb.recyclerview.R + +open class SwipeToDeleteCallback(private val adapter: ChatAdapter) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { + + override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val position = viewHolder.adapterPosition + adapter.deleteItem(position) + } + + override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) { + + + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) + } +} diff --git a/app/src/main/res/drawable/avatar1.png b/app/src/main/res/drawable/avatar1.png new file mode 100644 index 0000000..19ebf2a Binary files /dev/null and b/app/src/main/res/drawable/avatar1.png differ diff --git a/app/src/main/res/drawable/avatar2.png b/app/src/main/res/drawable/avatar2.png new file mode 100644 index 0000000..7a2c81e Binary files /dev/null and b/app/src/main/res/drawable/avatar2.png differ diff --git a/app/src/main/res/drawable/avatar3.png b/app/src/main/res/drawable/avatar3.png new file mode 100644 index 0000000..737a88b Binary files /dev/null and b/app/src/main/res/drawable/avatar3.png differ diff --git a/app/src/main/res/drawable/avatar4.png b/app/src/main/res/drawable/avatar4.png new file mode 100644 index 0000000..f99a334 Binary files /dev/null and b/app/src/main/res/drawable/avatar4.png differ diff --git a/app/src/main/res/drawable/avatar5.png b/app/src/main/res/drawable/avatar5.png new file mode 100644 index 0000000..5a48282 Binary files /dev/null and b/app/src/main/res/drawable/avatar5.png differ diff --git a/app/src/main/res/drawable/avatar6.png b/app/src/main/res/drawable/avatar6.png new file mode 100644 index 0000000..39fa0ee Binary files /dev/null and b/app/src/main/res/drawable/avatar6.png differ diff --git a/app/src/main/res/drawable/avatar7.png b/app/src/main/res/drawable/avatar7.png new file mode 100644 index 0000000..e147421 Binary files /dev/null and b/app/src/main/res/drawable/avatar7.png differ diff --git a/app/src/main/res/drawable/check_decagram.xml b/app/src/main/res/drawable/check_decagram.xml new file mode 100644 index 0000000..673ddac --- /dev/null +++ b/app/src/main/res/drawable/check_decagram.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/check_read_svgrepo_com.xml b/app/src/main/res/drawable/check_read_svgrepo_com.xml new file mode 100644 index 0000000..cf13b18 --- /dev/null +++ b/app/src/main/res/drawable/check_read_svgrepo_com.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/check_svgrepo_com.xml b/app/src/main/res/drawable/check_svgrepo_com.xml new file mode 100644 index 0000000..67deb50 --- /dev/null +++ b/app/src/main/res/drawable/check_svgrepo_com.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/circle_background.xml b/app/src/main/res/drawable/circle_background.xml new file mode 100644 index 0000000..1f5b985 --- /dev/null +++ b/app/src/main/res/drawable/circle_background.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/circle_counter.xml b/app/src/main/res/drawable/circle_counter.xml new file mode 100644 index 0000000..46b3434 --- /dev/null +++ b/app/src/main/res/drawable/circle_counter.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/default_avatar.jpg b/app/src/main/res/drawable/default_avatar.jpg new file mode 100644 index 0000000..aaf3ba2 Binary files /dev/null and b/app/src/main/res/drawable/default_avatar.jpg differ diff --git a/app/src/main/res/drawable/icon_not_found.xml b/app/src/main/res/drawable/icon_not_found.xml new file mode 100644 index 0000000..7ccf6cf --- /dev/null +++ b/app/src/main/res/drawable/icon_not_found.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/package_down.xml b/app/src/main/res/drawable/package_down.xml new file mode 100644 index 0000000..650dac2 --- /dev/null +++ b/app/src/main/res/drawable/package_down.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/prevpic.png b/app/src/main/res/drawable/prevpic.png new file mode 100644 index 0000000..70289e7 Binary files /dev/null and b/app/src/main/res/drawable/prevpic.png differ diff --git a/app/src/main/res/drawable/scam_background.xml b/app/src/main/res/drawable/scam_background.xml new file mode 100644 index 0000000..919579e --- /dev/null +++ b/app/src/main/res/drawable/scam_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/volume_off.xml b/app/src/main/res/drawable/volume_off.xml new file mode 100644 index 0000000..e0327e5 --- /dev/null +++ b/app/src/main/res/drawable/volume_off.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/font/roboto.ttf b/app/src/main/res/font/roboto.ttf new file mode 100644 index 0000000..3313686 Binary files /dev/null and b/app/src/main/res/font/roboto.ttf differ diff --git a/app/src/main/res/font/roboto_medium.ttf b/app/src/main/res/font/roboto_medium.ttf new file mode 100644 index 0000000..6893acd Binary files /dev/null and b/app/src/main/res/font/roboto_medium.ttf differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2d026df..afa8380 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,11 +3,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + android:orientation="vertical" + tools:listitem="@layout/dialog_view_item"/> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_view_item.xml b/app/src/main/res/layout/dialog_view_item.xml new file mode 100644 index 0000000..3bb7f4a --- /dev/null +++ b/app/src/main/res/layout/dialog_view_item.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..11fb194 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,4 +7,15 @@ #FF018786 #FF000000 #FFFFFFFF + #FF8D8E90 + #FFBDC1C4 + + @color/black + @color/grey + #FFD9D9D9 + #FF66A9E0 + #FF4B91CA + #FFE64646 + #FF48A938 + #FF3D95D4 \ 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 2187cf1..216ba29 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file