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/app/build.gradle.kts b/bongbak/week2/app/build.gradle.kts index 1c955a1..11bd716 100644 --- a/bongbak/week2/app/build.gradle.kts +++ b/bongbak/week2/app/build.gradle.kts @@ -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) 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..248cfe3 --- /dev/null +++ b/bongbak/week2/app/src/main/java/com/example/mission2/Album.kt @@ -0,0 +1,8 @@ +package com.example.mission2 + +data class Album( + var title:String?="", + var singer:String?="", + var coverImg : Int? =null, + var songs: ArrayList?=null +) 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..30794c0 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,33 @@ package com.example.mission2 +import android.content.Context 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 androidx.viewpager2.widget.ViewPager2 import com.example.mission2.databinding.FragmentHomeBinding +import com.google.gson.Gson + class HomeFragment : Fragment() { lateinit var binding: FragmentHomeBinding + private val albumDatas=ArrayList() + + 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,11 +36,37 @@ 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) bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp)) @@ -39,5 +83,17 @@ class HomeFragment : Fragment() { return binding.root } + 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() + } + +} -} \ No newline at end of file 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..ffe5d35 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,12 +8,12 @@ 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 + private val information = arrayListOf("μ €μž₯ν•œ 곑", "μŒμ•…νŒŒμΌ", "μ €μž₯앨범") + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -21,18 +21,11 @@ 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 -> tab.text = information[position] - }.attach() return binding.root 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..7a9dee0 --- /dev/null +++ b/bongbak/week2/app/src/main/java/com/example/mission2/LockerRVAapter.kt @@ -0,0 +1,47 @@ +package com.example.mission2 + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.mission2.databinding.ItemSavedBinding + +class LockerRVAdapter(private val savedList:ArrayList): RecyclerView.Adapter() { + interface OnItemClickListener { + fun onRemoveItem(position: Int) + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemSavedBinding = + ItemSavedBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + private lateinit var myItemClickListener: OnItemClickListener + + fun setOnItemClickListener(itemClickListener: OnItemClickListener){ + myItemClickListener=itemClickListener + } + + + fun removeItem(position:Int){ + savedList.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, savedList.size) + } + + override fun onBindViewHolder(holder: LockerRVAdapter.ViewHolder, position: Int) { + + holder.bind(savedList[position]) + holder.binding.itemSavedMore01Iv.setOnClickListener { + myItemClickListener.onRemoveItem(position) + } + } + + override fun getItemCount(): Int=savedList.size + + inner class ViewHolder(val binding: ItemSavedBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(saved: Saved) { + binding.itemSavedMusicTitle01Tv.text = saved.title + binding.itemSavedSingerName01Tv.text = saved.singer + binding.itemSavedCoverIv.setImageResource(saved.coverImg!!) + } + } +} \ 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..33bc940 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 -> Fragment() + } } } \ 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..1827f6f 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 @@ -4,7 +4,7 @@ import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.mission2.databinding.ActivityMainBinding -class MainActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity(),HomeFragment.OnSongPlayListener { lateinit var binding: ActivityMainBinding @@ -15,7 +15,7 @@ class MainActivity : AppCompatActivity() { initBottomNavigation() - val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString()) + val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString(),0,60,false) binding.mainPlayerCl.setOnClickListener { val intent = Intent(this, SongActivity::class.java) @@ -25,10 +25,21 @@ class MainActivity : AppCompatActivity() { val intent = Intent(this,SongActivity::class.java) intent.putExtra("title", song.title) intent.putExtra("singer",song.singer) + intent.putExtra("playTime",song.playTime) + intent.putExtra("isPlaying",song.isPlaying) + startActivity(intent) } } + 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 initBottomNavigation(){ 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..3acc254 --- /dev/null +++ b/bongbak/week2/app/src/main/java/com/example/mission2/SavedFragment.kt @@ -0,0 +1,42 @@ +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.FragmentSavedBinding + +class SavedFragment : Fragment() { + + lateinit var binding: FragmentSavedBinding + private val savedDatas = ArrayList() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSavedBinding.inflate(inflater, container, false) // 바인딩 클래슀 λ³€κ²½ + + savedDatas.apply { + add(Saved("Butter", "λ°©νƒ„μ†Œλ…„λ‹¨(BTS)", R.drawable.img_album_exp)) + add(Saved("Permission to Dance", "λ°©νƒ„μ†Œλ…„λ‹¨(BTS)", R.drawable.img_album_exp2)) + add(Saved("Butter(instrumental)", "λ°©νƒ„μ†Œλ…„λ‹¨(BTS)", R.drawable.img_album_exp3)) + add(Saved("Permission to Dance(instrumental)", "λ°©νƒ„μ†Œλ…„λ‹¨(BTS)", R.drawable.img_album_exp4)) + } + + val lockerRVAdapter = LockerRVAdapter(savedDatas) + binding.lockerSavedRv.adapter = lockerRVAdapter + binding.lockerSavedRv.layoutManager = LinearLayoutManager(context) + + lockerRVAdapter.setOnItemClickListener(object : LockerRVAdapter.OnItemClickListener { + override fun onRemoveItem(position: Int) { + lockerRVAdapter.removeItem(position) + } + }) + + return binding.root + } +} \ 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..4f4a0d0 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 @@ -3,4 +3,7 @@ package com.example.mission2 data class Song( var title: String = "", var singer: String = "", + var second: Int=0, + val playTime:Int=0, + var isPlaying: Boolean=false ) \ 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..1a0ecc9 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 @@ -8,71 +8,99 @@ import com.example.mission2.databinding.ActivitySongBinding class SongActivity : AppCompatActivity() { lateinit var binding : ActivitySongBinding + lateinit var song : Song override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding= ActivitySongBinding.inflate(layoutInflater) + binding = ActivitySongBinding.inflate(layoutInflater) setContentView(binding.root) - binding.songDownIb.setOnClickListener{ - finish() - } - binding.songMiniplayerIv.setOnClickListener{ - setPlayerStatus(false) - } - binding.songPauseIv.setOnClickListener{ - setPlayerStatus(true) - } - binding.songRepeatIv.setOnClickListener { - setRepeatStatus(false) - } - binding.songSelectRepeatIv.setOnClickListener{ - setRepeatStatus(true) - } - binding.songRandomIv.setOnClickListener{ - setRandomStatus(false) - } - binding.songSelectRandomIv.setOnClickListener{ - setRandomStatus(true) - } - if (intent.hasExtra("title")&&intent.hasExtra("singer")){ - binding.songMusicTitleTv.text=intent.getStringExtra("title") - binding.songSingerNameTv.text=intent.getStringExtra("singer") - } - } - fun setPlayerStatus(isPlaying : Boolean){ - if(isPlaying){ - binding.songMiniplayerIv.visibility= View.VISIBLE - binding.songPauseIv.visibility=View.GONE - } - else{ - binding.songMiniplayerIv.visibility= View.GONE - binding.songPauseIv.visibility=View.VISIBLE - } - } - fun setRepeatStatus(isRepeat: Boolean){ - if(isRepeat){ - binding.songRepeatIv.visibility=View.VISIBLE - binding.songSelectRepeatIv.visibility=View.GONE - } - else{ - binding.songRepeatIv.visibility=View.GONE - binding.songSelectRepeatIv.visibility=View.VISIBLE + // Song 데이터 μ΄ˆκΈ°ν™” 및 UI μ„€μ • + initSong() + setPlayer(song) + // λ’€λ‘œκ°€κΈ° λ²„νŠΌ + binding.songDownIb.setOnClickListener { + finish() } + +// // μž¬μƒ/μΌμ‹œμ •μ§€ λ²„νŠΌ +// binding.songMiniplayerIv.setOnClickListener { +// setPlayerStatus(false) +// } +// binding.songPauseIv.setOnClickListener { +// setPlayerStatus(true) +// } +// +// // λ°˜λ³΅μž¬μƒ λ²„νŠΌ +// binding.songRepeatIv.setOnClickListener { +// setRepeatStatus(true) +// } +// binding.songSelectRepeatIv.setOnClickListener { +// setRepeatStatus(false) +// } +// +// // λžœλ€μž¬μƒ λ²„νŠΌ +// binding.songRandomIv.setOnClickListener { +// setRandomStatus(true) +// } +// binding.songSelectRandomIv.setOnClickListener { +// setRandomStatus(false) +// } } - fun setRandomStatus(isRandom: Boolean){ - if(isRandom){ - binding.songRandomIv.visibility=View.VISIBLE - binding.songSelectRandomIv.visibility=View.GONE - } - else{ - binding.songRandomIv.visibility=View.GONE - binding.songSelectRandomIv.visibility=View.VISIBLE + // Song 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” ν•¨μˆ˜ + private fun initSong() { + // Intent둜 λ„˜μ–΄μ˜¨ 데이터가 μžˆλŠ”μ§€ 확인 + if (intent.hasExtra("title") && intent.hasExtra("singer")) { + song = Song( + intent.getStringExtra("title")!!, + intent.getStringExtra("singer")!!, + intent.getIntExtra("second", 0), + intent.getIntExtra("playTime", 60), // playTime이 0이면 μ•ˆλ˜λ―€λ‘œ κΈ°λ³Έκ°’ 60초 μ„€μ • + intent.getBooleanExtra("isPlaying", false) + ) } } + // 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) // song.second -> song.playTime μˆ˜μ • +// binding.songProgressSb.progress = (song.second * 1000 / song.playTime) +// setPlayerStatus(song.isPlaying) + } +// private fun setPlayerStatus(isPlaying: Boolean) { +// if (isPlaying) { +// binding.songMiniplayerIv.visibility = View.GONE +// binding.songPauseIv.visibility = View.VISIBLE +// } else { +// binding.songMiniplayerIv.visibility = View.VISIBLE +// binding.songPauseIv.visibility = View.GONE +// } +// } +// +// 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/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/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/layout/activity_song.xml b/bongbak/week2/app/src/main/res/layout/activity_song.xml index 209615d..8f04012 100644 --- a/bongbak/week2/app/src/main/res/layout/activity_song.xml +++ b/bongbak/week2/app/src/main/res/layout/activity_song.xml @@ -150,162 +150,180 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/song_like_iv_layout" + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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..cacc526 100644 --- a/bongbak/week2/app/src/main/res/layout/fragment_home.xml +++ b/bongbak/week2/app/src/main/res/layout/fragment_home.xml @@ -14,10 +14,11 @@ android:id="@+id/home_pannel_background_vp" android:layout_width="match_parent" android:layout_height="430dp" + android:layout_marginTop="8dp" android:scaleType="centerCrop" android:src="@drawable/img_first_album_default" 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" /> @@ -214,139 +215,139 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/home_pannel_background_vp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -358,6 +359,15 @@ + + 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_saved.xml b/bongbak/week2/app/src/main/res/layout/fragment_saved.xml new file mode 100644 index 0000000..f24a18a --- /dev/null +++ b/bongbak/week2/app/src/main/res/layout/fragment_saved.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + \ 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_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/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