Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions 영맨-장준영/.idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion 영맨-장준영/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FLO">

<activity
android:name=".MainActivity"
android:exported="true">
android:exported="true"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.flo.databinding.FragmentAlbumBinding
import com.google.android.material.tabs.TabLayoutMediator

class AlbumFragment : Fragment() {
lateinit var binding : FragmentAlbumBinding

private val information = arrayListOf("수록곡","상세정보","영상")

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -20,6 +23,14 @@ class AlbumFragment : Fragment() {
binding.albumBackIv.setOnClickListener{
(context as MainActivity).supportFragmentManager.beginTransaction().replace(R.id.main_frm,HomeFragment()).commitAllowingStateLoss()
}
val albumAdapter = AlbumVPAdapter(this)
binding.albumContentVp.adapter = albumAdapter

TabLayoutMediator(binding.albumContentTb, binding.albumContentVp){
tab,positin ->
tab.text=information[positin]
}.attach()

return binding.root
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.flo

import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter

class AlbumVPAdapter(fragment:Fragment) : FragmentStateAdapter(fragment) {
override fun getItemCount(): Int = 3

override fun createFragment(position: Int): Fragment {
return when(position){
0 -> SongFragment()
1 -> DetailFragment()
else -> VideoFragment()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.flo

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.flo.databinding.FragmentBannerBinding

class BannerFragment(val imgRes : Int) : Fragment() {

lateinit var binding : FragmentBannerBinding

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentBannerBinding.inflate(inflater,container,false)

binding.bannerImageIv.setImageResource(imgRes)
return binding.root
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@ package com.example.flo

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentStateManagerControl
import androidx.viewpager2.adapter.FragmentStateAdapter

class BannerVPAdapter(fragment:Fragment): FragmentAdapter(fragment) {
class BannerVPAdapter(fragment:Fragment): FragmentStateAdapter(fragment){


private val fragmentList : ArrayList<Fragment> = ArrayList()

override fun getItemCount(): Int = fragmentList.size

override fun createFragment(position: Int): Fragment =fragmentList[position] //0,1,2,3

fun addFragment(fragment: Fragment){
fragmentList.add(fragment)
notifyItemInserted(fragmentList.size-1)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.flo

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.flo.databinding.FragmentDetailBinding

class DetailFragment : Fragment() {

lateinit var binding: FragmentDetailBinding

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentDetailBinding.inflate(inflater,container,false)

return binding.root
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2
import com.example.flo.databinding.FragmentHomeBinding

class HomeFragment : Fragment() {
Expand All @@ -24,7 +25,13 @@ class HomeFragment : Fragment() {
.commitAllowingStateLoss()
}

val bannerAdapter =
val bannerAdapter = BannerVPAdapter(this)
bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp))
bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp2))
binding.homeBannerVp.adapter = bannerAdapter
binding.homeBannerVp.orientation = ViewPager2.ORIENTATION_HORIZONTAL


return binding.root
}
}
14 changes: 12 additions & 2 deletions 영맨-장준영/app/src/main/java/com/example/flo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,23 @@ class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTheme(R.style.Theme_FLO)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

initBottomNavigation()

val song = Song(binding.mainMiniPlayerSingerTv.text.toString(),binding.mainMiniPlayerSingerTv.text.toString(),0,60,false)

binding.mainPlayerCl.setOnClickListener{
startActivity(Intent(this, SongActivity::class.java))
val intent = Intent(this, SongActivity::class.java)
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)
startActivity(intent)
}
initBottomNavigation()

}

Expand Down
22 changes: 22 additions & 0 deletions 영맨-장준영/app/src/main/java/com/example/flo/Song.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.flo

//import androidx.room.Entity
//import androidx.room.PrimaryKey


//제목, 가수, 사진,재생시간,현재 재생시간, isplaying(재생 되고 있는지)

//@Entity(tableName = "SongTable")
data class Song(
var title: String = "",
var 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
//}
112 changes: 111 additions & 1 deletion 영맨-장준영/app/src/main/java/com/example/flo/SongActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,31 @@ import android.content.Intent
import android.opengl.Visibility
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.view.View
import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AppCompatActivity
import com.example.flo.databinding.ActivitySongBinding

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)

initSong()
setPlayer(song)



binding.songDownIb.setOnClickListener{
finish()
}
Expand All @@ -27,7 +39,41 @@ class SongActivity : AppCompatActivity() {
setPlayerStatus(true)
}
}
fun setPlayerStatus(isPlaying : Boolean){

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 setPlayer(song:Song){
binding.songMusicTitleTv.text = intent.getStringExtra("title")!!
binding.songSingerNameTv.text = intent.getStringExtra("singer")!!

binding.songStartTimeTv.text = String.format("%02d:%02d",song.second /60,song.second/60)
binding.songStartTimeTv.text = String.format("%02d:%02d",song.playTime /60,song.playTime/60)
binding.songProgressSb.progress = (song.second *1000/song.playTime)

setPlayerStatus(song.isPlaying)

}

private fun setPlayerStatus(isPlaying : Boolean){
song.isPlaying =isPlaying
timer.isPlaying = isPlaying

if(isPlaying) {
binding.songMiniplayerIv.visibility = View.VISIBLE //미니 플레이어 재생 버튼 보이게
binding.songPauseIv.visibility = View.GONE // 미니 플레이어 중지 버튼 공간과 모양이 안보이게
Expand All @@ -39,4 +85,68 @@ class SongActivity : AppCompatActivity() {
}
}

private fun startTimer(){
timer = Timer(song.playTime,song.isPlaying)
timer.start()
}


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.songProgressSb.progress = ((mills/playTime)*100).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)
song.second=((binding.songProgressSb.progress*song.playTime)/100)/1000
val sharedPreferences=getSharedPreferences("song", MODE_PRIVATE)
val editor = sharedPreferences.edit() //에디터



}











}
Loading