diff --git a/nick/Imreallystupid/app/build.gradle.kts b/nick/Imreallystupid/app/build.gradle.kts index 2e6d74c..fd5ebac 100644 --- a/nick/Imreallystupid/app/build.gradle.kts +++ b/nick/Imreallystupid/app/build.gradle.kts @@ -40,6 +40,7 @@ android { dependencies { + implementation("com.google.code.gson:gson:2.8.7") implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) 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..d08ed72 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/Album.kt @@ -0,0 +1,9 @@ +package com.example.imreallystupid + +data class Album( + var title: String = "", + var singer: String = "", + var coverImg: Int? = null, + var songs: ArrayList? = null){ + +} \ 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..6031c63 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,21 @@ package com.example.imreallystupid -import android.content.Intent 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.imreallystupid.databinding.FragmentHomeBinding - +import com.google.gson.Gson class HomeFragment : Fragment() { lateinit var binding: FragmentHomeBinding + private var albumData = ArrayList() + override fun onCreateView( inflater: LayoutInflater, @@ -22,8 +24,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,10 +37,43 @@ 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 return binding.root diff --git a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdaptor.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt similarity index 86% rename from nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdaptor.kt rename to nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt index 93a308e..0ef6e0b 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdaptor.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/HomeViewAdapter.kt @@ -3,7 +3,7 @@ package com.example.imreallystupid import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter -class HomeViewAdaptor(fragment: Fragment) : FragmentStateAdapter(fragment) { +class HomeViewAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { override fun getItemCount(): Int = 3 override fun createFragment(position: Int): Fragment { 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..2b7ce24 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerRVAdapter.kt @@ -0,0 +1,50 @@ +package com.example.imreallystupid + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.imreallystupid.databinding.ItemLockerBinding + +class LockerRVAdapter( private val albumlist : ArrayList ) : RecyclerView.Adapter() { + + private lateinit var mItemClickListener: LockerRVAdapter.AlbumListItemClickListener + + interface AlbumListItemClickListener{ + fun onRemoveAlbum(position: Int) + } + + fun setMyItemClickListener(itemClickListener: LockerRVAdapter.AlbumListItemClickListener){ + mItemClickListener = itemClickListener + } + + fun removeitem(position: Int){ + albumlist.removeAt(position) + notifyDataSetChanged() + } + + 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(albumlist[position]) + holder.binding.lockerSavedMoreIv.setOnClickListener { mItemClickListener.onRemoveAlbum(position) } + } + + override fun getItemCount(): Int = albumlist.size + + inner class ViewHolder(val binding: ItemLockerBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(album: Album) { + binding.lockerSavedTitleTv.text = album.title + binding.lockerSavedSingerTv.text = album.singer + binding.lockerSavedCoverImgIv.setImageResource(album.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/LockerViewFragment1.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment1.kt deleted file mode 100644 index f37a8a3..0000000 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment1.kt +++ /dev/null @@ -1,23 +0,0 @@ -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 com.example.imreallystupid.databinding.FragmentLockerview1Binding - -class LockerViewFragment1 : Fragment() { - - lateinit var binding: FragmentLockerview1Binding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentLockerview1Binding.inflate(inflater, container, false) - - return binding.root - } -} \ No newline at end of file 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/LockerViewFragment3.kt b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment3.kt index 59b98f2..90fb603 100644 --- a/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment3.kt +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/LockerViewFragment3.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.FragmentLockerview3Binding class LockerViewFragment3 : 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..e3b6ff4 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,5 +1,6 @@ package com.example.imreallystupid +import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast @@ -7,16 +8,24 @@ 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 +private var albumData = ArrayList() class MainActivity : AppCompatActivity() { private lateinit var resultLauncher: ActivityResultLauncher + 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) @@ -24,6 +33,40 @@ class MainActivity : AppCompatActivity() { .replace(R.id.main_fragmentContainer, HomeFragment(), null) .commit() + 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 + } + resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data: Intent? = result.data @@ -33,11 +76,14 @@ class MainActivity : AppCompatActivity() { } val intent = Intent(this, SongActivity::class.java) - 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.mainMiniplayer.setOnClickListener { intent.putExtra("title",song.title) intent.putExtra("singer",song.singer) + intent.putExtra("second",song.second) + intent.putExtra("playTime",song.playTime) + intent.putExtra("isPlaying",song.isPlaying) resultLauncher.launch(intent) } 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..3b34350 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedAlbumRVAdapter.kt @@ -0,0 +1,67 @@ +package com.example.imreallystupid + +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() { + + 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(false) } + holder.binding.lockerSavedAlbumPauseIv.setOnClickListener { holder.setSavedAlbumPlayerStatus(true) } + 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!!) + } + + fun setSavedAlbumPlayerStatus(isPlaying : Boolean) { + if(isPlaying) { + binding.lockerSavedAlbumPlayIv.visibility = View.VISIBLE + binding.lockerSavedAlbumPauseIv.visibility = View.GONE + } + else { + binding.lockerSavedAlbumPlayIv.visibility = View.GONE + binding.lockerSavedAlbumPauseIv.visibility = View.VISIBLE + } + } + } +} \ 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..0ba8ed0 --- /dev/null +++ b/nick/Imreallystupid/app/src/main/java/com/example/imreallystupid/SavedFragment.kt @@ -0,0 +1,48 @@ +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 + + private var albumData = ArrayList() + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSavedBinding.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 lockerRVAdapter = LockerRVAdapter(albumData) + binding.lockerSavedVp.adapter = lockerRVAdapter + binding.lockerSavedVp.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + + lockerRVAdapter.setMyItemClickListener(object : LockerRVAdapter.AlbumListItemClickListener{ + override fun onRemoveAlbum(position: Int) { + lockerRVAdapter.removeitem(position) + } + }) + + return binding.root + } +} \ 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..0111ae5 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 @@ -2,6 +2,9 @@ package com.example.imreallystupid data class Song( val title : String = "", - val singer : String = "" + val singer : String = "", + var second : Int = 0, + var playTime : Int = 0, + var isPlaying : Boolean = false ) 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..892c5d0 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,31 +1,32 @@ package com.example.imreallystupid +import android.content.ComponentName +import android.content.Context import android.content.Intent +import android.content.ServiceConnection import android.os.Bundle +import android.os.IBinder import android.renderscript.ScriptGroup +import android.util.Log import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import com.example.imreallystupid.databinding.ActivitySongBinding +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 song : Song + lateinit var timer: Timer + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySongBinding.inflate(layoutInflater) setContentView(binding.root) - val resend = Intent(this, MainActivity::class.java) + initSong() + binding.songDownIv.setOnClickListener { val resultIntent = Intent().apply { @@ -35,18 +36,98 @@ class SongActivity : AppCompatActivity() { finish() } binding.songPlayIv.setOnClickListener { - setPlayerStatus(false) + setPlayerStatus(true) } binding.songPauseIv.setOnClickListener { - setPlayerStatus(true) + setPlayerStatus(false) + } + + setPlayer(song) + + } + + override fun onDestroy() { + super.onDestroy() + timer.interrupt() + } + + private fun initSong() { + if(intent.hasExtra("title") && intent.hasExtra("singer")) { + song = Song( + intent.getStringExtra("title")!!, + intent.getStringExtra("singer")!!, + intent.getIntExtra("second",0), + intent.getIntExtra("playTime", 0), + intent.getBooleanExtra("isPlaying", false) + ) } + startTimer() + } + + private fun startTimer() { + timer = Timer(song.playTime, song.isPlaying) + timer.start() + } + + private fun setPlayer(song: Song) { + binding.songTitleTv.text = intent.getStringExtra("title") + binding.songSingerTv.text = intent.getStringExtra("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.songSeekbarSb.progress = (song.second * 1000 / song.playTime) + + setPlayerStatus(song.isPlaying) - if(intent.hasExtra("title") && intent.hasExtra("singer")) { - binding.songTitleTv.text = intent.getStringExtra("title") - binding.songSingerTv.text = intent.getStringExtra("singer") + } + + fun setPlayerStatus(isPlaying : Boolean) { + song.isPlaying = isPlaying + timer.isPlaying = isPlaying + + if(isPlaying) { + binding.songPlayIv.visibility = View.GONE + binding.songPauseIv.visibility = View.VISIBLE + } + else { + binding.songPlayIv.visibility = View.VISIBLE + binding.songPauseIv.visibility = View.GONE } + } + + 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 + + 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}") + } + + } } -} \ 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_song.xml b/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml index b62ce6e..e2c58e9 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/activity_song.xml @@ -116,7 +116,30 @@ android:layout_height="wrap_content" android:id="@+id/song_seekbar_sb" app:layout_constraintTop_toBottomOf="@id/song_linear1" - android:layout_marginTop="10dp"/> + android:layout_marginTop="10dp" + android:background="@null" + android:paddingStart="0dp" + android:paddingEnd="0dp" + android:progress="0" + android:max="10000"/> + + + + + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + app:layout_constraintEnd_toEndOf="parent"/> - + 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_lockerview1.xml b/nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml similarity index 63% rename from nick/Imreallystupid/app/src/main/res/layout/fragment_lockerview1.xml rename to nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml index 8e9d6d8..ec2310b 100644 --- a/nick/Imreallystupid/app/src/main/res/layout/fragment_lockerview1.xml +++ b/nick/Imreallystupid/app/src/main/res/layout/fragment_saved.xml @@ -4,13 +4,11 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> - + app:layout_constraintStart_toStartOf="parent"/> \ 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..a02b3ce --- /dev/null +++ b/nick/Imreallystupid/app/src/main/res/layout/item_lockersavedalbum.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + \ 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/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