Skip to content

Commit

Permalink
[Nunu/#38] feat: 8주차 구현2
Browse files Browse the repository at this point in the history
- AlbumFragment에 하트 누르면 User 구분하여 Like Table 업데이트 기능 구현
- 저장앨범 탭에 띄우기 기능 구현
- 앨범 리사이클러뷰 구현
- 기존 item_locker_album.xml -> item_locker_song.xml로 변경
- fragment에 onResume, onStart에 설정하여 바로바로 업데이트 되게 보여줌.
  • Loading branch information
Ssamssamukja committed Jun 3, 2024
1 parent afed4a9 commit 9ce2f97
Show file tree
Hide file tree
Showing 13 changed files with 331 additions and 10 deletions.
12 changes: 12 additions & 0 deletions UMC_6th/app/src/main/java/com/example/umc_6th/AlbumDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,16 @@ interface AlbumDao {

@Query("SELECT * FROM AlbumTable WHERE id = :id")
fun getAlbum(id: Int): Album

@Insert
fun likeAlbum(like: Like)

@Query("DELETE FROM LikeTable WHERE userId = :userId AND albumId = :albumId")
fun disLikeAlbum(userId: Int, albumId: Int)

@Query("SELECT id FROM LikeTable WHERE userId = :userId AND albumId = :albumId")
fun isLikedAlbum(userId: Int, albumId: Int): Int?

@Query("SELECT AT.* FROM LikeTable as LT LEFT JOIN AlbumTable as AT ON LT.albumId = AT.id WHERE LT.userId = :userId")
fun getLikedAlbums(userId: Int): List<Album>
}
61 changes: 60 additions & 1 deletion UMC_6th/app/src/main/java/com/example/umc_6th/AlbumFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
Expand All @@ -23,6 +24,8 @@ class AlbumFragment: Fragment(R.layout.fragment_album) {
private val binding get() = _binding!!
private var gson: Gson = Gson()
private val information = arrayListOf("수록곡", "상세정보", "영상")
private var isLiked : Boolean = false

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -33,19 +36,24 @@ class AlbumFragment: Fragment(R.layout.fragment_album) {
//앨범 데이터
val albumToJson = arguments?.getString("album")
val album = gson.fromJson(albumToJson, Album::class.java)
isLiked = isLikedAlbum(album.id)
setInit(album)
setOnClickListener(album)

return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

/*
// 뒤로가기 이미지 뷰에 클릭 리스너 설정
binding.albumBackIv.setOnClickListener {
// 이전 프래그먼트로 돌아가기
requireActivity().supportFragmentManager.popBackStack()
}
*/

val adapter = AlbumPagerAdapter(this)
binding.albumViewPager.adapter = adapter

Expand All @@ -71,6 +79,57 @@ class AlbumFragment: Fragment(R.layout.fragment_album) {
binding.imgAlbumAlbumCov.setImageResource(album.coverImg!!)
binding.txAlbumAlbumTitle.text = album.title
binding.txAlbumAlbumArtist.text = album.artist
if(isLiked) {
binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_on)
}else {
binding.albumLikeIv.setImageResource((R.drawable.ic_my_like_off))
}
}

private fun getJwt() : Int {
val spf = requireActivity().getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE)
return spf.getInt("jwt", 0)
}

private fun likeAlbum(userId : Int, albumId : Int) {
val songDB = SongDatabase.getInstance(requireActivity())!!
val like = Like(userId, albumId)

songDB.albumDao().likeAlbum(like)
}
private fun isLikedAlbum(albumId : Int) : Boolean {
val songDB = SongDatabase.getInstance(requireActivity())!!
val userId = getJwt()

val likeId : Int? = songDB.albumDao().isLikedAlbum(userId, albumId)
return likeId != null
}

private fun disLikeAlbum(albumId : Int) {
val songDB = SongDatabase.getInstance(requireActivity())!!
val userId = getJwt()

songDB.albumDao().disLikeAlbum(userId, albumId)
}

private fun setOnClickListener(album : Album) {
val userId = getJwt()
binding.albumLikeIv.setOnClickListener {
if(isLiked) {
binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_off)
disLikeAlbum(album.id)
}else {
binding.albumLikeIv.setImageResource((R.drawable.ic_my_like_on))
likeAlbum(userId, album.id)
}
isLiked = !isLiked
}
binding.albumBackIv.setOnClickListener {
(context as MainActivity).supportFragmentManager.beginTransaction()
.replace(R.id.main_container, HomeFragment())
.commitAllowingStateLoss()
}

}


