diff --git a/nick/Imreallystupid/app/build.gradle.kts b/nick/Imreallystupid/app/build.gradle.kts index 2e6d74c..1f35c5b 100644 --- a/nick/Imreallystupid/app/build.gradle.kts +++ b/nick/Imreallystupid/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) + id("kotlin-kapt") } android { @@ -39,7 +40,8 @@ android { } dependencies { - + implementation("me.relex:circleindicator:2.1.6") + implementation("com.google.code.gson:gson:2.8.7") implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) @@ -48,4 +50,9 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) + + val room_version = "2.8.3" + implementation("androidx.room:room-runtime:${room_version}") + implementation("androidx.room:room-ktx:${room_version}") + kapt("androidx.room:room-compiler:$room_version") } \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/AndroidManifest.xml b/nick/Imreallystupid/app/src/main/AndroidManifest.xml index 585fe7b..6154fc3 100644 --- a/nick/Imreallystupid/app/src/main/AndroidManifest.xml +++ b/nick/Imreallystupid/app/src/main/AndroidManifest.xml @@ -1,6 +1,11 @@ + xmlns:tools="http://schemas.android.com/tools" > + + + + + + android:theme="@style/Theme.Imreallystupid" > + + + + android:exported="true" + android:theme="@style/SplashTheme"> @@ -22,7 +35,7 @@ + android:exported="true" > diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Album.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Album.kt new file mode 100644 index 0000000..b1ca9a4 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Album.kt @@ -0,0 +1,14 @@ +package com.example.imreallystupid + +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 songs: ArrayList? = null) + { + @PrimaryKey(autoGenerate = true) var id: Int = 0 +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDao.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDao.kt new file mode 100644 index 0000000..39df48c --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDao.kt @@ -0,0 +1,17 @@ +package com.example.imreallystupid + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Update +@Dao +interface AlbumDao { + @Insert + fun insert(album: Album) + + @Update + fun update(album: Album) + + @Delete + fun delete(album: Album) +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDatabase.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDatabase.kt new file mode 100644 index 0000000..163e201 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumDatabase.kt @@ -0,0 +1,29 @@ +package com.example.imreallystupid + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database(entities = [Album::class], version = 1) +abstract class AlbumDatabase: RoomDatabase() { + abstract fun albumDao(): AlbumDao + + companion object { + private var instance: AlbumDatabase? = null + + @Synchronized + fun getInstance(context: Context): AlbumDatabase? { + if(instance == null) { + synchronized(AlbumDatabase::class) { + instance = Room.databaseBuilder( + context.applicationContext, + AlbumDatabase::class.java, + "album-database" + ).allowMainThreadQueries().build() + } + } + return instance + } + } +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumFragment.kt index 6ec4f5f..ce63b15 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumFragment.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import com.example.imreallystupid.databinding.FragmentAlbumBinding import com.google.android.material.tabs.TabLayoutMediator +import com.google.gson.Gson class AlbumFragment : Fragment() { @@ -14,6 +15,7 @@ class AlbumFragment : Fragment() { lateinit var binding: FragmentAlbumBinding + private var gson: Gson = Gson() private val information = arrayListOf("수록곡","상세정보","영상") override fun onCreateView( @@ -23,8 +25,12 @@ class AlbumFragment : Fragment() { ): View { binding = FragmentAlbumBinding.inflate(inflater, container, false) - binding.albumTitleTv.text = arguments?.getString("title") - binding.albumSingerTv.text = arguments?.getString("singer") + //binding.albumTitleTv.text = arguments?.getString("title") + //binding.albumSingerTv.text = arguments?.getString("singer") + + val albumJson = arguments?.getString("album") + val album = gson.fromJson(albumJson, Album::class.java) + setinit(album) binding.albumBackIv.setOnClickListener { @@ -34,6 +40,7 @@ class AlbumFragment : Fragment() { val albumAdapter = AlbumVPAdapter(this) binding.albumContentVp.adapter = albumAdapter + TabLayoutMediator(binding.albumContentTb, binding.albumContentVp){ tab, position -> tab.text = information[position] @@ -41,4 +48,10 @@ class AlbumFragment : Fragment() { return binding.root } + + private fun setinit(album: Album){ + binding.albumAlbumIv.setImageResource(album.coverImg!!) + binding.albumTitleTv.text = album.title.toString() + binding.albumSingerTv.text = album.singer.toString() + } } \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumRVAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumRVAdapter.kt new file mode 100644 index 0000000..0a9820c --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/AlbumRVAdapter.kt @@ -0,0 +1,62 @@ +package com.example.imreallystupid + +import android.content.Context +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.imreallystupid.databinding.ItemAlbumBinding + +class AlbumRVAdapter(private val albumlist: ArrayList): RecyclerView.Adapter() { + + + interface AlbumListItemClickListener{ + fun onItemClick(album: Album) + } + private lateinit var mItemClickListener: AlbumListItemClickListener + fun setMyItemClickListener(itemClickListener: AlbumListItemClickListener){ + mItemClickListener = itemClickListener + } + + + + interface AlbumPlayListener{ + fun changeText(album: Album) + } + private lateinit var sendMiniPlayer : AlbumPlayListener + + fun sendToMiniPlayer(sendTodayAlbum : AlbumPlayListener) { + sendMiniPlayer = sendTodayAlbum + } + + + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): AlbumRVAdapter.ViewHolder { + val binding: ItemAlbumBinding = ItemAlbumBinding.inflate(LayoutInflater.from(parent.context), parent,false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: AlbumRVAdapter.ViewHolder, position: Int) { + holder.bind(albumlist[position]) + holder.itemView.setOnClickListener { mItemClickListener.onItemClick(albumlist[position]) } + holder.binding.homeTodayAlbumArrowIv.setOnClickListener { sendMiniPlayer.changeText(albumlist[position]) } + // holder.binding.homeTodayAlbumTitleTv.setOnClickListener { mItemClickListner.onRemoveAlbum(position) } + } + + override fun getItemCount(): Int = albumlist.size + + + inner class ViewHolder(val binding: ItemAlbumBinding): RecyclerView.ViewHolder(binding.root){ + + fun bind(album: Album){ + binding.homeTodayAlbumTitleTv.text = album.title + binding.homeTodayAlbumSingerTv.text = album.singer + binding.homeTodayAlbumIv.setImageResource(album.coverImg!!) + } + } + +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeFragment.kt index 347aea8..56540b1 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeFragment.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeFragment.kt @@ -1,19 +1,28 @@ package com.example.imreallystupid -import android.content.Intent 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.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager import androidx.viewpager2.widget.ViewPager2 import com.example.imreallystupid.databinding.FragmentHomeBinding - +import com.google.gson.Gson +import kotlinx.coroutines.Runnable class HomeFragment : Fragment() { lateinit var binding: FragmentHomeBinding + private var albumData = ArrayList() + private var currentPage = 0 + private var pageCount = 3 + private lateinit var viewpager : ViewPager2 + + override fun onCreateView( inflater: LayoutInflater, @@ -22,8 +31,8 @@ class HomeFragment : Fragment() { ): View { binding = FragmentHomeBinding.inflate(inflater, container, false) - - binding.homeTodayAlbumIv.setOnClickListener { + //3주차 코드 + /*binding.homeTodayAlbumTitleTv.setOnClickListener { val song = Song(binding.homeTodayAlbumTitleTv.text.toString(),binding.homeTodayAlbumSingerTv.text.toString()) val sendData = Bundle().also { it.putString("title",song.title) @@ -35,14 +44,73 @@ class HomeFragment : Fragment() { (context as MainActivity).supportFragmentManager.beginTransaction().replace(R.id.main_fragmentContainer, albumFragment).commitAllowingStateLoss() + }*/ + + albumData.apply { + add(Album("butter", "방탄소년단 (BTS)", R.drawable.img_album_exp)) + add(Album("Lilac", "아이유 (IU)", R.drawable.img_album_exp2)) + add(Album("Next Level", "에스파 (AESPA)", R.drawable.img_album_exp3)) + add(Album("Boy with Luv", "방탄소년단(BTS)", R.drawable.img_album_exp4)) + add(Album("BBoom BBoom", "모모랜드(MOMOLAND)", R.drawable.img_album_exp5)) + add(Album("Weekend", "태연 (Tae Yeon)", R.drawable.img_album_exp6)) } - val HomeAdaptor = HomeViewAdaptor(this) - binding.homeViewpagerVp.adapter = HomeAdaptor + val albumRVAdapter = AlbumRVAdapter(albumData) + binding.homeTodayAlbumRv.adapter = albumRVAdapter + binding.homeTodayAlbumRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + albumRVAdapter.setMyItemClickListener(object : AlbumRVAdapter.AlbumListItemClickListener{ + override fun onItemClick(album: Album) { + (context as MainActivity).supportFragmentManager.beginTransaction() + .replace(R.id.main_fragmentContainer, AlbumFragment().apply { + arguments = Bundle().apply { + val gson = Gson() + val albumJson = gson.toJson(album) + putString("album", albumJson) + } + }) + .commitAllowingStateLoss() + } + }) + + albumRVAdapter.sendToMiniPlayer(object : AlbumRVAdapter.AlbumPlayListener { + override fun changeText(album: Album) { + (activity as MainActivity).updateMiniPlayer(album) + } + }) + + val HomeAdapter = HomeViewAdapter(this) + binding.homeViewpagerVp.adapter = HomeAdapter binding.homeViewpagerVp.orientation = ViewPager2.ORIENTATION_HORIZONTAL + viewpager = binding.homeViewpagerVp + + val indicator = binding.homeViewpagerIndicator + indicator.setViewPager(viewpager) return binding.root } + + private val handler = Handler(Looper.getMainLooper()) + + private val runnable : Runnable = object : Runnable { + override fun run() { + if(currentPage == pageCount) { + currentPage = 0 + } + viewpager.setCurrentItem(currentPage++, true) + handler.postDelayed(this, 3000) + } + + } + override fun onResume() { + super.onResume() + handler.postDelayed(runnable, 3000) + } + + override fun onPause() { + super.onPause() + handler.removeCallbacks(runnable) + } } diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt new file mode 100644 index 0000000..0ef6e0b --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt @@ -0,0 +1,17 @@ +package com.example.imreallystupid + +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter + +class HomeViewAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = 3 + + override fun createFragment(position: Int): Fragment { + return when (position) { + 0 -> HomeViewFragment1() + 1 -> HomeViewFragment2() + else -> HomeViewFragment3() + } + } +} + diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerFragment.kt index 5ac3761..b20627c 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerFragment.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerFragment.kt @@ -5,8 +5,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.example.imreallystupid.databinding.FragmentLockerBinding import com.google.android.material.tabs.TabLayoutMediator +import com.google.gson.Gson class LockerFragment : Fragment() { @@ -29,6 +32,7 @@ class LockerFragment : Fragment() { tab.text = information[position] }.attach() + return binding.root } } diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerRVAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerRVAdapter.kt new file mode 100644 index 0000000..799d7ca --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerRVAdapter.kt @@ -0,0 +1,64 @@ +package com.example.imreallystupid + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.imreallystupid.databinding.ItemLockerBinding + +class LockerRVAdapter() : RecyclerView.Adapter() { + + private var songs = ArrayList() + interface MyItemClickListener{ + fun onRemoveSong(songId: Int) + } + private lateinit var mItemClickListener: MyItemClickListener + + fun setMyItemClickListener(itemClickListener: MyItemClickListener) { + mItemClickListener = itemClickListener + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): LockerRVAdapter.ViewHolder { + val binding = ItemLockerBinding.inflate(LayoutInflater.from(parent.context),parent,false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: LockerRVAdapter.ViewHolder, position: Int) { + holder.bind(songs[position]) + holder.binding.lockerSavedMoreIv.setOnClickListener { + mItemClickListener.onRemoveSong(songs[position].id) + removeSong(position) + } + } + + override fun getItemCount(): Int = songs.size + + @SuppressLint + fun addSong(songs: ArrayList) { + this.songs.clear() + this.songs.addAll(songs) + + notifyDataSetChanged() + } + + @SuppressLint + private fun removeSong(position: Int) { + songs.removeAt(position) + notifyDataSetChanged() + } + + + inner class ViewHolder(val binding: ItemLockerBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(song : Song) { + binding.lockerSavedTitleTv.text = song.title + binding.lockerSavedSingerTv.text = song.singer + binding.lockerSavedCoverImgIv.setImageResource(song.coverImg!!) + } + } + +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerVPAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerVPAdapter.kt index 99687b2..440443c 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerVPAdapter.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerVPAdapter.kt @@ -6,9 +6,9 @@ import androidx.viewpager2.adapter.FragmentStateAdapter class LockerVPAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { override fun createFragment(position: Int): Fragment { return when(position) { - 0 -> LockerViewFragment1() + 0 -> SavedFragment() 1 -> LockerViewFragment2() - else -> LockerViewFragment3() + else -> SavedAlbumFragment() } } diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment2.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment2.kt index 334a4b7..b0a40ef 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment2.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment2.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import com.example.imreallystupid.databinding.FragmentLockerview1Binding import com.example.imreallystupid.databinding.FragmentLockerview2Binding class LockerViewFragment2 : Fragment() { diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MainActivity.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MainActivity.kt index f9fe2ae..87ebaf0 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MainActivity.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MainActivity.kt @@ -1,45 +1,258 @@ package com.example.imreallystupid +import android.content.Context import android.content.Intent +import android.media.MediaPlayer import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import com.example.imreallystupid.databinding.ActivityMainBinding +import com.google.gson.Gson private lateinit var binding: ActivityMainBinding class MainActivity : AppCompatActivity() { - private lateinit var resultLauncher: ActivityResultLauncher + private var song: Song = Song() + private var gson: Gson = Gson() + val songs = arrayListOf() + var nowPos = 0 + + fun updateMiniPlayer(album: Album) { + binding.mainMiniplayerTitleTv.text = album.title + binding.mainMiniplayerSingerTv.text = album.singer + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setTheme(R.style.Theme_Imreallystupid) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) + inputDummySong() + + val songDB = SongDatabase.getInstance(this)!! + songs.addAll(songDB.songDao().getSongs()) + supportFragmentManager.beginTransaction() .replace(R.id.main_fragmentContainer, HomeFragment(), null) .commit() - resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == RESULT_OK) { - val data: Intent? = result.data - val reply = data?.getStringExtra("reply") - Toast.makeText(this, reply, Toast.LENGTH_SHORT).show() + binding.mainBottomnav.setOnItemSelectedListener { item -> + when(item.itemId) { + + R.id.main_bottomnav_home_it -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_fragmentContainer, HomeFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + + /*R.id.main_bottomnav_search_it -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_fragmentContainer, SearchFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + + R.id.main_bottomnav_look_it -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_fragmentContainer, LookFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + }*/ + + R.id.main_bottomnav_locker_it -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_fragmentContainer, LockerFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } } + false } - val intent = Intent(this, SongActivity::class.java) - val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString()) + +// resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> +// if (result.resultCode == RESULT_OK) { +// val data: Intent? = result.data +// val sendTime = data?.getIntExtra("sendTime", 0)?.toFloat() ?: 0 +// val playTime = data?.getIntExtra("playTime", 0) ?: 0 +// val progress = if (playTime != 0) ((sendTime.toFloat() / playTime) * 10000).toInt() else 0 +// binding.mainMiniplayerSeekbarSb.progress = progress +// } +// } + + + + + + + binding.mainMiniplayerNextIv.setOnClickListener { + moveSong(+1) + } + binding.mainMiniplayerPreviousIv.setOnClickListener { + moveSong(-1) + } binding.mainMiniplayer.setOnClickListener { - intent.putExtra("title",song.title) - intent.putExtra("singer",song.singer) - resultLauncher.launch(intent) + val editor = getSharedPreferences("song",MODE_PRIVATE).edit() + editor.putInt("songId",songs[nowPos].id) + Log.d("send",songs[nowPos].id.toString()) + editor.apply() + + val intent = Intent(this, SongActivity::class.java) + startActivity(intent) + } + + + + } + private fun moveSong(direct: Int) { + val songDB = SongDatabase.getInstance(this)!! + val songs = songDB.songDao().getSongs() + if (nowPos + direct < 0 ) { + Toast.makeText(this,"first song",Toast.LENGTH_LONG).show() + return + } + if (nowPos + direct >= songs.size) { + Toast.makeText(this,"last song",Toast.LENGTH_LONG).show() + return } + nowPos += direct + Log.d("check",nowPos.toString()) + setPlayer((songs[nowPos])) + } + + private fun setPlayer(song: Song) { + binding.mainMiniplayerTitleTv.text = song.title + binding.mainMiniplayerSingerTv.text = song.singer + binding.mainMiniplayerSeekbarSb.progress = (song.second * 1000 / song.playTime) + } + + + + private fun inputDummySong() { + val songDB = SongDatabase.getInstance(this)!! + val songs = songDB.songDao().getSongs() + + if (songs.isNotEmpty()) 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( + "Butter", + "방탄소년단 (BTS)", + 0, + 190, + false, + "music_butter", + R.drawable.img_album_exp, + 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()) + } + + + override fun onStart() { + super.onStart() + val spf = getSharedPreferences("song", MODE_PRIVATE) + val songId = spf.getInt("songId", 0) + + val songDB = SongDatabase.getInstance(this)!! + Log.d("check1", songId.toString()) + song = if (songId == 0) { + songDB.songDao().getSong(1) + } else { + songDB.songDao().getSong(songId) + } + Log.d("check1", song.toString()) + setMiniPlayer(song) + + if ((songId) == 0) { + nowPos = 0 + } else { + nowPos = (songId - 1) + } + + } + private fun setMiniPlayer(song: Song) { + binding.mainMiniplayerTitleTv.text = song.title + binding.mainMiniplayerSingerTv.text = song.singer + binding.mainMiniplayerSeekbarSb.progress = ((song.second*10000)/song.playTime) + Log.d("minip",binding.mainMiniplayerSeekbarSb.progress.toString()) } } \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MusicService.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MusicService.kt new file mode 100644 index 0000000..0617b8f --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/MusicService.kt @@ -0,0 +1,105 @@ +/*package com.example.imreallystupid + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.media.MediaPlayer +import android.os.Binder +import android.os.Build +import android.os.IBinder +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationCompat + +class MusicService : Service() { + + private val CHANNEL_ID = "ForegroundMusicService" + private val NOTI_ID = 713 + + private var mediaPlayer: MediaPlayer? = null + private val binder = MusicBinder() + + private var currentSongTitle: String = "Unknown Title" + private var currentSongArtist: String = "Unknown Artist" + + inner class MusicBinder : Binder() { + fun getService(): MusicService = this@MusicService + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + createNotificationChannel() + + val initialTitle = intent?.getStringExtra("songTitle") ?: "Unknown Title" + val initialArtist = intent?.getStringExtra("songArtist") ?: "Unknown Artist" + val isPlaying = intent?.getBooleanExtra("isPlaying", false) ?: false + + if (mediaPlayer == null) { + mediaPlayer == MediaPlayer.create(this, R.) + currentSongTitle = initialTitle + currentSongArtist = initialArtist + if(isPlaying) { + mediaPlayer?.start() + } + } + } + override fun onBind(intent: Intent): IBinder { + return binder + } + + private fun createNotificationChannel() { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel( + CHANNEL_ID, + "Foreground Music Service CHannel", + NotificationManager.IMPORTANCE_HIGH + ) + val manager = getSystemService(NotificationManager::class.java) + manager.createNotificationChannel(channel) + } + } + + private fun createNotification(): Notification { + val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("음악 재생 중") + .setContentText("$currentSongTitle 이/가 재생중입니다.") + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setOngoing(true) + .setOnlyAlertOnce(true) + + return notificationBuilder.build() + } + + fun playMusic() { + mediaPlayer?.start() + } + + fun pauseMusic() { + mediaPlayer?.pause() + } + + fun seekTo(position: Int) { + mediaPlayer?.seekTo(position) + } + + fun updateCurrentSongInfo(title: String, artist: String) { + currentSongArtist = artist + currentSongTitle = title + } + + fun getCurrentPosition() : Int { + return mediaPlayer?.duration ?: 0 + } + + fun isPlaying() : Boolean { + return mediaPlayer?.isPlaying ?: false + } + + override fun onDestroy() { + mediaPlayer?.stop() + mediaPlayer?.release() + mediaPlayer = null + super.onDestroy() + } +}*/ \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumFragment.kt new file mode 100644 index 0000000..5487433 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumFragment.kt @@ -0,0 +1,50 @@ +package com.example.imreallystupid + +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.imreallystupid.databinding.FragmentSavedBinding +import com.example.imreallystupid.databinding.FragmentSavedalbumBinding + +class SavedAlbumFragment : Fragment() { + + lateinit var binding: FragmentSavedalbumBinding + + private var albumData = ArrayList() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSavedalbumBinding.inflate(inflater, container, false) + + albumData.apply { + add(Album("butter", "방탄소년단 (BTS)", R.drawable.img_album_exp)) + add(Album("Lilac", "아이유 (IU)", R.drawable.img_album_exp2)) + add(Album("Next Level", "에스파 (AESPA)", R.drawable.img_album_exp3)) + add(Album("Boy with Luv", "방탄소년단(BTS)", R.drawable.img_album_exp4)) + add(Album("BBoom BBoom", "모모랜드(MOMOLAND)", R.drawable.img_album_exp5)) + add(Album("Weekend", "태연 (Tae Yeon)", R.drawable.img_album_exp6)) + } + + val savedAlbumRVAdapter = SavedAlbumRVAdapter(albumData) + binding.lockerSavedAlbumRv.adapter = savedAlbumRVAdapter + binding.lockerSavedAlbumRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + + savedAlbumRVAdapter.setMyItemClickListener(object : SavedAlbumRVAdapter.SavedAlbumOnclickListener{ + override fun onItemClick(album: Album) { + //이후 앨범 클릭 이벤트 적용 + } + + override fun onRemoveAlbum(position: Int) { + savedAlbumRVAdapter.removeitem(position) + } + + }) + return binding.root + } +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumRVAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumRVAdapter.kt new file mode 100644 index 0000000..145bfbc --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumRVAdapter.kt @@ -0,0 +1,71 @@ +package com.example.imreallystupid + +import android.annotation.SuppressLint +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.imreallystupid.AlbumRVAdapter.AlbumListItemClickListener +import com.example.imreallystupid.databinding.ActivitySongBinding +import com.example.imreallystupid.databinding.FragmentSavedalbumBinding +import com.example.imreallystupid.databinding.ItemAlbumBinding +import com.example.imreallystupid.databinding.ItemLockersavedalbumBinding + +class SavedAlbumRVAdapter(private val albumlist: ArrayList) : RecyclerView.Adapter() { + + private val songs = ArrayList() + interface SavedAlbumOnclickListener{ + fun onItemClick(album: Album) + fun onRemoveAlbum(position: Int) + } + private lateinit var mItemClickListener: SavedAlbumOnclickListener + + fun setMyItemClickListener(itemClickListener: SavedAlbumOnclickListener){ + mItemClickListener = itemClickListener + } + + fun removeitem(position: Int){ + albumlist.removeAt(position) + notifyDataSetChanged() + } + + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SavedAlbumRVAdapter.ViewHolder { + val binding: ItemLockersavedalbumBinding = ItemLockersavedalbumBinding.inflate(LayoutInflater.from(parent.context), parent,false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: SavedAlbumRVAdapter.ViewHolder, position: Int) { + holder.bind(albumlist[position]) + holder.binding.lockerSavedAlbumPlayIv.setOnClickListener { holder.setSavedAlbumPlayerStatus(true) } + holder.binding.lockerSavedAlbumPauseIv.setOnClickListener { holder.setSavedAlbumPlayerStatus(false) } + holder.binding.lockerSavedAlbumMoreIv.setOnClickListener { mItemClickListener.onRemoveAlbum(position) } + } + + override fun getItemCount(): Int = albumlist.size + inner class ViewHolder(val binding: ItemLockersavedalbumBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(album: Album) { + binding.lockerSavedAlbumTitleTv.text = album.title + binding.lockerSavedAlbumSingerTv.text = album.singer + binding.lockerSavedAlbumAlbumImgIv.setImageResource(album.coverImg!!) + binding.lockerSavedAlbumPlayIv.visibility = View.VISIBLE + binding.lockerSavedAlbumPauseIv.visibility = View.GONE + } + + fun setSavedAlbumPlayerStatus(isPlaying : Boolean) { + if(isPlaying) { + binding.lockerSavedAlbumPlayIv.visibility = View.GONE + binding.lockerSavedAlbumPauseIv.visibility = View.VISIBLE + } + else { + binding.lockerSavedAlbumPlayIv.visibility = View.VISIBLE + binding.lockerSavedAlbumPauseIv.visibility = View.GONE + } + } + } +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedFragment.kt new file mode 100644 index 0000000..1b5f395 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedFragment.kt @@ -0,0 +1,49 @@ +package com.example.imreallystupid + +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.imreallystupid.databinding.FragmentSavedBinding +import com.google.gson.Gson + + +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.lockerSavedVp.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + val lockerRVAdapter = LockerRVAdapter() + + lockerRVAdapter.setMyItemClickListener(object : LockerRVAdapter.MyItemClickListener{ + override fun onRemoveSong(songId: Int) { + songDB.songDao().updateIsLikeById(false,songId) + } + }) + + binding.lockerSavedVp.adapter = lockerRVAdapter + lockerRVAdapter.addSong(songDB.songDao().getLikedSongs(true)as ArrayList) + } +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Song.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Song.kt index 550582d..0531592 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Song.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Song.kt @@ -1,7 +1,20 @@ package com.example.imreallystupid +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "songTable") data class Song( val title : String = "", - val singer : String = "" -) + val singer : String = "", + var second : Int = 0, + var 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 +} + diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongActivity.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongActivity.kt index 0554c53..3a71d04 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongActivity.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongActivity.kt @@ -1,52 +1,225 @@ package com.example.imreallystupid +import android.content.ComponentName +import android.content.Context import android.content.Intent +import android.content.ServiceConnection +import android.media.MediaPlayer import android.os.Bundle +import android.os.IBinder import android.renderscript.ScriptGroup +import android.util.Log import android.view.View +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import com.example.imreallystupid.databinding.ActivitySongBinding +import com.google.gson.Gson +import kotlinx.coroutines.Job -private lateinit var binding: ActivitySongBinding - -fun setPlayerStatus(isPlaying : Boolean) { - if(isPlaying) { - binding.songPlayIv.visibility = View.VISIBLE - binding.songPauseIv.visibility = View.GONE - } - else { - binding.songPlayIv.visibility = View.GONE - binding.songPauseIv.visibility = View.VISIBLE - } -} class SongActivity : AppCompatActivity() { + + lateinit var binding: ActivitySongBinding + lateinit var timer: Timer + private var mediaPlayer: MediaPlayer? = null + + val songs = arrayListOf() + lateinit var songDB: SongDatabase + var nowPos = 0 + + var sendTime : Int = 0 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySongBinding.inflate(layoutInflater) setContentView(binding.root) - val resend = Intent(this, MainActivity::class.java) + initPlayList() + initSong() + initClickListener() - binding.songDownIv.setOnClickListener { - val resultIntent = Intent().apply { - putExtra("reply", binding.songTitleTv.text.toString()) + } + + + private fun initSong() { + val spf = getSharedPreferences("song",MODE_PRIVATE) + val songId = spf.getInt("songId",0) + + nowPos = getPlayingSongPosition(songId) + Log.d("check3",nowPos.toString()) + Log.d("now Song ID",songs[nowPos].id.toString()) + startTimer() + 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 + } + + private fun startTimer() { + timer = Timer(songs[nowPos].playTime, songs[nowPos].isPlaying) + timer.start() + } + + private fun setPlayer(song: Song) { + binding.songTitleTv.text = song.title + binding.songSingerTv.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.songSeekbarSb.progress = (song.second * 1000 / song.playTime) + val music = resources.getIdentifier(song.music, "raw", this.packageName) + mediaPlayer = MediaPlayer.create(this, music) + setPlayerStatus(song.isPlaying) + + if(song.islike) { + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_on) + } else { + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_off) + } + + } + + fun setPlayerStatus(isPlaying : Boolean) { + songs[nowPos].isPlaying = isPlaying + timer.isPlaying = isPlaying + + if(isPlaying) { + binding.songPlayIv.visibility = View.GONE + binding.songPauseIv.visibility = View.VISIBLE + mediaPlayer?.start() + } + else { + binding.songPlayIv.visibility = View.VISIBLE + binding.songPauseIv.visibility = View.GONE + if(mediaPlayer?.isPlaying == true) { + mediaPlayer?.pause() } - setResult(RESULT_OK, resultIntent) + } + } + + inner class Timer(private val playTime: Int, var isPlaying: Boolean = true): Thread(){ + + private var second : Int = 0 + + private var mills: Float = 0f + + override fun run() { + super.run() + try { + while(true) { + if(second >= playTime) { + break + } + + if(isPlaying){ + sleep(50) + mills += 50 + sendTime = second + + runOnUiThread { + binding.songSeekbarSb.progress = ((mills/playTime)*10).toInt() + } + if (mills % 1000 == 0f){ + runOnUiThread { + binding.songStartTimeTv.text = String.format("%02d:%02d",second / 60, second % 60) + } + second++ + } + } + } + }catch (e: InterruptedException) { + Log.d("Song","쓰레드가 죽었습니다. ${e.message}") + } + + } + } + + override fun onPause() { + super.onPause() + setPlayerStatus(false) + songs[nowPos].second = ((binding.songSeekbarSb.progress * songs[nowPos].playTime)/10)/1000 + Log.d("why",songs[nowPos].playTime.toString()) + Log.d("why",binding.songSeekbarSb.progress.toString()) + Log.d("why",songs[nowPos].second.toString()) + songDB.songDao().update(songs[nowPos]) + + 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 initClickListener() { + binding.songDownIv.setOnClickListener { finish() } binding.songPlayIv.setOnClickListener { - setPlayerStatus(false) + setPlayerStatus(true) } binding.songPauseIv.setOnClickListener { - setPlayerStatus(true) + setPlayerStatus(false) + } + binding.songNextIv.setOnClickListener { + moveSong(+1) } + binding.songPreviousIv.setOnClickListener { + moveSong(-1) + } + binding.songLikeIv.setOnClickListener { + setLike(songs[nowPos].islike) + } + } - if(intent.hasExtra("title") && intent.hasExtra("singer")) { - binding.songTitleTv.text = intent.getStringExtra("title") - binding.songSingerTv.text = intent.getStringExtra("singer") + private fun moveSong(direct: Int) { + if (nowPos + direct < 0 ) { + Toast.makeText(this,"first song",Toast.LENGTH_LONG).show() + return + } + if (nowPos + direct >= songs.size) { + Toast.makeText(this,"last song",Toast.LENGTH_LONG).show() + return } + nowPos += direct + timer.interrupt() + startTimer() + + mediaPlayer?.release() + mediaPlayer = null + + setPlayer((songs[nowPos])) + } + + 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.songLikeIv.setImageResource(R.drawable.ic_my_like_off) + } } -} \ No newline at end of file +} + diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDao.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDao.kt new file mode 100644 index 0000000..b168d2a --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDao.kt @@ -0,0 +1,31 @@ +package com.example.imreallystupid + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update + +@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/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDatabase.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDatabase.kt new file mode 100644 index 0000000..0ccf1c7 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongDatabase.kt @@ -0,0 +1,28 @@ +package com.example.imreallystupid + +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/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongFragment.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongFragment.kt index 49bd260..38eec4d 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongFragment.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongFragment.kt @@ -5,6 +5,7 @@ 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.imreallystupid.databinding.FragmentDetailBinding import com.example.imreallystupid.databinding.FragmentSongBinding @@ -12,6 +13,8 @@ import com.example.imreallystupid.databinding.FragmentSongBinding class SongFragment : Fragment() { lateinit var binding: FragmentSongBinding + private var albumData = ArrayList() + fun setToggleStatus(isPlaying : Boolean) { if(isPlaying) { binding.albumSongMixToggleOnIv.visibility = View.VISIBLE @@ -37,6 +40,19 @@ class SongFragment : Fragment() { setToggleStatus(false) } + albumData.apply { + add(Album("butter", "방탄소년단 (BTS)", R.drawable.img_album_exp)) + add(Album("Lilac", "아이유 (IU)", R.drawable.img_album_exp2)) + add(Album("Next Level", "에스파 (AESPA)", R.drawable.img_album_exp3)) + add(Album("Boy with Luv", "방탄소년단(BTS)", R.drawable.img_album_exp4)) + add(Album("BBoom BBoom", "모모랜드(MOMOLAND)", R.drawable.img_album_exp5)) + add(Album("Weekend", "태연 (Tae Yeon)", R.drawable.img_album_exp6)) + } + + val songAdapter = SongRVAdapter(albumData) + binding.albumSongRv.adapter = songAdapter + binding.albumSongRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + return binding.root } diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongRVAdapter.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongRVAdapter.kt new file mode 100644 index 0000000..09fbb4e --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SongRVAdapter.kt @@ -0,0 +1,35 @@ +package com.example.imreallystupid + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.imreallystupid.databinding.ItemSongBinding + +class SongRVAdapter(private val albumlist: ArrayList) : RecyclerView.Adapter() { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SongRVAdapter.ViewHolder { + val binding = ItemSongBinding.inflate(LayoutInflater.from(parent.context), parent, false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: SongRVAdapter.ViewHolder, position: Int) { + holder.bind(albumlist[position]) + } + + override fun getItemCount(): Int = albumlist.size + + + inner class ViewHolder(val binding: ItemSongBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(album: Album) { + binding.albumSongTitleTv.text = album.title + binding.albumSongSingerTv.text = album.singer + } + } + + +} \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/activity_main.xml b/nick/Imreallystupid/app/src/main/res/layout/activity_main.xml index 3855e58..e003032 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/activity_main.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/activity_main.xml @@ -20,6 +20,19 @@ android:id="@+id/main_miniplayer" app:layout_constraintBottom_toTopOf="@id/main_bottomnav"> + + @@ -48,7 +61,7 @@ android:id="@+id/main_miniplayer_previous_iv" android:src="@drawable/btn_miniplayer_previous" app:layout_constraintEnd_toStartOf="@id/main_miniplayer_play_iv" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toBottomOf="@id/main_miniplayer_seekbar_sb"/> + app:layout_constraintTop_toBottomOf="@id/main_miniplayer_seekbar_sb"/> + app:layout_constraintTop_toBottomOf="@id/main_miniplayer_seekbar_sb"/> + app:layout_constraintTop_toBottomOf="@id/main_miniplayer_seekbar_sb"/> diff --git a/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml b/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml index b62ce6e..2aac243 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml @@ -112,11 +112,35 @@ + android:layout_marginTop="10dp" + android:background="@null" + android:max="10000" + android:paddingStart="0dp" + android:paddingEnd="0dp" + android:progress="0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/song_linear1" /> + + + + + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + app:ci_drawable="@drawable/fragment_look_chip_on_background"/> @@ -35,11 +44,11 @@ android:layout_height="30dp" android:id="@+id/home_today_arrow_iv" android:src="@drawable/btn_arrow_more" - app:layout_constraintTop_toBottomOf="@id/home_viewpager_vp" + app:layout_constraintTop_toBottomOf="@id/home_viewpager_indicator" app:layout_constraintStart_toEndOf="@id/home_today_tv" android:layout_marginTop="30dp"/> - + android:layout_marginStart="20dp"/>--> + + diff --git a/nick/Imreallystupid/app/src/main/res/layout/fragment_locker.xml b/nick/Imreallystupid/app/src/main/res/layout/fragment_locker.xml index 0cc0246..7277278 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/fragment_locker.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/fragment_locker.xml @@ -44,6 +44,7 @@ android:layout_height="match_parent" android:id="@+id/locker_viewpager_vp" app:layout_constraintTop_toBottomOf="@id/locker_tablayout_tb" - app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toStartOf="parent" + android:layout_marginTop="105dp"/> \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml b/nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml new file mode 100644 index 0000000..ec2310b --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/fragment_savedalbum.xml b/nick/Imreallystupid/app/src/main/res/layout/fragment_savedalbum.xml new file mode 100644 index 0000000..fb4d662 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/fragment_savedalbum.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/fragment_song.xml b/nick/Imreallystupid/app/src/main/res/layout/fragment_song.xml index 05a79ab..cf0be22 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/fragment_song.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/fragment_song.xml @@ -46,4 +46,11 @@ + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/item_album.xml b/nick/Imreallystupid/app/src/main/res/layout/item_album.xml new file mode 100644 index 0000000..3aa934f --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/item_album.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/item_locker.xml b/nick/Imreallystupid/app/src/main/res/layout/item_locker.xml new file mode 100644 index 0000000..05f5b0e --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/item_locker.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/item_lockersavedalbum.xml b/nick/Imreallystupid/app/src/main/res/layout/item_lockersavedalbum.xml new file mode 100644 index 0000000..3ec0533 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/item_lockersavedalbum.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/layout/item_song.xml b/nick/Imreallystupid/app/src/main/res/layout/item_song.xml new file mode 100644 index 0000000..71c4f40 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/item_song.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_bboom.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_bboom.mp3 new file mode 100644 index 0000000..b555591 Binary files /dev/null and b/nick/Imreallystupid/app/src/main/res/raw/music_bboom.mp3 differ diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_boy.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_boy.mp3 new file mode 100644 index 0000000..c19f239 Binary files /dev/null and b/nick/Imreallystupid/app/src/main/res/raw/music_boy.mp3 differ diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_butter.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_butter.mp3 new file mode 100644 index 0000000..a6b952f Binary files /dev/null and b/nick/Imreallystupid/app/src/main/res/raw/music_butter.mp3 differ diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_flu.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_flu.mp3 new file mode 100644 index 0000000..e6a0d7e Binary files /dev/null and b/nick/Imreallystupid/app/src/main/res/raw/music_flu.mp3 differ diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_lilac.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_lilac.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/nick/Imreallystupid/app/src/main/res/raw/music_next.mp3 b/nick/Imreallystupid/app/src/main/res/raw/music_next.mp3 new file mode 100644 index 0000000..6261b05 Binary files /dev/null and b/nick/Imreallystupid/app/src/main/res/raw/music_next.mp3 differ diff --git a/nick/Imreallystupid/app/src/main/res/values/themes.xml b/nick/Imreallystupid/app/src/main/res/values/themes.xml index 0055bb3..7715db2 100644 --- a/nick/Imreallystupid/app/src/main/res/values/themes.xml +++ b/nick/Imreallystupid/app/src/main/res/values/themes.xml @@ -6,4 +6,8 @@ + \ No newline at end of file diff --git a/nick/Imreallystupid/build.gradle.kts b/nick/Imreallystupid/build.gradle.kts index 922f551..ab46529 100644 --- a/nick/Imreallystupid/build.gradle.kts +++ b/nick/Imreallystupid/build.gradle.kts @@ -2,4 +2,5 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false -} \ No newline at end of file +} + diff --git a/nick/Imreallystupid/settings.gradle.kts b/nick/Imreallystupid/settings.gradle.kts index 3fa4b1b..b7b497c 100644 --- a/nick/Imreallystupid/settings.gradle.kts +++ b/nick/Imreallystupid/settings.gradle.kts @@ -9,6 +9,7 @@ pluginManagement { } mavenCentral() gradlePluginPortal() + maven("https://jitpack.io") } } dependencyResolutionManagement { @@ -16,6 +17,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven("https://jitpack.io") } }