diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index e5cbb64..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,34 +0,0 @@
-# Gradle files
-.gradle/
-build/
-
-# Local configuration file (sdk path, etc)
-local.properties
-
-# Log/OS Files
-*.log
-
-# Android Studio generated files and folders
-captures/
-.externalNativeBuild/
-.cxx/
-*.aab
-*.apk
-output-metadata.json
-
-# IntelliJ
-*.iml
-.idea/
-misc.xml
-deploymentTargetDropDown.xml
-render.experimental.xml
-
-# Keystore files
-*.jks
-*.keystore
-
-# Google Services (e.g. APIs or Firebase)
-google-services.json
-
-# Android Profiling
-*.hprof
diff --git a/README.md b/README.md
deleted file mode 100644
index 904e458..0000000
--- a/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# π Android A π
-
-DGU-UMC 9κΈ° Android μ€ν°λ Aμ‘°
-
-## π» Member
-
-| λ°λ°μ§ν | λ°λ°μ§ν | λ°λ°μ§ν | λ°λ°μ§ν |
-| :-----------------------------------: | :-----------------------------------: | :-----------------------------------: | :-----------------------------------: |
-| [λ°μ§ν](https://github.com/wlgusqkr) | [λ°μ§ν](https://github.com/wlgusqkr) | [λ°μ§ν](https://github.com/wlgusqkr) | [λ°μ§ν](https://github.com/wlgusqkr) |
-
-## π³ branch κ·μΉ
-
-```bash
-ββmain
- ββEan/main
- β ββEan/#1
-```
-
-1. `λλ€μ/main λΈλμΉ`κ° κΈ°λ³Έ λΈλμΉλ‘ pr λ³΄λΌ λ main λΈλμΉκ° μλ λλ€μ/main λΈλμΉλ‘ μ¬λ¦½λλ€.
-2. λ§€μ£Ό μ€μ΅, λ―Έμ
μ κ°μμ λλ€μ/main λΈλμΉλ₯Ό base λΈλμΉλ‘ μΌμ `λλ€μ/μ΄μλ²νΈ λΈλμΉ`λ₯Ό μμ±νμ¬ κ΄λ ¨ νμΌμ μ
λ‘λν©λλ€.
-3. λͺ¨λ νμλ€μ approveλ₯Ό λ°μΌλ©΄, prμ λ¨Έμ§ν©λλ€. approveμ mergeλ μ€ν°λ μ§ν μ€μ μ΄λ£¨μ΄μ§λλ€.
-
-## π λλ ν°λ¦¬ κ·μΉ
-
-```bash
-ββλλ€μ
- ββλ―Έμ
μ΄λ¦ (μ: week1, flo_clone)
- β ββνλ‘μ νΈλͺ
- ββλ―Έμ
μ΄λ¦
- β ββνλ‘μ νΈλͺ
-```
-
-## π μ»€λ° μ»¨λ²€μ
-
-1. 컀λ°μ ν΄λΉνλ μ»€λ° λ©μμ§ μ°κΈ° (μ: [parkparkjihyeon/#1] mission {λ΄μ©} )
-
-| Message | μ€λͺ
|
-| :------: | :-------------------- |
-| mission | λ―Έμ
μν |
-| practice | μ€μ΅ μν |
-| keyword | ν€μλ μ 리 |
-| workbook | μν¬λΆ μ 리 |
-| fix | λ²κ·Έ μμ |
-| docs | λ¬Έμ μμ |
-| comment | μ£Όμ μΆκ° λ° λ³κ²½ |
-| test | ν
μ€νΈ μ½λ μΆκ° |
-| rename | νμΌ νΉμ ν΄λλͺ
μμ |
-| remove | νμΌ νΉμ ν΄λ μμ |
-| chore | κΈ°ν λ³κ²½μ¬ν |
diff --git a/backy/test.txt b/backy/test.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/bongbak/week2/.idea/studiobot.xml b/bongbak/week2/.idea/studiobot.xml
new file mode 100644
index 0000000..539e3b8
--- /dev/null
+++ b/bongbak/week2/.idea/studiobot.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/.kotlin/errors/errors-1762774619558.log b/bongbak/week2/.kotlin/errors/errors-1762774619558.log
new file mode 100644
index 0000000..1219b50
--- /dev/null
+++ b/bongbak/week2/.kotlin/errors/errors-1762774619558.log
@@ -0,0 +1,4 @@
+kotlin version: 2.0.21
+error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
+ 1. Kotlin compile daemon is ready
+
diff --git a/bongbak/week2/.kotlin/errors/errors-1762851684314.log b/bongbak/week2/.kotlin/errors/errors-1762851684314.log
new file mode 100644
index 0000000..1219b50
--- /dev/null
+++ b/bongbak/week2/.kotlin/errors/errors-1762851684314.log
@@ -0,0 +1,4 @@
+kotlin version: 2.0.21
+error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
+ 1. Kotlin compile daemon is ready
+
diff --git a/bongbak/week2/app/build.gradle.kts b/bongbak/week2/app/build.gradle.kts
index 1c955a1..23990c6 100644
--- a/bongbak/week2/app/build.gradle.kts
+++ b/bongbak/week2/app/build.gradle.kts
@@ -1,8 +1,8 @@
-import org.jetbrains.kotlin.storage.CacheResetOnProcessCanceled.enabled
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
+ kotlin("kapt")
}
@@ -45,6 +45,7 @@ android {
}
dependencies {
+ implementation("com.google.code.gson:gson:2.10.1")
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
@@ -54,4 +55,9 @@ dependencies {
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
+ implementation("androidx.core:core-splashscreen:1.0.1")
+ implementation("me.relex:circleindicator:2.1.6")
+ implementation("androidx.room:room-ktx:2.6.1")
+ implementation("androidx.room:room-runtime:2.6.1")
+ kapt("androidx.room:room-compiler:2.6.1")
}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/AndroidManifest.xml b/bongbak/week2/app/src/main/AndroidManifest.xml
index a9b0652..3020811 100644
--- a/bongbak/week2/app/src/main/AndroidManifest.xml
+++ b/bongbak/week2/app/src/main/AndroidManifest.xml
@@ -4,8 +4,6 @@
+
+ android:theme="@style/SplashTheme">
-
-
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/Album.kt b/bongbak/week2/app/src/main/java/com/example/mission2/Album.kt
new file mode 100644
index 0000000..7f9f043
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/Album.kt
@@ -0,0 +1,16 @@
+package com.example.mission2
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName="AlbumTable")
+data class Album(
+ var title:String?="",
+ var singer:String?="",
+ var coverImg : Int? =null,
+ var isLike: Boolean = false,
+ var songs: ArrayList?=null
+) {
+ @PrimaryKey(autoGenerate = false)
+ var id: Int = 0
+}
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/AlbumFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/AlbumFragment.kt
index 5f2eaed..fd798de 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/AlbumFragment.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/AlbumFragment.kt
@@ -8,12 +8,14 @@ import androidx.fragment.app.Fragment
import com.example.mission2.databinding.FragmentAlbumBinding
import com.example.mission2.databinding.FragmentSongBinding
import com.google.android.material.tabs.TabLayoutMediator
+import com.google.gson.Gson
class AlbumFragment : Fragment() {
private val information=arrayListOf("μλ‘곑","μμΈμ 보","μμ")
lateinit var binding : FragmentAlbumBinding
+ private var gson: Gson =Gson()
override fun onCreateView(
inflater : LayoutInflater,
@@ -30,6 +32,12 @@ class AlbumFragment : Fragment() {
.replace(R.id.main_frm, HomeFragment()).commitAllowingStateLoss()
}
+
+
+ val albumJson=arguments?.getString("album")
+ val album=gson.fromJson(albumJson,Album::class.java)
+ setInit(album)
+
val albumAdapter = AlbumVPAdapter(this,titleFromTextView,composerFromTextView)
binding.albumContentVp.adapter=albumAdapter
TabLayoutMediator(binding.albumContentTb, binding.albumContentVp) { tab, position ->
@@ -38,4 +46,9 @@ class AlbumFragment : Fragment() {
return binding.root
}
+ private fun setInit(album:Album){
+ binding.albumAlbumIv.setImageResource(album.coverImg!!)
+ binding.albumMusicTitleTv.text=album.title.toString()
+ binding.albumSingerNameTv.text=album.singer.toString()
+ }
}
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/AlbumRVAdapter.kt b/bongbak/week2/app/src/main/java/com/example/mission2/AlbumRVAdapter.kt
new file mode 100644
index 0000000..0ba4a07
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/AlbumRVAdapter.kt
@@ -0,0 +1,60 @@
+package com.example.mission2
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.mission2.databinding.ItemAlbumBinding
+
+class AlbumRVAdapter(private val albumList:ArrayList): RecyclerView.Adapter(){
+
+ interface MyItemClickListener{
+ fun onItemClick(album: Album)
+ fun onRemoveAlbum(position:Int)
+ fun onPlayClick(album: Album)
+ }
+
+ private lateinit var myItemClickListener: MyItemClickListener
+ fun setMyItemClickListener(itemClickListener: MyItemClickListener){
+ myItemClickListener=itemClickListener
+ }
+
+ fun addItem(album:Album){
+ albumList.add(album)
+ notifyDataSetChanged()
+ }
+ fun removeItem(position:Int){
+ albumList.removeAt(position)
+ notifyDataSetChanged()
+ }
+
+ override fun onCreateViewHolder(
+ viewGroup: ViewGroup,
+ viewType: Int
+ ): AlbumRVAdapter.ViewHolder {
+
+ val binding: ItemAlbumBinding=ItemAlbumBinding.inflate(LayoutInflater.from(viewGroup.context),viewGroup,false)
+
+ return ViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: AlbumRVAdapter.ViewHolder, position: Int) {
+ holder.bind(albumList[position])
+ holder.itemView.setOnClickListener { myItemClickListener.onItemClick(albumList[position])}
+// holder.binding.itemAlbumTitleTv.setOnClickListener { myItemClickListener.onRemoveAlbum(position) }
+ }
+
+ override fun getItemCount(): Int=albumList.size
+ inner class ViewHolder(val binding: ItemAlbumBinding): RecyclerView.ViewHolder(binding.root){
+
+ fun bind(album:Album){
+ binding.itemAlbumTitleTv.text=album.title
+ binding.itemAlbumSingerNameTv.text=album.singer
+ binding.itemAlbumCoverImgIv.setImageResource(album.coverImg!!)
+
+ binding.itemAlbumPlayImgIv.setOnClickListener {
+ myItemClickListener.onPlayClick(album)
+ }
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/HomeFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/HomeFragment.kt
index c716999..7d01758 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/HomeFragment.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/HomeFragment.kt
@@ -1,15 +1,40 @@
package com.example.mission2
+import android.content.Context
import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.view.doOnAttach
import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager2.widget.ViewPager2
import com.example.mission2.databinding.FragmentHomeBinding
+import com.google.gson.Gson
+import me.relex.circleindicator.CircleIndicator3
+
class HomeFragment : Fragment() {
lateinit var binding: FragmentHomeBinding
+ private val albumDatas = ArrayList()
+ private val handler = Handler(Looper.getMainLooper())
+ private lateinit var sliderRunnable: Runnable
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ if (context is OnSongPlayListener) {
+ songPlayListener = context
+ } else {
+ throw RuntimeException("$context must implement OnSongPlayListener")
+ }
+ }
+
+ interface OnSongPlayListener {
+ fun onSongPlayed(title: String?, singer: String?)
+ }
+
+ private lateinit var songPlayListener: OnSongPlayListener
override fun onCreateView(
inflater: LayoutInflater,
@@ -18,26 +43,79 @@ class HomeFragment : Fragment() {
): View {
binding = FragmentHomeBinding.inflate(inflater, container, false)
- binding.homeAlbumImgIv1.setOnClickListener {
- (context as MainActivity).supportFragmentManager.beginTransaction()
- .replace(R.id.main_frm , AlbumFragment())
- .commitAllowingStateLoss()
+// binding.homeAlbumImgIv1.setOnClickListener {
+// (context as MainActivity).supportFragmentManager.beginTransaction()
+// .replace(R.id.main_frm , AlbumFragment())
+// .commitAllowingStateLoss()
+// }
+
+ albumDatas.apply {
+ add(Album("Butter", "λ°©νμλ
λ¨(BTS)", R.drawable.img_album_exp))
+ add(Album("Lilac", "μμ΄μ (IU)", R.drawable.img_album_exp2))
+ add(Album("μ΄μλΉν", "νλ‘λ‘(HANRORO)", R.drawable.img_album_exp3))
+ add(Album("μ§", "νλ‘λ‘(HANRORO)", R.drawable.img_album_exp4))
+ add(Album("μλͺ½μ΄κ΅¬ν΄λ½", "νλ‘λ‘(HANRORO)", R.drawable.img_album_exp5))
+ add(Album("μ
μΆ", "νλ‘λ‘(HANRORO)", R.drawable.img_album_exp6))
}
+ val albumRVAdapter = AlbumRVAdapter(albumDatas)
+ binding.homeTodayMusicAlbumRv.adapter = albumRVAdapter
+ binding.homeTodayMusicAlbumRv.layoutManager =
+ LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
+
+ albumRVAdapter.setMyItemClickListener(object : AlbumRVAdapter.MyItemClickListener {
+ override fun onItemClick(album: Album) {
+ changeAlbumFragment(album)
+ }
+
+ override fun onRemoveAlbum(position: Int) {
+ albumRVAdapter.removeItem(position)
+ }
+
+ override fun onPlayClick(album: Album) {
+ songPlayListener.onSongPlayed(album.title, album.singer)
+ }
+ })
- val bannerAdapter= BannerVPAdapter(this)
+
+ val bannerAdapter = BannerVPAdapter(this)
bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp))
bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp2))
- binding.homeBannerVp.adapter=bannerAdapter
- binding.homeBannerVp.orientation= ViewPager2.ORIENTATION_HORIZONTAL
+ binding.homeBannerVp.adapter = bannerAdapter
+ binding.homeBannerVp.orientation = ViewPager2.ORIENTATION_HORIZONTAL
+
- val homePannelAdapter= HomePannelVPAdapter(this)
+ val homePannelAdapter = HomePannelVPAdapter(this)
homePannelAdapter.addFragment(HomePannelFragment(R.drawable.img_first_album_default))
homePannelAdapter.addFragment(HomePannelFragment(R.drawable.img_second_album))
- homePannelAdapter.addFragment(HomePannelFragment(R.drawable.img_third_album))
- binding.homePannelBackgroundVp.adapter=homePannelAdapter
- binding.homePannelBackgroundVp.orientation=ViewPager2.ORIENTATION_HORIZONTAL
+ binding.homePannelBackgroundVp.adapter = homePannelAdapter
+ binding.homePannelBackgroundVp.orientation = ViewPager2.ORIENTATION_HORIZONTAL
+ binding.homePannelCi.setViewPager(binding.homePannelBackgroundVp)
+
+ startAutoSlider(homePannelAdapter.itemCount)
return binding.root
}
-}
\ No newline at end of file
+ private fun changeAlbumFragment(album: Album) {
+ (context as MainActivity).supportFragmentManager.beginTransaction()
+ .replace(R.id.main_frm, AlbumFragment().apply {
+ arguments = Bundle().apply {
+ val gson = Gson()
+ val albumJson = gson.toJson(album)
+ putString("album", albumJson)
+ }
+ })
+ .commitAllowingStateLoss()
+ }
+
+ private fun startAutoSlider(size: Int) {
+ sliderRunnable = Runnable {
+ val viewPager = binding.homePannelBackgroundVp
+ viewPager.currentItem = (viewPager.currentItem + 1) % size
+ handler.postDelayed(sliderRunnable, 3000)
+ }
+ handler.postDelayed(sliderRunnable, 3000)
+ }
+
+}
+
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/Included.kt b/bongbak/week2/app/src/main/java/com/example/mission2/Included.kt
new file mode 100644
index 0000000..3373434
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/Included.kt
@@ -0,0 +1,6 @@
+package com.example.mission2
+
+data class Included(
+ var title:String?="",
+ var singer:String?=""
+)
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/LockerFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/LockerFragment.kt
index 2a60cc8..9558460 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/LockerFragment.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/LockerFragment.kt
@@ -8,11 +8,11 @@ import androidx.fragment.app.Fragment
import com.example.mission2.databinding.FragmentLockerBinding
import com.google.android.material.tabs.TabLayoutMediator
-class LockerFragment : Fragment(){
-
- private val information=arrayListOf("μ μ₯ν 곑","μμ
νμΌ","μ μ₯μ¨λ²")
+class LockerFragment : Fragment() {
lateinit var binding: FragmentLockerBinding
+ lateinit var songDB: SongDatabase
+ private val information = arrayListOf("μ μ₯ν 곑", "μμ
νμΌ", "μ μ₯μ¨λ²")
override fun onCreateView(
inflater: LayoutInflater,
@@ -21,20 +21,15 @@ class LockerFragment : Fragment(){
): View? {
binding = FragmentLockerBinding.inflate(inflater, container, false)
- binding.lockerPlayAllImgIv.setOnClickListener {
- (context as MainActivity).supportFragmentManager.beginTransaction().replace(
- R.id.main_frm,
- HomeFragment()
- ).commitAllowingStateLoss()
- }
val lockerAdapter = LockerVPAdapter(this)
- binding.vpLockerLockerFragment.adapter=lockerAdapter
+ binding.vpLockerLockerFragment.adapter = lockerAdapter
- TabLayoutMediator(binding.lockerContentTb, binding.vpLockerLockerFragment) { tab, position ->
+ TabLayoutMediator(
+ binding.lockerContentTb,
+ binding.vpLockerLockerFragment
+ ) { tab, position ->
tab.text = information[position]
-
}.attach()
-
return binding.root
}
}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/LockerRVAapter.kt b/bongbak/week2/app/src/main/java/com/example/mission2/LockerRVAapter.kt
new file mode 100644
index 0000000..ad40590
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/LockerRVAapter.kt
@@ -0,0 +1,61 @@
+package com.example.flo
+
+import android.annotation.SuppressLint
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.mission2.Song
+import com.example.mission2.databinding.ItemSavedBinding
+
+
+class LockerRVAapter() :
+ RecyclerView.Adapter() {
+ private val songs = ArrayList()
+ interface MyItemClickListener{
+ fun onRemoveSong(songId: Int)
+ }
+ private lateinit var mItemClickListener : MyItemClickListener
+
+ fun setMyItemClickListener(itemClickListener: MyItemClickListener){
+ mItemClickListener = itemClickListener
+ }
+
+
+ override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): LockerRVAapter.ViewHolder {
+ val binding: ItemSavedBinding = ItemSavedBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
+
+ return ViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: LockerRVAapter.ViewHolder, position: Int) {
+ holder.bind(songs[position])
+ holder.binding.itemSavedMore01Iv.setOnClickListener {
+ mItemClickListener.onRemoveSong(songs[position].id)
+ removeSong(position)
+ }
+ }
+
+ override fun getItemCount(): Int = songs.size
+
+ @SuppressLint("NotifyDataSetChanged")
+ fun addSongs(songs: ArrayList) {
+ this.songs.clear()
+ this.songs.addAll(songs)
+
+ notifyDataSetChanged()
+ }
+
+ @SuppressLint("NotifyDataSetChanged")
+ private fun removeSong(position: Int){
+ songs.removeAt(position)
+ notifyDataSetChanged()
+ }
+
+ inner class ViewHolder(val binding: ItemSavedBinding) : RecyclerView.ViewHolder(binding.root){
+ fun bind(song: Song){
+ binding.itemSavedCoverIv.setImageResource(song.coverImg!!)
+ binding.itemSavedMusicTitle01Tv.text = song.title
+ binding.itemSavedSingerName01Tv.text = song.singer
+ }
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/LockerVPAdapter.kt b/bongbak/week2/app/src/main/java/com/example/mission2/LockerVPAdapter.kt
index 940e106..8623541 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/LockerVPAdapter.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/LockerVPAdapter.kt
@@ -3,17 +3,16 @@ package com.example.mission2
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
-import java.util.ArrayList;
class LockerVPAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
- private val fragmentlist:ArrayList = ArrayList();
- override fun getItemCount(): Int = fragmentlist.size
+ override fun getItemCount(): Int = 3
- override fun createFragment(position: Int): Fragment = fragmentlist[position]
-
- fun addFragment(fragment: Fragment){
- fragmentlist.add(fragment)
- notifyItemInserted(fragmentlist.size-1)
+ override fun createFragment(position: Int): Fragment {
+ return when (position) {
+ 0 -> SavedFragment()
+ 1 -> Fragment()
+ else -> SalbumFragment()
+ }
}
}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/MainActivity.kt b/bongbak/week2/app/src/main/java/com/example/mission2/MainActivity.kt
index dd613a1..cb9efe5 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/MainActivity.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/MainActivity.kt
@@ -3,33 +3,79 @@ package com.example.mission2
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import android.util.Log
+import android.widget.Toast
import com.example.mission2.databinding.ActivityMainBinding
-class MainActivity : AppCompatActivity() {
+import com.google.gson.Gson
+
+class MainActivity : AppCompatActivity(),HomeFragment.OnSongPlayListener {
lateinit var binding: ActivityMainBinding
+ private var song:Song = Song()
+ private var gson:Gson= Gson()
+
+ val songs=arrayListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
+ inputDummySongs()
initBottomNavigation()
- val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString())
-
binding.mainPlayerCl.setOnClickListener {
- val intent = Intent(this, SongActivity::class.java)
- }
+ val editor=getSharedPreferences("song",MODE_PRIVATE).edit()
+ editor.putInt("songId",song.id)
+ editor.apply()
- binding.mainPlayerCl.setOnClickListener {
- val intent = Intent(this,SongActivity::class.java)
- intent.putExtra("title", song.title)
- intent.putExtra("singer",song.singer)
+ val intent=Intent(this, SongActivity::class.java)
startActivity(intent)
+
+ }
+ binding.mainNextIv.setOnClickListener {
+ moveSong(+1)
+ }
+
+ binding.mainPreviousIv.setOnClickListener {
+ moveSong(-1)
}
}
+ override fun onSongPlayed(title: String?, singer: String?){
+ binding.mainMiniplayerTitleTv.text = title
+ binding.mainMiniplayerSingerTv.text = singer
+ binding.mainMiniplayerTitleTv.text = title
+ binding.mainMiniplayerSingerTv.text = singer
+ }
+ private fun moveSong(direct: Int) {
+ val spf = getSharedPreferences("song", MODE_PRIVATE)
+ val songId = spf.getInt("songId", 0)
+
+ val nowPos = getPlayingSongPosition(songId)
+ val nextPos = nowPos + direct
+
+ val newSong = songs[nextPos]
+
+ val editor = spf.edit()
+ editor.putInt("songId", newSong.id)
+ editor.apply()
+
+ setMiniPlayer(newSong)
+
+ this.song = newSong
+ }
+
+
+ private fun getPlayingSongPosition(songId:Int): Int{
+ for(i in 0 until songs.size){
+ if(songs[i].id==songId){
+ return i
+ }
+ }
+ return 0
+ }
private fun initBottomNavigation(){
supportFragmentManager.beginTransaction()
@@ -68,5 +114,122 @@ class MainActivity : AppCompatActivity() {
false
}
}
+ private fun setMiniPlayer(song: Song){
+ binding.mainMiniplayerTitleTv.text=song.title
+ binding.mainMiniplayerSingerTv.text=song.singer
+ binding.mainMiniplayerProgressSb.progress=(song.second*100000)/song.playTime
+ }
+
+ override fun onStart() {
+ super.onStart()
+
+ val spf=getSharedPreferences("song",MODE_PRIVATE)
+ val songId=spf.getInt("songId",0)
+
+ val songDB=SongDatabase.getInstance(this)!!
+
+ song=if(songId==0) {
+ songDB.songDao().getSong(1)
+ }
+ else{
+ songDB.songDao().getSong(songId)
+ }
+ Log.d("song ID",song.id.toString()) // λ°μ΄ν° λ λλ§
+
+ setMiniPlayer(song)
+ }
+
+ private fun inputDummySongs(){
+ val songDB = SongDatabase.getInstance(this)!!
+ val allSongs = songDB.songDao().getSongs()
+
+ if (allSongs.isNotEmpty()) {
+ songs.clear()
+ songs.addAll(allSongs)
+ return
+ }
+ songDB.songDao().insert(
+ Song(
+ "Lilac",
+ "μμ΄μ (IU)",
+ 0,
+ 200,
+ false,
+ "music_lilac",
+ R.drawable.img_album_exp2,
+ false,
+ )
+ )
+
+ songDB.songDao().insert(
+ Song(
+ "Flu",
+ "μμ΄μ (IU)",
+ 0,
+ 200,
+ false,
+ "music_flu",
+ R.drawable.img_album_exp2,
+ false,
+ )
+ )
+
+ songDB.songDao().insert(
+ Song(
+ "Boy with Luv",
+ "λ°©νμλ
λ¨ (BTS)",
+ 0,
+ 230,
+ false,
+ "music_boy",
+ R.drawable.img_album_exp4,
+ false
+ )
+ )
+
+ songDB.songDao().insert(
+ Song(
+ "Next Level",
+ "μμ€ν (AESPA)",
+ 0,
+ 210,
+ false,
+ "music_next",
+ R.drawable.img_album_exp3,
+ false,
+ )
+ )
+
+
+ songDB.songDao().insert(
+ Song(
+ "Boy with Luv",
+ "music_boy",
+ 0,
+ 230,
+ false,
+ "music_lilac",
+ R.drawable.img_album_exp4,
+ false,
+ )
+ )
+
+
+ songDB.songDao().insert(
+ Song(
+ "BBoom BBoom",
+ "λͺ¨λͺ¨λλ (MOMOLAND)",
+ 0,
+ 240,
+ false,
+ "music_bboom",
+ R.drawable.img_album_exp5,
+ false,
+ )
+ )
+
+ val _songs = songDB.songDao().getSongs()
+ Log.d("DB data", _songs.toString())
+ }
}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/Salbum.kt b/bongbak/week2/app/src/main/java/com/example/mission2/Salbum.kt
new file mode 100644
index 0000000..3ac5011
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/Salbum.kt
@@ -0,0 +1,8 @@
+package com.example.mission2
+
+data class Salbum(
+ var title:String?="",
+ var info:String?="",
+ var coverImg:Int?=null,
+ var isPlaying: Boolean = false
+)
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SalbumFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SalbumFragment.kt
new file mode 100644
index 0000000..c7117af
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SalbumFragment.kt
@@ -0,0 +1,54 @@
+package com.example.mission2
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.example.mission2.databinding.FragmentSalbumBinding
+
+class SalbumFragment: Fragment() {
+ lateinit var binding: FragmentSalbumBinding
+ private val salbumDatas = ArrayList()
+ private lateinit var salbumRVAdapter: SalbumRVAdapter
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentSalbumBinding.inflate(inflater, container, false)
+
+ setupRecyclerView()
+
+ return binding.root
+ }
+
+ private fun setupRecyclerView() {
+ salbumDatas.apply {
+ add(Salbum("Butter", "λ°©νμλ
λ¨(BTS)", R.drawable.img_album_exp))
+ add(Salbum("LILAC", "μμ΄μ (IU)", R.drawable.img_album_exp2))
+ add(Salbum("Butter(instrumental)", "νλ‘λ‘", R.drawable.img_album_exp3))
+ add(Salbum("Permission to Dance(instrumental)", "νλ‘λ‘", R.drawable.img_album_exp4))
+ }
+
+ salbumRVAdapter = SalbumRVAdapter(salbumDatas)
+ binding.lockerSalbumRv.adapter = salbumRVAdapter
+ binding.lockerSalbumRv.layoutManager = LinearLayoutManager(context)
+
+ salbumRVAdapter.onItemPlayClick = { position ->
+ salbumDatas[position].isPlaying = true
+ salbumRVAdapter.notifyItemChanged(position)
+ }
+
+ salbumRVAdapter.onItemPauseClick = { position ->
+ salbumDatas[position].isPlaying = false
+ salbumRVAdapter.notifyItemChanged(position)
+ }
+
+ salbumRVAdapter.onRemoveClick = { position ->
+ salbumRVAdapter.removeItem(position)
+ }
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SalbumRVAdapter.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SalbumRVAdapter.kt
new file mode 100644
index 0000000..aa8122c
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SalbumRVAdapter.kt
@@ -0,0 +1,61 @@
+package com.example.mission2
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.mission2.databinding.ItemSalbumBinding
+
+class SalbumRVAdapter(private val salbumList: ArrayList): RecyclerView.Adapter() {
+
+ var onRemoveClick: ((Int) -> Unit)? = null
+ var onItemPlayClick: ((Int) -> Unit)? = null
+ var onItemPauseClick: ((Int) -> Unit)? = null
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val binding: ItemSalbumBinding=
+ ItemSalbumBinding.inflate(LayoutInflater.from(parent.context),parent,false)
+ return ViewHolder(binding)
+ }
+
+ override fun getItemCount(): Int = salbumList.size
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.bind(salbumList[position])
+ }
+
+ fun removeItem(position:Int){
+ salbumList.removeAt(position)
+ notifyItemRemoved(position)
+ notifyItemRangeChanged(position, salbumList.size)
+ }
+
+ inner class ViewHolder(val binding: ItemSalbumBinding) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(salbum: Salbum) {
+ binding.itemSalbumTitleTv.text = salbum.title
+ binding.itemSalbumInfoTv.text = salbum.info
+ binding.itemSalbumCoverIv.setImageResource(salbum.coverImg!!)
+
+ if (salbum.isPlaying) {
+ binding.itemSalbumPlayIv.visibility = View.GONE
+ binding.itemSalbumPauseIv.visibility = View.VISIBLE
+ } else {
+ binding.itemSalbumPlayIv.visibility = View.VISIBLE
+ binding.itemSalbumPauseIv.visibility = View.GONE
+ }
+
+ binding.itemSalbumPlayIv.setOnClickListener {
+ onItemPlayClick?.invoke(adapterPosition)
+ }
+
+ binding.itemSalbumPauseIv.setOnClickListener {
+ onItemPauseClick?.invoke(adapterPosition)
+ }
+
+ binding.itemSalbumMoreIv.setOnClickListener {
+ onRemoveClick?.invoke(adapterPosition)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/Saved.kt b/bongbak/week2/app/src/main/java/com/example/mission2/Saved.kt
new file mode 100644
index 0000000..2c729fc
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/Saved.kt
@@ -0,0 +1,7 @@
+package com.example.mission2
+
+data class Saved(
+ var title:String?="",
+ var singer:String?="",
+ var coverImg : Int? =null,
+)
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SavedFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SavedFragment.kt
new file mode 100644
index 0000000..d66cb8e
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SavedFragment.kt
@@ -0,0 +1,51 @@
+package com.example.mission2
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.example.flo.LockerRVAapter // (μ΄μ νμΌμ LockerRVAapterλ₯Ό μ¬μ©νλ€κ³ κ°μ )
+import com.example.mission2.databinding.FragmentSavedBinding
+
+class SavedFragment : Fragment() {
+
+ lateinit var binding: FragmentSavedBinding
+
+ lateinit var songDB: SongDatabase
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentSavedBinding.inflate(inflater, container, false) // λ°μΈλ© ν΄λμ€ λ³κ²½
+
+ songDB = SongDatabase.getInstance(requireContext())!!
+
+ return binding.root
+ }
+
+ override fun onStart() {
+ super.onStart()
+ initRecyclerview()
+ }
+
+ private fun initRecyclerview(){
+ binding.lockerSavedRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
+
+ val lockerRVAapter = LockerRVAapter()
+
+ lockerRVAapter.setMyItemClickListener(object : LockerRVAapter.MyItemClickListener{
+ override fun onRemoveSong(songId: Int) {
+ songDB.songDao().updateIsLikeById(false,songId)
+ }
+ })
+
+ binding.lockerSavedRv.adapter = lockerRVAapter
+ lockerRVAapter.addSongs(songDB.songDao().getLikedSongs(true) as ArrayList)
+ }
+
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/Song.kt b/bongbak/week2/app/src/main/java/com/example/mission2/Song.kt
index f1b44b1..229e034 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/Song.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/Song.kt
@@ -1,6 +1,21 @@
package com.example.mission2
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+
+@Entity(tableName = "SongTable")
data class Song(
var title: String = "",
var singer: String = "",
-)
\ No newline at end of file
+ var second: Int=0,
+ val playTime:Int=0,
+ var isPlaying: Boolean=false,
+ var music: String="",
+ var coverImg:Int?=null,
+ var isLike:Boolean=false
+
+ // μ΄λ€ μμ
μ΄ μ¬μλκ³ μμλμ§λ₯Ό νμΈ
+){
+ @PrimaryKey(autoGenerate=true)var id:Int=0
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SongActivity.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SongActivity.kt
index 0676579..4cccd65 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/SongActivity.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SongActivity.kt
@@ -1,78 +1,257 @@
package com.example.mission2
+import android.media.MediaPlayer
import android.os.Bundle
+import android.util.Log
import android.view.View
+import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.mission2.databinding.ActivitySongBinding
+import com.google.gson.Gson
class SongActivity : AppCompatActivity() {
- lateinit var binding : ActivitySongBinding
+ lateinit var binding: ActivitySongBinding
+
+ //week5. song data μ΄κΈ°ν ν¨μ μμ±
+ lateinit var timer: Timer
+ private var mediaPlayer: MediaPlayer? = null
+ private var gson: Gson=Gson()
+
+ val songs=arrayListOf()
+ lateinit var songDB:SongDatabase
+ var nowPos=0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- binding= ActivitySongBinding.inflate(layoutInflater)
+ binding = ActivitySongBinding.inflate(layoutInflater)
setContentView(binding.root)
- binding.songDownIb.setOnClickListener{
+
+ // week5. Song λ°μ΄ν° μ΄κΈ°ν λ° UI μ€μ
+
+ initPlayList()
+ initSong()
+ initClickListener()
+
+ }
+
+ // week5. Song κ°μ²΄λ₯Ό μ΄κΈ°ννλ ν¨μ
+
+ private fun initClickListener(){
+ binding.songDownIb.setOnClickListener {
finish()
}
- binding.songMiniplayerIv.setOnClickListener{
- setPlayerStatus(false)
- }
- binding.songPauseIv.setOnClickListener{
+
+ binding.songMiniplayerIv.setOnClickListener {
setPlayerStatus(true)
}
- binding.songRepeatIv.setOnClickListener {
- setRepeatStatus(false)
- }
- binding.songSelectRepeatIv.setOnClickListener{
- setRepeatStatus(true)
+
+ binding.songPauseIv.setOnClickListener {
+ setPlayerStatus(false)
}
- binding.songRandomIv.setOnClickListener{
- setRandomStatus(false)
+
+ binding.songNextIv.setOnClickListener {
+ moveSong(+1)
}
- binding.songSelectRandomIv.setOnClickListener{
- setRandomStatus(true)
+
+ binding.songPreviousIv.setOnClickListener {
+ moveSong(-1)
}
- if (intent.hasExtra("title")&&intent.hasExtra("singer")){
- binding.songMusicTitleTv.text=intent.getStringExtra("title")
- binding.songSingerNameTv.text=intent.getStringExtra("singer")
+ binding.songLikeIv.setOnClickListener{
+ setLike(songs[nowPos].isLike)
}
+ }
+ private fun initSong() {
+ val spf=getSharedPreferences("song",MODE_PRIVATE)
+ val songId=spf.getInt("songId",0)
+ nowPos=getPlayingSongPosition(songId)
+
+ Log.d("now Song Id", songs[nowPos].id.toString())
+ startTimer()
+ setPlayer(songs[nowPos])
}
- fun setPlayerStatus(isPlaying : Boolean){
- if(isPlaying){
- binding.songMiniplayerIv.visibility= View.VISIBLE
- binding.songPauseIv.visibility=View.GONE
+
+ private fun setLike(isLike: Boolean){
+ songs[nowPos].isLike=!isLike
+ songDB.songDao().updateIsLikeById(!isLike,songs[nowPos].id)
+
+ if(!isLike){
+ binding.songLikeIv.setImageResource(R.drawable.ic_my_like_on)
}
else{
- binding.songMiniplayerIv.visibility= View.GONE
- binding.songPauseIv.visibility=View.VISIBLE
+ binding.songLikeIv.setImageResource(R.drawable.ic_my_like_off)
}
}
- fun setRepeatStatus(isRepeat: Boolean){
- if(isRepeat){
- binding.songRepeatIv.visibility=View.VISIBLE
- binding.songSelectRepeatIv.visibility=View.GONE
+
+ private fun moveSong(direct: Int){
+ if(nowPos+direct<0){
+ Toast.makeText(this,"first song",Toast.LENGTH_SHORT).show()
+ return
}
- else{
- binding.songRepeatIv.visibility=View.GONE
- binding.songSelectRepeatIv.visibility=View.VISIBLE
+ if(nowPos+direct>=songs.size){
+ Toast.makeText(this,"Last song", Toast.LENGTH_SHORT).show()
+ return
+ }
+ nowPos+=direct
+ timer.interrupt()
+ startTimer()
+
+ mediaPlayer?.release()
+ mediaPlayer=null
+
+ setPlayer(songs[nowPos])
+
+ }
+
+ private fun getPlayingSongPosition(songId:Int): Int{
+ for(i in 0 until songs.size){
+ if(songs[i].id==songId){
+ return i
+ }
}
+ return 0
}
- fun setRandomStatus(isRandom: Boolean){
- if(isRandom){
- binding.songRandomIv.visibility=View.VISIBLE
- binding.songSelectRandomIv.visibility=View.GONE
+
+ //week5. UIμ λ
Έλ μ 보λ₯Ό λ°μνλ ν¨μ
+ private fun setPlayer(song: Song) {
+ binding.songMusicTitleTv.text = song.title
+ binding.songSingerNameTv.text = song.singer
+ binding.songStartTimeTv.text =
+ String.format("%02d:%02d", song.second / 60, song.second % 60)
+
+ binding.songEndTimeTv.text = String.format(
+ "%02d:%02d",
+ song.playTime / 60,
+ song.playTime % 60
+ )
+ binding.songAlbumIv.setImageResource(song.coverImg!!)
+ binding.songProgressSb.progress = (song.second*100*1000/song.playTime)
+ Log.d("song","second=${song.second}")
+
+ val music=resources.getIdentifier(song.music,"raw",this.packageName)
+
+ if (song.isLike){
+ binding.songLikeIv.setImageResource(R.drawable.ic_my_like_on)
}
else{
- binding.songRandomIv.visibility=View.GONE
- binding.songSelectRandomIv.visibility=View.VISIBLE
+ binding.songLikeIv.setImageResource(R.drawable.ic_my_like_off)
+ }
+
+ setPlayerStatus(song.isPlaying)
+ }
+
+ private fun setPlayerStatus(isPlaying: Boolean) {
+ songs[nowPos].isPlaying = isPlaying
+ timer.isPlaying = isPlaying
+ if (isPlaying) {
+ binding.songMiniplayerIv.visibility = View.GONE
+ binding.songPauseIv.visibility = View.VISIBLE
+ mediaPlayer?.start()
+ } else {
+ binding.songMiniplayerIv.visibility = View.VISIBLE
+ binding.songPauseIv.visibility = View.GONE
+ if (mediaPlayer?.isPlaying == true) { // μμ
μ΄ μ¬μ μ€μΌλλ§ pauseλ₯Ό ν΄μΌν¨.
+ mediaPlayer?.pause()
+ }
}
}
+ private fun startTimer() {
+ timer = Timer(songs[nowPos].playTime, songs[nowPos].isPlaying)
+ timer.start()
+ }
+
+ // λ°μΈλ© λ³μλ₯Ό μ΄μ©ν΄μΌν΄μ inner class λ‘ μμ±
+ inner class Timer(private val playTime: Int, var isPlaying: Boolean = true) : Thread() {
+ private var second: Int = 0
+ private var mills: Float = songs[nowPos].second*1000F
+ override fun run() {
+ super.run()
+ try {
+
+
+ while (true) {
+
+ if (second >= playTime) {
+ break
+ }
+
+ if (isPlaying) {
+ sleep(50)
+ mills += 50
+
+ runOnUiThread {
+ binding.songProgressSb.progress = ((mills / playTime) * 100).toInt()
+ // seekbar ꡬν
+ }
+ if (mills % 1000 == 0f) {
+ runOnUiThread {
+ binding.songStartTimeTv.text =
+ String.format("%02d:%02d", songs[nowPos].second / 60, songs[nowPos].second % 60)
+ }
+ songs[nowPos].second++
+ }
+ }
+ }
+ } catch (e: InterruptedException) {
+ Log.d("Song", "μ°λ λκ° μ’
λ£λμμ΅λλ€.")
+ }
+ }
+ }
+
+ // μ¬μ©μκ° ν¬μ»€μ€λ₯Ό μμμ λ μμ
μ΄ μ€μ§
+ override fun onPause() {
+ super.onPause()
+ setPlayerStatus(false)
+ songs[nowPos].second=((binding.songProgressSb.progress*songs[nowPos].playTime)/100)/1000
+ songs[nowPos].isPlaying = false
+ setPlayerStatus(false)
+
+ val sharedPreferences = getSharedPreferences("song", MODE_PRIVATE)
+ val editor = sharedPreferences.edit() // μλν°
+
+ editor.putInt("songId",songs[nowPos].id)
+
+ editor.apply()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy() // μ°λ λ μ’
λ£
+ timer.interrupt()
+ mediaPlayer?.release() // λ―Έλμ΄νλ μ΄μ΄κ° κ°κ³ μλ 리μμ€ ν΄μ
+ mediaPlayer=null //λ―Έλμ΄ νλ μ΄μ΄ ν΄μ
+ }
+
+ private fun initPlayList(){
+ songDB= SongDatabase.getInstance(this)!!
+ songs.addAll(songDB.songDao().getSongs())
+ }
+
+
+ /*
+ private fun setRepeatStatus(isRepeat: Boolean) {
+ if (isRepeat) {
+ binding.songRepeatIv.visibility = View.GONE
+ binding.songSelectRepeatIv.visibility = View.VISIBLE
+ } else {
+ binding.songRepeatIv.visibility = View.VISIBLE
+ binding.songSelectRepeatIv.visibility = View.GONE
+ }
+ }
+
+ private fun setRandomStatus(isRandom: Boolean) {
+ if (isRandom) {
+ binding.songRandomIv.visibility = View.GONE
+ binding.songSelectRandomIv.visibility = View.VISIBLE
+ } else {
+ binding.songRandomIv.visibility = View.VISIBLE
+ binding.songSelectRandomIv.visibility = View.GONE
+ }
+ }
+ */
}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SongDao.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SongDao.kt
new file mode 100644
index 0000000..1d7bbb7
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SongDao.kt
@@ -0,0 +1,28 @@
+package com.example.mission2
+
+import androidx.room.*
+
+@Dao
+interface SongDao {
+
+ @Insert
+ fun insert(song:Song)
+
+ @Update
+ fun update(song:Song)
+
+ @Delete
+ fun delete(song:Song)
+
+ @Query("SELECT * FROM SongTable")
+ fun getSongs(): List
+
+ @Query("SELECT * FROM SongTable WHERE id = :id")
+ fun getSong(id: Int): Song
+
+ @Query("UPDATE SongTable SET isLike=:isLike WHERE id = :id")
+ fun updateIsLikeById(isLike:Boolean,id:Int)
+
+ @Query("SELECT*FROM SongTable WHERE isLike=:isLike")
+ fun getLikedSongs(isLike:Boolean):List
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SongDatabase.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SongDatabase.kt
new file mode 100644
index 0000000..da9cca6
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SongDatabase.kt
@@ -0,0 +1,31 @@
+package com.example.mission2
+
+import android.content.Context
+import androidx.room.Database
+import androidx.room.Room
+import androidx.room.RoomDatabase
+
+@Database(entities=[Song::class],version=1)
+abstract class SongDatabase :RoomDatabase(){
+ abstract fun songDao(): SongDao
+
+ companion object{
+ private var instance:SongDatabase?=null
+
+ @Synchronized
+ fun getInstance(context: Context):SongDatabase?{
+ if(instance==null){
+ synchronized(SongDatabase::class){
+ instance= Room.databaseBuilder(
+ context.applicationContext,
+ SongDatabase::class.java,
+ "song-database" // λ€λ₯Έ λ°μ΄ν° λ² μ΄μ€λ μ΄λ¦ κ²ΉμΉλ©΄ κΌ¬μ
+ ).allowMainThreadQueries().build()
+ }
+ }
+ return instance
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SongFragment.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SongFragment.kt
index 09e24e5..e269836 100644
--- a/bongbak/week2/app/src/main/java/com/example/mission2/SongFragment.kt
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SongFragment.kt
@@ -5,19 +5,33 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
import com.example.mission2.databinding.FragmentSongBinding
class SongFragment : Fragment() {
+
+
+
lateinit var binding: FragmentSongBinding
+ private val includedDatas=ArrayList()
+
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentSongBinding.inflate(inflater, container, false)
-
+ includedDatas.apply{
+ add(Included("Butter","λ°©νμλ
λ¨(BTS)"))
+ add(Included("Permission to Dance","λ°©νμλ
λ¨(BTS)"))
+ add(Included("Butter(instrumental)","λ°©νμλ
λ¨(BTS)"))
+ add(Included("Permission to Dance(instrumental)","λ°©νμλ
λ¨(BTS)"))
+ }
+ val songRVAdapter = SongRVAdapter(includedDatas)
+ binding.albumAlbumContentRv.adapter = songRVAdapter
+ binding.albumAlbumContentRv.layoutManager = LinearLayoutManager(context)
binding.songMixoffTg.setOnClickListener {
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SongRVAdapter.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SongRVAdapter.kt
new file mode 100644
index 0000000..d8494db
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SongRVAdapter.kt
@@ -0,0 +1,36 @@
+package com.example.mission2
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.mission2.databinding.ItemSongBinding
+
+class SongRVAdapter(private val includedList:ArrayList): RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ViewHolder {
+
+ val binding: ItemSongBinding =
+ ItemSongBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+
+ return ViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: SongRVAdapter.ViewHolder, position: Int) {
+
+ holder.bind(includedList[position])
+ }
+
+ override fun getItemCount(): Int=includedList.size
+
+ inner class ViewHolder(val binding: ItemSongBinding) : RecyclerView.ViewHolder(binding.root) {
+ fun bind(included: Included) {
+ val orderText=String.format("%02d",adapterPosition+1)
+ binding.itemSongListOrder01Tv.text=orderText
+ binding.itemSongMusicTitle01Tv.text = included.title
+ binding.itemSongSingerName01Tv.text = included.singer
+ }
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/java/com/example/mission2/SplashActivity.kt b/bongbak/week2/app/src/main/java/com/example/mission2/SplashActivity.kt
new file mode 100644
index 0000000..64ccc9c
--- /dev/null
+++ b/bongbak/week2/app/src/main/java/com/example/mission2/SplashActivity.kt
@@ -0,0 +1,26 @@
+package com.example.mission2
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.os.postDelayed
+import com.example.mission2.databinding.ActivitySplashBinding
+
+class SplashActivity: AppCompatActivity() {
+ lateinit var binding: ActivitySplashBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = ActivitySplashBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ val handler = Handler(Looper.getMainLooper())
+ handler.postDelayed({
+ val intent = Intent(this@SplashActivity, MainActivity::class.java)
+ startActivity(intent)
+ finish()
+ }, 1000)
+ }
+}
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/drawable/ic_flo_logo.png b/bongbak/week2/app/src/main/res/drawable/ic_flo_logo.png
new file mode 100644
index 0000000..643224d
Binary files /dev/null and b/bongbak/week2/app/src/main/res/drawable/ic_flo_logo.png differ
diff --git a/bongbak/week2/app/src/main/res/drawable/img_album_exp3.png b/bongbak/week2/app/src/main/res/drawable/img_album_exp3.png
new file mode 100644
index 0000000..46fe4d1
Binary files /dev/null and b/bongbak/week2/app/src/main/res/drawable/img_album_exp3.png differ
diff --git a/bongbak/week2/app/src/main/res/drawable/img_album_exp4.png b/bongbak/week2/app/src/main/res/drawable/img_album_exp4.png
new file mode 100644
index 0000000..1cbc6c8
Binary files /dev/null and b/bongbak/week2/app/src/main/res/drawable/img_album_exp4.png differ
diff --git a/bongbak/week2/app/src/main/res/drawable/img_album_exp5.png b/bongbak/week2/app/src/main/res/drawable/img_album_exp5.png
new file mode 100644
index 0000000..d8e8bd8
Binary files /dev/null and b/bongbak/week2/app/src/main/res/drawable/img_album_exp5.png differ
diff --git a/bongbak/week2/app/src/main/res/drawable/img_album_exp6.png b/bongbak/week2/app/src/main/res/drawable/img_album_exp6.png
new file mode 100644
index 0000000..0ba3084
Binary files /dev/null and b/bongbak/week2/app/src/main/res/drawable/img_album_exp6.png differ
diff --git a/bongbak/week2/app/src/main/res/drawable/indicator_dot_selected.xml b/bongbak/week2/app/src/main/res/drawable/indicator_dot_selected.xml
new file mode 100644
index 0000000..c1779e8
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/drawable/indicator_dot_selected.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/drawable/indicator_dot_unselected.xml b/bongbak/week2/app/src/main/res/drawable/indicator_dot_unselected.xml
new file mode 100644
index 0000000..e4ccccc
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/drawable/indicator_dot_unselected.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/drawable/splash.xml b/bongbak/week2/app/src/main/res/drawable/splash.xml
new file mode 100644
index 0000000..da83aa4
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/drawable/splash.xml
@@ -0,0 +1,7 @@
+
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/activity_main.xml b/bongbak/week2/app/src/main/res/layout/activity_main.xml
index ea4cb30..44f8398 100644
--- a/bongbak/week2/app/src/main/res/layout/activity_main.xml
+++ b/bongbak/week2/app/src/main/res/layout/activity_main.xml
@@ -76,6 +76,7 @@
app:layout_constraintTop_toTopOf="parent">
@@ -95,6 +96,7 @@
diff --git a/bongbak/week2/app/src/main/res/layout/activity_song.xml b/bongbak/week2/app/src/main/res/layout/activity_song.xml
index 209615d..69964f4 100644
--- a/bongbak/week2/app/src/main/res/layout/activity_song.xml
+++ b/bongbak/week2/app/src/main/res/layout/activity_song.xml
@@ -150,45 +150,64 @@
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@+id/song_like_iv_layout"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+ android:text="00:00"
+ android:textColor="@color/select_color"
+ app:layout_constraintStart_toStartOf="@+id/song_progress_sb"
+ app:layout_constraintTop_toBottomOf="@+id/song_progress_sb"/>
+ android:textColor="@color/gray_color"
+ app:layout_constraintEnd_toEndOf="@+id/song_progress_sb"
+ app:layout_constraintTop_toBottomOf="@+id/song_progress_sb" />
+ app:layout_constraintTop_toBottomOf="@+id/song_progress_sb">
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/fragment_home.xml b/bongbak/week2/app/src/main/res/layout/fragment_home.xml
index 7f7dbf9..2f4f8d9 100644
--- a/bongbak/week2/app/src/main/res/layout/fragment_home.xml
+++ b/bongbak/week2/app/src/main/res/layout/fragment_home.xml
@@ -14,13 +14,26 @@
android:id="@+id/home_pannel_background_vp"
android:layout_width="match_parent"
android:layout_height="430dp"
- android:scaleType="centerCrop"
- android:src="@drawable/img_first_album_default"
+ android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
+
+
+ app:layout_constraintTop_toBottomOf="@id/home_pannel_ci" />
+ app:layout_constraintTop_toBottomOf="@id/home_pannel_ci" />
+ app:layout_constraintTop_toBottomOf="@id/home_pannel_ci" />
+ app:layout_constraintTop_toBottomOf="@id/home_pannel_ci" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@id/home_today_music_total_tv"/>
+
+
+ app:layout_constraintTop_toBottomOf="@id/home_banner_ci" />
-
-
+ app:layout_constraintTop_toBottomOf="@id/home_video_music_hs" />
+ android:layout_height="match_parent"
+ xmlns:tools="http://schemas.android.com/tools">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintEnd_toEndOf="parent" />
-
+ app:layout_constraintTop_toBottomOf="@id/locker_content_tb" />
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/fragment_locker_savedsong.xml b/bongbak/week2/app/src/main/res/layout/fragment_locker_savedsong.xml
new file mode 100644
index 0000000..cc9cb1c
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/fragment_locker_savedsong.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/fragment_salbum.xml b/bongbak/week2/app/src/main/res/layout/fragment_salbum.xml
new file mode 100644
index 0000000..d176998
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/fragment_salbum.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/fragment_saved.xml b/bongbak/week2/app/src/main/res/layout/fragment_saved.xml
new file mode 100644
index 0000000..de84053
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/fragment_saved.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/fragment_song.xml b/bongbak/week2/app/src/main/res/layout/fragment_song.xml
index ac83fdf..be51648 100644
--- a/bongbak/week2/app/src/main/res/layout/fragment_song.xml
+++ b/bongbak/week2/app/src/main/res/layout/fragment_song.xml
@@ -2,7 +2,8 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ tools:listitem="@layout/item_song"
+ android:orientation="vertical"
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+ app:layout_constraintTop_toBottomOf="@id/song_music_list_layout"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/item_album.xml b/bongbak/week2/app/src/main/res/layout/item_album.xml
new file mode 100644
index 0000000..5f97168
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/item_album.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/layout/item_salbum.xml b/bongbak/week2/app/src/main/res/layout/item_salbum.xml
new file mode 100644
index 0000000..17628b1
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/item_salbum.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bongbak/week2/app/src/main/res/layout/item_saved.xml b/bongbak/week2/app/src/main/res/layout/item_saved.xml
new file mode 100644
index 0000000..5733b5a
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/item_saved.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bongbak/week2/app/src/main/res/layout/item_song.xml b/bongbak/week2/app/src/main/res/layout/item_song.xml
new file mode 100644
index 0000000..ee9d5e7
--- /dev/null
+++ b/bongbak/week2/app/src/main/res/layout/item_song.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bongbak/week2/app/src/main/res/raw/unavailable.mp3 b/bongbak/week2/app/src/main/res/raw/unavailable.mp3
new file mode 100644
index 0000000..378d7ac
Binary files /dev/null and b/bongbak/week2/app/src/main/res/raw/unavailable.mp3 differ
diff --git a/bongbak/week2/app/src/main/res/values-v23/themes.xml b/bongbak/week2/app/src/main/res/values-v23/themes.xml
index 99615b5..427cc51 100644
--- a/bongbak/week2/app/src/main/res/values-v23/themes.xml
+++ b/bongbak/week2/app/src/main/res/values-v23/themes.xml
@@ -1,9 +1,15 @@
-
+
+
+
\ No newline at end of file
diff --git a/bongbak/week2/app/src/main/res/values/themes.xml b/bongbak/week2/app/src/main/res/values/themes.xml
deleted file mode 100644
index e6e56e0..0000000
--- a/bongbak/week2/app/src/main/res/values/themes.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/bongbak/week2/gradle/libs.versions.toml b/bongbak/week2/gradle/libs.versions.toml
index 0f61afa..baabc05 100644
--- a/bongbak/week2/gradle/libs.versions.toml
+++ b/bongbak/week2/gradle/libs.versions.toml
@@ -1,5 +1,5 @@
[versions]
-agp = "8.13.0"
+agp = "8.13.1"
kotlin = "2.0.21"
coreKtx = "1.10.1"
junit = "4.13.2"
diff --git a/bongbak/week4/.idea/week4.iml b/bongbak/week4/.idea/week4.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/bongbak/week4/.idea/week4.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kangpearl/test.txt b/kangpearl/test.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/naru/test.txt b/naru/test.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/nick/text.txt b/nick/text.txt
deleted file mode 100644
index e69de29..0000000