Expand Down
9 changes: 9 additions & 0 deletions UMC_6th/app/src/main/java/com/example/umc_6th/Like.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.umc_6th

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "LikeTable")
data class Like(var userId: Int, var albumId: Int) {
@PrimaryKey(autoGenerate = true) var id: Int = 0
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import com.google.android.material.tabs.TabLayoutMediator
class LockerFragment : Fragment() {
private var _binding: FragmentLockerBinding? = null
private val binding get() = _binding!!
private val information = arrayListOf("저장한곡", "음악파일")
private val information = arrayListOf("저장한곡", "음악파일", "저장앨범")

private lateinit var sharedViewModel: SharedViewModel
private lateinit var bottomSheetDialog: BottomSheetDialog
Expand Down Expand Up @@ -95,6 +95,7 @@ class LockerFragment : Fragment() {
initViews()
}

// 로그인 또는 로그아웃 기능
private fun getJwt() : Int {
val spf = requireActivity().getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE)
return spf!!.getInt("jwt", 0)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.umc_6th

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.umc_6th.adapter.LockerSavedAlbumRecyclerAdapter
import com.example.umc_6th.databinding.FragmentLockerSavedAlbumBinding
import androidx.recyclerview.widget.LinearLayoutManager

class LockerSavedAlbumFragment : Fragment() {
lateinit var binding: FragmentLockerSavedAlbumBinding
lateinit var albumDB: SongDatabase

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLockerSavedAlbumBinding.inflate(inflater, container, false)

albumDB = SongDatabase.getInstance(requireContext())!!

return binding.root
}
override fun onStart() {
super.onStart()
initRecyclerview()
}

private fun initRecyclerview(){
binding.lockerSavedSongRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

val lockerSavedAlbumRecyclerAdapter = LockerSavedAlbumRecyclerAdapter()
//리스너 객체 생성 및 전달

lockerSavedAlbumRecyclerAdapter.setMyItemClickListener(object : LockerSavedAlbumRecyclerAdapter.MyItemClickListener{
override fun onRemoveSong(songId: Int) {
albumDB.albumDao().getLikedAlbums(getJwt())
}
})

binding.lockerSavedSongRecyclerView.adapter = lockerSavedAlbumRecyclerAdapter

lockerSavedAlbumRecyclerAdapter.addAlbums(albumDB.albumDao().getLikedAlbums(getJwt()) as ArrayList)
}

private fun getJwt() : Int {
val spf = activity?.getSharedPreferences("auth" , AppCompatActivity.MODE_PRIVATE)
val jwt = spf!!.getInt("jwt", 0)
Log.d("MAIN_ACT/GET_JWT", "jwt_token: $jwt")

return jwt
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [Song::class, Album::class, User::class], version = 1)
@Database(entities = [Song::class, Album::class, User::class, Like::class], version = 1)
abstract class SongDatabase: RoomDatabase() {
abstract fun albumDao(): AlbumDao
abstract fun songDao(): SongDao
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.example.umc_6th.R
import com.example.umc_6th.Song
import com.example.umc_6th.databinding.ItemLockerAlbumBinding
import com.example.umc_6th.databinding.ItemLockerSongBinding

class LockerAlbumRecyclerAdapter() : RecyclerView.Adapter<LockerAlbumRecyclerAdapter.ViewHolder>() {

Expand All @@ -18,7 +19,7 @@ class LockerAlbumRecyclerAdapter() : RecyclerView.Adapter<LockerAlbumRecyclerAda
parent: ViewGroup,
viewType: Int
): LockerAlbumRecyclerAdapter.ViewHolder {
val binding: ItemLockerAlbumBinding = ItemLockerAlbumBinding
val binding: ItemLockerSongBinding = ItemLockerSongBinding
.inflate(LayoutInflater.from(parent.context), parent, false)

return ViewHolder(binding)
Expand All @@ -41,7 +42,7 @@ class LockerAlbumRecyclerAdapter() : RecyclerView.Adapter<LockerAlbumRecyclerAda

override fun getItemCount(): Int = songs.size

inner class ViewHolder(val binding: ItemLockerAlbumBinding): RecyclerView.ViewHolder(binding.root){
inner class ViewHolder(val binding: ItemLockerSongBinding): RecyclerView.ViewHolder(binding.root){

fun bind(song: Song){
binding.txItemLockerAlbumTitle.text = song.title
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@ package com.example.umc_6th.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.example.umc_6th.LockerMusicFileFragment
import com.example.umc_6th.LockerSavedAlbumFragment
import com.example.umc_6th.LockerSavedSongFragment

class LockerPagerAdapter (fragment : Fragment) : FragmentStateAdapter(fragment) {
override fun getItemCount(): Int = 2
override fun getItemCount(): Int = 3

override fun createFragment(position: Int): Fragment {
return when(position){
0 -> LockerSavedSongFragment()
else -> LockerMusicFileFragment()
1 -> LockerMusicFileFragment()
else -> LockerSavedAlbumFragment()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.umc_6th.adapter

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.umc_6th.Album
import com.example.umc_6th.databinding.ItemLockerAlbumBinding

class LockerSavedAlbumRecyclerAdapter : RecyclerView.Adapter<LockerSavedAlbumRecyclerAdapter.ViewHolder>() {
private val albums = ArrayList<Album>()

interface MyItemClickListener{
fun onRemoveSong(songId: Int)
}

private lateinit var mItemClickListener: MyItemClickListener

fun setMyItemClickListener(itemClickListener: MyItemClickListener){
mItemClickListener = itemClickListener
}

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): LockerSavedAlbumRecyclerAdapter.ViewHolder {
val binding: ItemLockerAlbumBinding = ItemLockerAlbumBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)

return ViewHolder(binding)
}

override fun onBindViewHolder(holder: LockerSavedAlbumRecyclerAdapter.ViewHolder, position: Int) {
holder.bind(albums[position])
holder.binding.imgItemLockerAlbumMore.setOnClickListener {
mItemClickListener.onRemoveSong(albums[position].id)
removeSong(position)
}
}

override fun getItemCount(): Int = albums.size

@SuppressLint("NotifyDataSetChanged")
fun addAlbums(albums: ArrayList<Album>) {
this.albums.clear()
this.albums.addAll(albums)

notifyDataSetChanged()
}

fun removeSong(position: Int){
albums.removeAt(position)
notifyDataSetChanged()
}

inner class ViewHolder(val binding: ItemLockerAlbumBinding) : RecyclerView.ViewHolder(binding.root){
fun bind(album: Album){
binding.imgItemLockerAlbumCover.setImageResource(album.coverImg!!)
binding.txItemLockerAlbumTitle.text = album.title
binding.txItemLockerAlbumArtist.text = album.artist
}
}

}
7 changes: 6 additions & 1 deletion UMC_6th/app/src/main/res/layout/fragment_locker.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

<com.google.android.material.tabs.TabLayout
android:id="@+id/tbLocker"
android:layout_width="180dp"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:background="@color/white"
Expand All @@ -52,6 +52,11 @@
android:layout_height="wrap_content"
android:text="음악 파일" />

<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="저장 앨범" />

</com.google.android.material.tabs.TabLayout>

<ImageView
Expand Down
18 changes: 18 additions & 0 deletions UMC_6th/app/src/main/res/layout/fragment_locker_saved_album.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/locker_savedSong_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_locker_album"
android:overScrollMode="never"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

</androidx.constraintlayout.widget.ConstraintLayout>
15 changes: 13 additions & 2 deletions UMC_6th/app/src/main/res/layout/item_locker_album.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

<androidx.cardview.widget.CardView
android:id="@+id/cardViewItemLockerAlbumCover"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="20dp"
app:cardCornerRadius="7dp"
app:cardElevation="0dp"
Expand Down Expand Up @@ -78,6 +78,17 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/cardViewItemLockerAlbumCover"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/txItemLockerAlbumInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="2021.03.25 | 정규 | 댄스 팝"
android:textColor="#a8a8a8"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="@+id/item_album_singer_tv"
app:layout_constraintTop_toBottomOf="@+id/item_album_singer_tv" />
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
Loading

0 comments on commit 9ce2f97

Please sign in to comment.