Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 과제/.idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions 과제/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 4 additions & 12 deletions 과제/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,19 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FLO">
<!-- <activity-->
<!-- android:name=".SplashActivity"-->
<!-- android:exported="true">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->

<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- <activity android:name=".MainActivity"></activity>-->
<activity
android:name=".MainActivity"
android:name=".SplashActivity"
android:exported="true">
<!-- android:theme="@style/SplashTheme"> -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"></activity>
<activity android:name=".SongActivity"/>
<activity android:name=".LoginActivity"/>
<activity android:name=".SignUpActivity"/>
</application>

</manifest>
8 changes: 6 additions & 2 deletions 과제/app/src/main/java/com/example/flo/Album.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.example.flo

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

@Entity(tableName = "AlbumTable")
data class Album(
@PrimaryKey(autoGenerate = false) var id: Int = 0,
var title: String? = "",
var singer: String? = "",
var coverImg: Int? = null,
var songs: ArrayList<Song>? = null
var coverImg: Int? = null
)
25 changes: 25 additions & 0 deletions 과제/app/src/main/java/com/example/flo/AlbumDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.flo

import androidx.room.*

@Dao
interface AlbumDao {
@Insert
fun insert(album: Album)

@Query("SELECT * FROM AlbumTable")
fun getAlbums(): List<Album>

@Insert
fun likeAlbum(like: Like)

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

@Query("DELETE FROM LikeTable WHERE userId = :userId AND albumId = :albumId")
fun disLikedAlbum(userId:Int, albumId:Int) //null 처리

@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>
// LikeTable 기준으로 join, LikeTable에 있는 id와 Albumid의 id가 같은 것끼리
}
50 changes: 50 additions & 0 deletions 과제/app/src/main/java/com/example/flo/AlbumFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResultListener
import com.example.flo.databinding.FragmentAlbumBinding
Expand All @@ -19,6 +20,8 @@ class AlbumFragment : Fragment() {

private var gson: Gson = Gson()

private var isLiked : Boolean = false

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -30,7 +33,9 @@ class AlbumFragment : Fragment() {

val albumJson = arguments?.getString("album") // json 꺼내기
val album = gson.fromJson(albumJson, Album::class.java) // 앨범 객체로 변환
isLiked = isLikedAlbum(album.id)
setInit(album) // 표시
setOnClickListeners(album)

binding.albumBackIv.setOnClickListener {
(context as MainActivity).supportFragmentManager.beginTransaction().replace(R.id.main_frm, HomeFragment()).commitAllowingStateLoss()
Expand All @@ -55,6 +60,51 @@ class AlbumFragment : Fragment() {
binding.albumAlbumIv.setImageResource(album.coverImg!!)
binding.albumMusicTitleTv.text = album.title.toString()
binding.albumSingerNameTv.text = album.singer.toString()
if (isLiked) {
binding.albumAlbumIv.setImageResource(R.drawable.ic_my_like_on)
} else {
binding.albumAlbumIv.setImageResource(R.drawable.ic_my_like_off)
}
}

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

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

songDB.albumDao().likeAlbum(like)
}

private fun isLikedAlbum(albumId: Int): Boolean {
val songDB = SongDatabase.getInstance(requireContext())!!
val userId = getJwt()

val likeId : Int? = songDB.albumDao().isLikedAlbum(userId, albumId)

return likeId != null
}

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

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

private fun setOnClickListeners(album: Album) {
val userId = getJwt()
binding.albumLikeIv.setOnClickListener {
if (isLiked) {
binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_off)
disLikedAlbum(album.id)
} else {
binding.albumAlbumIv.setImageResource((R.drawable.ic_my_like_on))
isLikedAlbum(album.id)
}
}
}
}
59 changes: 59 additions & 0 deletions 과제/app/src/main/java/com/example/flo/AlbumLockerRVAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.example.flo

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

class AlbumLockerRVAdapter (): RecyclerView.Adapter<AlbumLockerRVAdapter.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): AlbumLockerRVAdapter.ViewHolder {
val binding: ItemLockerAlbumBinding = ItemLockerAlbumBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)

