Skip to content
Merged
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 9th_Android
Submodule 9th_Android updated from 7a52fe to f0ed26
4 changes: 3 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
kotlin("kapt")
alias(libs.plugins.google.gms.google.services)
}

android {
Expand Down Expand Up @@ -55,6 +56,7 @@ dependencies {
implementation("com.google.code.gson:gson:2.10.1")
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.firebase.database)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
Expand All @@ -64,7 +66,7 @@ dependencies {

val roomVersion = "2.6.1"
implementation("androidx.room:room-runtime:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")

}
4 changes: 2 additions & 2 deletions app/src/main/java/com/example/umc/Album.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ data class Album(
var title: String? = "",
var singer: String? = "",
var coverImg: Int? = null,
@Ignore
val songs: List<Song> = emptyList()
var isLike: Boolean = false

)
33 changes: 33 additions & 0 deletions app/src/main/java/com/example/umc/AlbumDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.umc
import androidx.room.*


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

@Update
fun update(album: Album)

@Delete
fun delete(album: Album)

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

@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>
}
59 changes: 59 additions & 0 deletions app/src/main/java/com/example/umc/AlbumLockerRVAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.example.umc

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.umc.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
}
}

}
9 changes: 6 additions & 3 deletions app/src/main/java/com/example/umc/Like.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ 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
}
data class Like(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var userId: Int,
var albumId: Int
)
69 changes: 48 additions & 21 deletions app/src/main/java/com/example/umc/LockerFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.umc.databinding.FragmentLockerBinding
import com.google.android.material.tabs.TabLayoutMediator
import kotlin.jvm.java


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

override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -24,34 +22,63 @@ class LockerFragment : Fragment() {
): View {
binding = FragmentLockerBinding.inflate(inflater, container, false)

val lockerAdapter = LockerVPAdapter(this)
binding.lockerContentVp.adapter = lockerAdapter
TabLayoutMediator(binding.lockerContentTb, binding.lockerContentVp){
tab, position ->
tab.text = information[position]
}.attach()

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

val songDB = SongDatabase.getInstance(requireContext())!!
val userId = getJwt()
val likedAlbums = songDB.albumDao().getLikedAlbums(userId)

Log.d("LOKERFRAG/GET_ALBUMS", likedAlbums.toString())

return binding.root
}

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

initViews()
}

val lockerAdapter = LockerVPAdapter(this)
val loginButton: Button = view.findViewById(R.id.locker_login_tv)
private fun initViews() {
val jwt: Int = getJwt()

loginButton.setOnClickListener {
val intent = Intent(requireContext(), LoginActivity::class.java)
if (jwt == 0){
binding.lockerLoginTv.text = "로그인"

startActivity(intent)
binding.lockerLoginTv.setOnClickListener {
startActivity(Intent(activity, LoginActivity::class.java))
}
}
else{
binding.lockerLoginTv.text = "로그아웃"

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

// lockerAdapter.addFragment(SavedSongFragment())
// lockerAdapter.addFragment(MusicFileFragment())
// lockerAdapter.addFragment(SavedAlbumFragment())
private fun getJwt(): Int {
val spf = activity?.getSharedPreferences("auth" , AppCompatActivity.MODE_PRIVATE)

binding.lockerContentVp.adapter = lockerAdapter
return spf!!.getInt("jwt", 0)
}

// TabLayout과 ViewPager2 연동
TabLayoutMediator(binding.lockerContentTb, binding.lockerContentVp) { tab, position ->
tab.text = information[position]
}.attach()
private fun logout() {
val spf = activity?.getSharedPreferences("auth" , AppCompatActivity.MODE_PRIVATE)
val editor = spf!!.edit()

binding.lockerContentVp.setCurrentItem(2, false)
editor.remove("jwt")
editor.apply()
}
}
48 changes: 45 additions & 3 deletions app/src/main/java/com/example/umc/LoginActivtity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.example.umc

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.umc.databinding.ActivityLoginBinding

Expand All @@ -17,12 +19,52 @@ class LoginActivity : AppCompatActivity() {

val loginButton: Button = findViewById(R.id.login_sign_up_tv)

loginButton.setOnClickListener {

binding.loginSignUpTv.setOnClickListener {
val intent = Intent(this, SignupActivity::class.java)
}

startActivity(intent)
binding.loginSignInBtn.setOnClickListener {
login()
}
}

private fun login(){
if (binding.loginIdEt.text.toString().isEmpty() || binding.loginDirectInputEt.text.toString().isEmpty()) {
Toast.makeText(this, "이메일을 입력해주세요.", Toast.LENGTH_SHORT).show()
return
}
if (binding.loginPasswordEt.text.toString().isEmpty()) {
Toast.makeText(this, "비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show()
return
}

val email : String = binding.loginIdEt.text.toString() + "@" + binding.loginDirectInputEt.text.toString()
val pwd : String = binding.loginPasswordEt.text.toString()

val songDB = SongDatabase.getInstance(this)!!
val user = songDB.userDao().getUser(email, pwd)

user?.let {
Log.d("LOGINACT/GET_USER", "userId : ${user.id}, $user")
saveJwt(user.id)
startMainActivity()
}

Toast.makeText(this, "회원 정보가 존재하지 않습니다.", Toast.LENGTH_SHORT).show()


}
private fun startMainActivity() {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}


private fun saveJwt(jwt: Int){
val spf = getSharedPreferences("auth" , MODE_PRIVATE)
val editor = spf.edit()

editor.putInt("jwt", jwt)
editor.apply()
}
}
7 changes: 7 additions & 0 deletions app/src/main/java/com/example/umc/LookView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.umc

interface LookView {
fun onGetSongLoading()
fun onGetSongSuccess(code: Int, result: FloChartResult)
fun onGetSongFailure(code: Int, message: String)
}
1 change: 1 addition & 0 deletions app/src/main/java/com/example/umc/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class MainActivity : AppCompatActivity() {
private var song:Song = Song()
private var gson: Gson = Gson()


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTheme(R.style.Theme_Umc)
Expand Down
25 changes: 25 additions & 0 deletions app/src/main/java/com/example/umc/SavedAlbumFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,31 @@ class SavedAlbumFragment : Fragment() {

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

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

val albumRVAdapter = AlbumLockerRVAdapter()
//리스너 객체 생성 및 전달

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

binding.lockerSavedSongRecyclerView.adapter = albumRVAdapter

albumRVAdapter.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
}
}
Loading