diff --git a/app/build.gradle b/app/build.gradle index 54e4eac..32eb90e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,9 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.github.javafaker:javafaker:1.0.2' + implementation 'com.github.bumptech.glide:glide:4.15.1' + implementation 'androidx.cardview:cardview:1.0.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt new file mode 100644 index 0000000..1cbad53 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt @@ -0,0 +1,35 @@ +package otus.gpb.recyclerview + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide + +class ChatTlgAdapter( ):RecyclerView.Adapter(){ + + private var ChatItemList = mutableListOf() + fun setList(list: List) { + ChatItemList = list.toList() as MutableList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatTlgViewHolder { + + val view = LayoutInflater.from(parent.context) + val binding = view.inflate( R.layout.item_tlg_chat, parent, false ) + return ChatTlgViewHolder( binding ) + } + + override fun getItemCount(): Int { + return ChatItemList.size + } + + override fun onBindViewHolder( chatViewHolder: ChatTlgViewHolder, position: Int) { + chatViewHolder.bind( ChatItemList[position] ) + } + fun onItemSwipe( position:Int, direction:Int ){ + ChatItemList.removeAt(position) + notifyItemRemoved(position) + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt new file mode 100644 index 0000000..ac24adb --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt @@ -0,0 +1,50 @@ +package otus.gpb.recyclerview + +import com.github.javafaker.Faker + +data class ChatTlgItem( +// TODO There should be a real structure with Tg chat elements + val chatName: String, // Chat name + val messageAuthor: String, // Message author + val messageTitle: String, // Message fragment + val messageTime: String, // Message recv time + val messageCnt: Int, // Message count + val photo: String // Avatar +) + +class ChatTlgService( private val isNewList: Boolean ){ + + private var itemsCnt:Int = 6 + private var chatList = mutableListOf() + + init { + if( isNewList ) itemsCnt = 20 + val faker = Faker.instance() + + chatList = (0..itemsCnt).map { + ChatTlgItem( + chatName = faker.name().fullName(), + messageAuthor = faker.name().fullName(), + messageTitle = faker.book().title(), + messageTime = faker.numerify("##:## AM"),//"11:25 AM", + messageCnt = faker.number().numberBetween(1,100), + photo = IMAGES[it % IMAGES.size], + ) + }.toMutableList() + } + + fun getTlgChat() : List{ + return chatList + } + + companion object { + private val IMAGES = mutableListOf( + "avatar_1", + "avatar_2", + "avatar_3", + "avatar_4", + "avatar_5", + "avatar_6" + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt new file mode 100644 index 0000000..3ba2103 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt @@ -0,0 +1,35 @@ +package otus.gpb.recyclerview + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + +class TlgItemTouchHelper( val adapter: ChatTlgAdapter ) : ItemTouchHelper.Callback() { + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + val swipeFlags = ItemTouchHelper.START + return makeMovementFlags(0 , swipeFlags) + } + + override fun isItemViewSwipeEnabled(): Boolean { + return true + } + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped( + viewHolder: RecyclerView.ViewHolder, + direction: Int + ) { + val itemPosition:Int = viewHolder.adapterPosition + adapter.onItemSwipe( itemPosition, direction ) + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt new file mode 100644 index 0000000..775426b --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt @@ -0,0 +1,48 @@ +package otus.gpb.recyclerview + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import org.apache.commons.lang3.ClassUtils.getPackageName + +class ChatTlgViewHolder( private val view : View ) : RecyclerView.ViewHolder( view ){ + + private val image: ImageView by lazy { view.findViewById(R.id.imageView) } + private val chatName: TextView by lazy { view.findViewById(R.id.chatNameTextView) } + private val messAuthor: TextView by lazy { view.findViewById(R.id.authorTextView) } + private val messageText: TextView by lazy { view.findViewById(R.id.messageTextView) } + private val messageTime: TextView by lazy { view.findViewById(R.id.timeTextView) } + private val messageCnt: TextView by lazy { view.findViewById(R.id.cntMessTextView) } + + + fun bind( chatTlgItem: ChatTlgItem ) { + + chatName.text = chatTlgItem.chatName + messAuthor.text = chatTlgItem.messageAuthor + messageText.text = chatTlgItem.messageTitle + messageTime.text = chatTlgItem.messageTime + messageCnt.text = chatTlgItem.messageCnt.toString() + + image.setImageResource(R.drawable.ic_person) + + val resourceName = chatTlgItem.photo + val res = view.context.getResources() + val packageName = view.context.packageName + val resourceId = res.getIdentifier(resourceName, "drawable", packageName ) + if (resourceId != 0) { + + image.setImageResource(resourceId) + /* + Glide.with(view.context) + .load(resourceId) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.ALL ) + .circleCrop() + .into(image) + */ + } + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt index e2cdca7..048a470 100644 --- a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt +++ b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt @@ -1,12 +1,49 @@ -package otus.gpb.recyclerview - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } +package otus.gpb.recyclerview + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +class MainActivity : AppCompatActivity() { + + private var ChatTlgList:List = mutableListOf() + private lateinit var chatTlgAdapter:ChatTlgAdapter + private lateinit var dividerItemDecoration : DividerItemDecoration + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + ChatTlgList = ChatTlgService( true ).getTlgChat() + chatTlgAdapter = ChatTlgAdapter( ) + + val manager = LinearLayoutManager(this) // LayoutManager + val rv = findViewById(R.id.recyclerView) + rv.adapter = chatTlgAdapter + rv.layoutManager = manager + dividerItemDecoration = DividerItemDecoration( + rv.context, + (rv.layoutManager as LinearLayoutManager).orientation + ) + rv.addItemDecoration(dividerItemDecoration) + + chatTlgAdapter.setList( ChatTlgList ) + + var callback = TlgItemTouchHelper( chatTlgAdapter ) + var itemTouchHelper = ItemTouchHelper( callback ) + itemTouchHelper.attachToRecyclerView( rv ) + rv.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (!recyclerView.canScrollVertically(1)) { + var chatAddList = ChatTlgService( false ) + ChatTlgList = ChatTlgList + chatAddList.getTlgChat() + chatTlgAdapter.setList( ChatTlgList ) + } + } + }) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_1.png b/app/src/main/res/drawable/avatar_1.png new file mode 100644 index 0000000..59b42a7 Binary files /dev/null and b/app/src/main/res/drawable/avatar_1.png differ diff --git a/app/src/main/res/drawable/avatar_2.png b/app/src/main/res/drawable/avatar_2.png new file mode 100644 index 0000000..1b3848a Binary files /dev/null and b/app/src/main/res/drawable/avatar_2.png differ diff --git a/app/src/main/res/drawable/avatar_3.png b/app/src/main/res/drawable/avatar_3.png new file mode 100644 index 0000000..42b9f30 Binary files /dev/null and b/app/src/main/res/drawable/avatar_3.png differ diff --git a/app/src/main/res/drawable/avatar_4.png b/app/src/main/res/drawable/avatar_4.png new file mode 100644 index 0000000..032b7b7 Binary files /dev/null and b/app/src/main/res/drawable/avatar_4.png differ diff --git a/app/src/main/res/drawable/avatar_5.png b/app/src/main/res/drawable/avatar_5.png new file mode 100644 index 0000000..c082205 Binary files /dev/null and b/app/src/main/res/drawable/avatar_5.png differ diff --git a/app/src/main/res/drawable/avatar_6.png b/app/src/main/res/drawable/avatar_6.png new file mode 100644 index 0000000..296070c Binary files /dev/null and b/app/src/main/res/drawable/avatar_6.png differ diff --git a/app/src/main/res/drawable/avatar_7.png b/app/src/main/res/drawable/avatar_7.png new file mode 100644 index 0000000..59b42a7 Binary files /dev/null and b/app/src/main/res/drawable/avatar_7.png differ diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml new file mode 100644 index 0000000..ac99f74 --- /dev/null +++ b/app/src/main/res/drawable/ic_person.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/menu.png b/app/src/main/res/drawable/menu.png new file mode 100644 index 0000000..e34fa2d Binary files /dev/null and b/app/src/main/res/drawable/menu.png differ diff --git a/app/src/main/res/drawable/round_shape.xml b/app/src/main/res/drawable/round_shape.xml new file mode 100644 index 0000000..2a08a28 --- /dev/null +++ b/app/src/main/res/drawable/round_shape.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2d026df..7467957 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,13 +1,38 @@ - - - - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tlg_chat.xml b/app/src/main/res/layout/item_tlg_chat.xml new file mode 100644 index 0000000..83d4974 --- /dev/null +++ b/app/src/main/res/layout/item_tlg_chat.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + \ 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..a07de26 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,13 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + #909090 + #BD3D3D + #3D61BD \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d78b1f..4801a43 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - - RecyclerView + + Telegram \ 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..8ed3dde 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,16 +1,16 @@ - - - + + + \ No newline at end of file