return ViewHolder(binding)
}

override fun onBindViewHolder(holder: AlbumLockerRVAdapter.ViewHolder, position: Int) {
holder.bind(albums[position])
holder.binding.itemAlbumMoreIv.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.itemAlbumImgIv.setImageResource(album.coverImg!!)
binding.itemAlbumTitleTv.text = album.title
binding.itemAlbumSingerTv.text = album.singer
}
}

}
15 changes: 4 additions & 11 deletions 과제/app/src/main/java/com/example/flo/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class HomeFragment : Fragment() {
lateinit var binding: FragmentHomeBinding
private var albumDatas = ArrayList<Album>()

private lateinit var songDB: SongDatabase

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -41,17 +43,8 @@ class HomeFragment : Fragment() {
val autoBanner = AutoBanner(panelAdapter)
autoBanner.start()

// 리사이클러뷰
// 데이터 리스트 생성 더미 데이터
// 실제 어플에선 데이터를 서버에서 받아온다.
albumDatas.apply {
add(Album("Butter", "방탄소년단 (BTS)", R.drawable.img_album_exp))
add(Album("Lilac", "아이유 (IU)", R.drawable.img_album_exp2))
add(Album("Next Level", "에스파 (AESPA)", R.drawable.img_album_exp))
add(Album("Boy with Luv", "방탄소년단 (BTS)", R.drawable.img_album_exp2))
add(Album("BBoom BBoom", "모모랜드 (MOMOLAND)", R.drawable.img_album_exp))
add(Album("Weekden", "태연 (Tae Yeon)", R.drawable.img_album_exp2))
}
songDB = SongDatabase.getInstance(requireContext())!!
albumDatas.addAll(songDB.albumDao().getAlbums())

val albumRVAdapter = AlbumRVAdapter(albumDatas)
binding.homeTodayMusicAlbumRv.adapter = albumRVAdapter
Expand Down
12 changes: 12 additions & 0 deletions 과제/app/src/main/java/com/example/flo/Like.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.flo

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
}
43 changes: 42 additions & 1 deletion 과제/app/src/main/java/com/example/flo/LockerFragment.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package com.example.flo

import android.content.Intent
import android.os.Bundle
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.flo.databinding.FragmentLockerBinding
import com.google.android.material.tabs.TabLayoutMediator

class LockerFragment : Fragment() {

lateinit var binding: FragmentLockerBinding
private val information = arrayListOf("저장한 곡", "음악파일")
private val information = arrayListOf("저장한 곡", "음악파일", "저장 앨범")

override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -28,6 +30,45 @@ class LockerFragment : Fragment() {
tab.text = information[position]
}.attach() // 탭 레이아웃과 뷰 페이저 붙이기

binding.lockerLoginTv.setOnClickListener{
startActivity(Intent(activity, LoginActivity::class.java))
}

return binding.root
}

override fun onStart() {
super.onStart()
initViews()
}

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

private fun initViews(){
val jwt: Int = getJwt()
if (jwt == 0){
binding.lockerLoginTv.text = "로그인"
binding.lockerLoginTv.setOnClickListener {
startActivity(Intent(activity, LoginActivity::class.java))
}
} else {
binding.lockerLoginTv.text = "로그아웃"
binding.lockerLoginTv.setOnClickListener {
// 로그아웃 진행
logout()
startActivity(Intent(activity, MainActivity::class.java))
}
}
}

private fun logout() {
// 로그아웃 시 jwt는 0
val spf = activity?.getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE)
val editor = spf!!.edit()
editor.remove("jwt")
editor.apply()
}
}
5 changes: 3 additions & 2 deletions 과제/app/src/main/java/com/example/flo/LockerVPAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter

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

override fun createFragment(position: Int): Fragment {
// when은 switch와 비슷하다.
return when(position){
0 -> SavedFragment()
else -> MusicfilesFragment() // 1
1 -> MusicfilesFragment() // 1
else -> SavedAlbumFragment()
}
}

Expand Down
Loading