diff --git a/.gitignore b/.gitignore index e5cbb64..aa724b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,15 @@ -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Log/OS Files -*.log - -# Android Studio generated files and folders -captures/ -.externalNativeBuild/ -.cxx/ -*.aab -*.apk -output-metadata.json - -# IntelliJ *.iml -.idea/ -misc.xml -deploymentTargetDropDown.xml -render.experimental.xml - -# Keystore files -*.jks -*.keystore - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Android Profiling -*.hprof +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..639c779 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/studiobot.xml b/.idea/studiobot.xml new file mode 100644 index 0000000..539e3b8 --- /dev/null +++ b/.idea/studiobot.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..d8cdc20 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "com.example.week4" + compileSdk = 36 + + buildFeatures { + viewBinding=true + } + + defaultConfig { + applicationId = "com.example.week4" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/week4/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/week4/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..2f35ad8 --- /dev/null +++ b/app/src/androidTest/java/com/example/week4/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.week4 + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.week4", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9f6c6dd --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/Album.kt b/app/src/main/java/com/example/week4/Album.kt new file mode 100644 index 0000000..a8ca02c --- /dev/null +++ b/app/src/main/java/com/example/week4/Album.kt @@ -0,0 +1,8 @@ +package com.example.week4 + +data class Album( + val title: String = "", + val singer: String = "", + val coverImg: Int, + val songs: ArrayList? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/AlbumFragment.kt b/app/src/main/java/com/example/week4/AlbumFragment.kt new file mode 100644 index 0000000..48b2ac3 --- /dev/null +++ b/app/src/main/java/com/example/week4/AlbumFragment.kt @@ -0,0 +1,46 @@ +package com.example.week4 + +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.week4.databinding.FragmentAlbumBinding + +class AlbumFragment : Fragment() { + lateinit var binding: FragmentAlbumBinding + private val songData = ArrayList() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentAlbumBinding.inflate(inflater, container, false) + + initDummyData() + + initRecyclerView() + + binding.albumBackIv.setOnClickListener { + (activity as MainActivity).supportFragmentManager.popBackStack() + } + + return binding.root + } + + private fun initRecyclerView(){ + val songRVAdapter = SavedSongRVAdapter(songData) + binding.albumSongListRv.adapter = songRVAdapter + binding.albumSongListRv.layoutManager = LinearLayoutManager(context) + } + + private fun initDummyData(){ + songData.add(Song("LILAC", "아이유 (IU)")) + songData.add(Song("Flu", "아이유 (IU)")) + songData.add(Song("Coin", "아이유 (IU)")) + songData.add(Song("봄 안녕 봄", "아이유 (IU)")) + songData.add(Song("Celebrity", "아이유 (IU)")) + songData.add(Song("돌림노래", "아이유 (IU)")) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/AlbumRVAdapter.kt b/app/src/main/java/com/example/week4/AlbumRVAdapter.kt new file mode 100644 index 0000000..5b73574 --- /dev/null +++ b/app/src/main/java/com/example/week4/AlbumRVAdapter.kt @@ -0,0 +1,41 @@ +package com.example.week4 + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.week4.Album +import com.example.week4.databinding.ItemAlbumBinding + +class AlbumRVAdapter(private val albumList: ArrayList) : RecyclerView.Adapter() { + + interface MyItemClickListener { + fun onItemClick(album: Album) + fun onPlayClick(album: Album) + } + + private lateinit var mItemClickListener: MyItemClickListener + fun setMyItemClickListener(itemClickListener: MyItemClickListener) { + mItemClickListener = itemClickListener + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemAlbumBinding = ItemAlbumBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(albumList[position]) + holder.itemView.setOnClickListener { mItemClickListener.onItemClick(albumList[position]) } + holder.binding.itemAlbumPlayIv.setOnClickListener { mItemClickListener.onPlayClick(albumList[position]) } + } + + override fun getItemCount(): Int = albumList.size + + inner class ViewHolder(val binding: ItemAlbumBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(album: Album) { + binding.itemAlbumTitleTv.text = album.title + binding.itemAlbumSingerTv.text = album.singer + binding.itemAlbumCoverIv.setImageResource(album.coverImg) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/HomeFragment.kt b/app/src/main/java/com/example/week4/HomeFragment.kt new file mode 100644 index 0000000..82199bc --- /dev/null +++ b/app/src/main/java/com/example/week4/HomeFragment.kt @@ -0,0 +1,74 @@ +package com.example.week4 + +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.week4.Album +import com.example.week4.Song +import com.example.week4.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + lateinit var binding: FragmentHomeBinding + private lateinit var albumRVAdapter: AlbumRVAdapter + private val albumData = ArrayList() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentHomeBinding.inflate(inflater, container, false) + + initDummyData() + + initRecyclerView() + + binding.miniplayerRootLayout.setOnClickListener { + (activity as? MainActivity)?.startActivity(android.content.Intent(activity, SongActivity::class.java)) + } + + return binding.root + } + + private fun initRecyclerView() { + albumRVAdapter = AlbumRVAdapter(albumData) + binding.homeTodayMusicAlbumRv.adapter = albumRVAdapter + binding.homeTodayMusicAlbumRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + albumRVAdapter.setMyItemClickListener(object : AlbumRVAdapter.MyItemClickListener { + override fun onItemClick(album: Album) { + (activity as MainActivity).supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, AlbumFragment()) + .addToBackStack(null) + .commitAllowingStateLoss() + } + + override fun onPlayClick(album: Album) { + album.songs?.let { + if (it.isNotEmpty()) { + val firstSong = it[0] + binding.homePannelPlayingNowTv.text = "${firstSong.title}\n${firstSong.singer}" + } + } + } + }) + } + + private fun initDummyData() { + if(albumData.isEmpty()){ + val songs1 = arrayListOf(Song("LILAC", "아이유 (IU)"), Song("Coin", "아이유 (IU)")) + albumData.add(Album("LILAC", "아이유 (IU)", R.drawable.img_album_exp2, songs1)) + + val songs2 = arrayListOf(Song("Butter", "방탄소년단"), Song("Permission to Dance", "방탄소년단")) + albumData.add(Album("Butter", "방탄소년단", R.drawable.img_album_exp, songs2)) + + val songs3 = arrayListOf(Song("Weekend", "태연 (TAEYEON)"), Song("Fine", "태연 (TAEYEON)")) + albumData.add(Album("Weekend", "태연 (TAEYEON)", R.drawable.img_album_exp2, songs3)) + + val songs4 = arrayListOf(Song("Next Level", "aespa"), Song("Black Mamba", "aespa")) + albumData.add(Album("Next Level", "aespa", R.drawable.img_album_exp, songs4)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/LockerFragment.kt b/app/src/main/java/com/example/week4/LockerFragment.kt new file mode 100644 index 0000000..a27a726 --- /dev/null +++ b/app/src/main/java/com/example/week4/LockerFragment.kt @@ -0,0 +1,43 @@ +package com.example.week4 + +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.week4.Song +import com.example.week4.databinding.FragmentLockerBinding + +class LockerFragment : Fragment() { + lateinit var binding: FragmentLockerBinding + private val savedSongData = ArrayList() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentLockerBinding.inflate(inflater, container, false) + + initDummyData() + + initRecyclerView() + + return binding.root + } + + private fun initRecyclerView(){ + val savedSongRVAdapter = SavedSongRVAdapter(savedSongData) + binding.lockerSavedSongRv.adapter = savedSongRVAdapter + binding.lockerSavedSongRv.layoutManager = LinearLayoutManager(context) + } + + private fun initDummyData(){ + savedSongData.add(Song("Butter", "방탄소년단")) + savedSongData.add(Song("Next Level", "aespa")) + savedSongData.add(Song("Celebrity", "아이유 (IU)")) + savedSongData.add(Song("Weekend", "태연 (TAEYEON)")) + savedSongData.add(Song("LILAC", "아이유 (IU)")) + savedSongData.add(Song("Permission to Dance", "방탄소년단")) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/LookFragment.kt b/app/src/main/java/com/example/week4/LookFragment.kt new file mode 100644 index 0000000..8341670 --- /dev/null +++ b/app/src/main/java/com/example/week4/LookFragment.kt @@ -0,0 +1,21 @@ +package com.example.week4 + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.example.week4.databinding.FragmentLookBinding + +class LookFragment : Fragment() { + lateinit var binding: FragmentLookBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentLookBinding.inflate(inflater, container, false) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/MainActivity.kt b/app/src/main/java/com/example/week4/MainActivity.kt new file mode 100644 index 0000000..af7053c --- /dev/null +++ b/app/src/main/java/com/example/week4/MainActivity.kt @@ -0,0 +1,58 @@ +package com.example.week4 + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.week4.databinding.ActivityMainBinding + +class MainActivity : AppCompatActivity() { + + lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, HomeFragment()) + .commitAllowingStateLoss() + } + + initBottomNavigation() + } + + private fun initBottomNavigation(){ + binding.mainBnv.setOnItemSelectedListener { item -> + when (item.itemId) { + R.id.homeFragment -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, HomeFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + + R.id.lookFragment -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, LookFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + R.id.searchFragment -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, SearchFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + R.id.lockerFragment -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, LockerFragment()) + .commitAllowingStateLoss() + return@setOnItemSelectedListener true + } + } + false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/SavedSongRVAdapter.kt b/app/src/main/java/com/example/week4/SavedSongRVAdapter.kt new file mode 100644 index 0000000..c784845 --- /dev/null +++ b/app/src/main/java/com/example/week4/SavedSongRVAdapter.kt @@ -0,0 +1,38 @@ +package com.example.week4 + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.week4.Song +import com.example.week4.databinding.ItemSavedSongBinding + +class SavedSongRVAdapter(private var songList: ArrayList) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemSavedSongBinding = ItemSavedSongBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(songList[position]) + + holder.binding.itemSavedSongMoreIv.setOnClickListener { + removeSong(holder.bindingAdapterPosition) + } + } + + override fun getItemCount(): Int = songList.size + + private fun removeSong(position: Int) { + songList.removeAt(position) + notifyItemRemoved(position) + } + + inner class ViewHolder(val binding: ItemSavedSongBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(song: Song) { + binding.itemSavedSongTitleTv.text = song.title + binding.itemSavedSongSingerTv.text = song.singer + binding.itemSavedSongCoverIv.setImageResource(R.drawable.img_album_exp) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/SearchFragment.kt b/app/src/main/java/com/example/week4/SearchFragment.kt new file mode 100644 index 0000000..314f341 --- /dev/null +++ b/app/src/main/java/com/example/week4/SearchFragment.kt @@ -0,0 +1,21 @@ +package com.example.week4 + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.example.week4.databinding.FragmentSearchBinding + +class SearchFragment : Fragment() { + lateinit var binding: FragmentSearchBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSearchBinding.inflate(inflater, container, false) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/Song.kt b/app/src/main/java/com/example/week4/Song.kt new file mode 100644 index 0000000..9f2a0e4 --- /dev/null +++ b/app/src/main/java/com/example/week4/Song.kt @@ -0,0 +1,10 @@ +package com.example.week4 + + +data class Song( + var title: String = "", + var singer: String = "", + var albumArt: Int? = null, + var releaseInfo: String = "", + var isPlaying: Boolean = false +) \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/SongActivity.kt b/app/src/main/java/com/example/week4/SongActivity.kt new file mode 100644 index 0000000..587b91b --- /dev/null +++ b/app/src/main/java/com/example/week4/SongActivity.kt @@ -0,0 +1,123 @@ +package com.example.week4 + +import android.media.MediaPlayer +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.View +import android.widget.SeekBar +import androidx.appcompat.app.AppCompatActivity +import com.example.week4.databinding.ActivitySongBinding +import java.util.concurrent.TimeUnit + +class SongActivity : AppCompatActivity() { + + private lateinit var binding: ActivitySongBinding + private var mediaPlayer: MediaPlayer? = null + private val handler = Handler(Looper.getMainLooper()) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySongBinding.inflate(layoutInflater) + setContentView(binding.root) + + mediaPlayer = MediaPlayer.create(this, R.raw.butter) + + binding.songEndTimeTv.text = millisecondsToTimer(mediaPlayer?.duration?.toLong() ?: 0) + binding.songSeekBar.max = mediaPlayer?.duration ?: 0 + + binding.songMiniplayerIv.setOnClickListener { + mediaPlayer?.let { + if (!it.isPlaying) { + it.start() + updateSeekBar() + binding.songMiniplayerIv.visibility = View.GONE + binding.songPauseIv.visibility = View.VISIBLE + } + } + } + + binding.songPauseIv.setOnClickListener { + mediaPlayer?.let { + if (it.isPlaying) { + it.pause() + handler.removeCallbacks(updater) + binding.songMiniplayerIv.visibility = View.VISIBLE + binding.songPauseIv.visibility = View.GONE + } + } + } + + binding.songPreviousIv.setOnClickListener { seekToStart() } + binding.songNextIv.setOnClickListener { seekToStart() } + + binding.songSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (fromUser) { + mediaPlayer?.seekTo(progress) + } + } + override fun onStartTrackingTouch(seekBar: SeekBar?) { + handler.removeCallbacks(updater) + } + override fun onStopTrackingTouch(seekBar: SeekBar?) { + if (mediaPlayer?.isPlaying == true) { + updateSeekBar() + } + } + }) + + mediaPlayer?.setOnCompletionListener { + binding.songMiniplayerIv.visibility = View.VISIBLE + binding.songPauseIv.visibility = View.GONE + binding.songSeekBar.progress = 0 + binding.songStartTimeTv.text = "00:00" + handler.removeCallbacks(updater) + } + + binding.songDownIb.setOnClickListener { + finish() + } + } + + private fun seekToStart() { + mediaPlayer?.seekTo(0) + if (mediaPlayer?.isPlaying == false) { + mediaPlayer?.start() + updateSeekBar() + binding.songMiniplayerIv.visibility = View.GONE + binding.songPauseIv.visibility = View.VISIBLE + } + } + + private val updater = object : Runnable { + override fun run() { + mediaPlayer?.let { + if (it.isPlaying) { + binding.songSeekBar.progress = it.currentPosition + binding.songStartTimeTv.text = millisecondsToTimer(it.currentPosition.toLong()) + + handler.postDelayed(this, 1000) + } + } + } + } + + private fun updateSeekBar() { + handler.post(updater) + } + + private fun millisecondsToTimer(milliseconds: Long): String { + val minutes = TimeUnit.MILLISECONDS.toMinutes(milliseconds) + val seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds) - + TimeUnit.MINUTES.toSeconds(minutes) + return String.format("%02d:%02d", minutes, seconds) + } + + override fun onDestroy() { + super.onDestroy() + mediaPlayer?.release() + mediaPlayer = null + handler.removeCallbacks(updater) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/week4/SplashActivity.kt b/app/src/main/java/com/example/week4/SplashActivity.kt new file mode 100644 index 0000000..0eb6f24 --- /dev/null +++ b/app/src/main/java/com/example/week4/SplashActivity.kt @@ -0,0 +1,24 @@ +package com.example.week4 + +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.appcompat.app.AppCompatActivity +import com.example.week4.databinding.ActivitySplashBinding + +class SplashActivity : AppCompatActivity() { + lateinit var binding: ActivitySplashBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySplashBinding.inflate(layoutInflater) + setContentView(binding.root) + + Handler(Looper.getMainLooper()).postDelayed({ + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + finish() + }, 1500) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_actionbar_instagram.png b/app/src/main/res/drawable/btn_actionbar_instagram.png new file mode 100644 index 0000000..90bc027 Binary files /dev/null and b/app/src/main/res/drawable/btn_actionbar_instagram.png differ diff --git a/app/src/main/res/drawable/btn_arrow_black.png b/app/src/main/res/drawable/btn_arrow_black.png new file mode 100644 index 0000000..cc38ca8 Binary files /dev/null and b/app/src/main/res/drawable/btn_arrow_black.png differ diff --git a/app/src/main/res/drawable/btn_main_arrow_more.png b/app/src/main/res/drawable/btn_main_arrow_more.png new file mode 100644 index 0000000..59e410c Binary files /dev/null and b/app/src/main/res/drawable/btn_main_arrow_more.png differ diff --git a/app/src/main/res/drawable/btn_main_mike.png b/app/src/main/res/drawable/btn_main_mike.png new file mode 100644 index 0000000..9bddec6 Binary files /dev/null and b/app/src/main/res/drawable/btn_main_mike.png differ diff --git a/app/src/main/res/drawable/btn_main_setting.png b/app/src/main/res/drawable/btn_main_setting.png new file mode 100644 index 0000000..7a8d5d6 Binary files /dev/null and b/app/src/main/res/drawable/btn_main_setting.png differ diff --git a/app/src/main/res/drawable/btn_main_ticket.png b/app/src/main/res/drawable/btn_main_ticket.png new file mode 100644 index 0000000..52b6d64 Binary files /dev/null and b/app/src/main/res/drawable/btn_main_ticket.png differ diff --git a/app/src/main/res/drawable/btn_miniplay_mvpause.png b/app/src/main/res/drawable/btn_miniplay_mvpause.png new file mode 100644 index 0000000..470e046 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplay_mvpause.png differ diff --git a/app/src/main/res/drawable/btn_miniplay_pause.png b/app/src/main/res/drawable/btn_miniplay_pause.png new file mode 100644 index 0000000..470e046 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplay_pause.png differ diff --git a/app/src/main/res/drawable/btn_miniplayer_go_list.png b/app/src/main/res/drawable/btn_miniplayer_go_list.png new file mode 100644 index 0000000..1b2d977 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplayer_go_list.png differ diff --git a/app/src/main/res/drawable/btn_miniplayer_next.png b/app/src/main/res/drawable/btn_miniplayer_next.png new file mode 100644 index 0000000..3aedba3 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplayer_next.png differ diff --git a/app/src/main/res/drawable/btn_miniplayer_play.png b/app/src/main/res/drawable/btn_miniplayer_play.png new file mode 100644 index 0000000..f619072 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplayer_play.png differ diff --git a/app/src/main/res/drawable/btn_miniplayer_previous.png b/app/src/main/res/drawable/btn_miniplayer_previous.png new file mode 100644 index 0000000..d0bf1f6 Binary files /dev/null and b/app/src/main/res/drawable/btn_miniplayer_previous.png differ diff --git a/app/src/main/res/drawable/btn_panel_play_large.png b/app/src/main/res/drawable/btn_panel_play_large.png new file mode 100644 index 0000000..4ac7103 Binary files /dev/null and b/app/src/main/res/drawable/btn_panel_play_large.png differ diff --git a/app/src/main/res/drawable/btn_player_eq_off.png b/app/src/main/res/drawable/btn_player_eq_off.png new file mode 100644 index 0000000..f23d9c6 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_eq_off.png differ diff --git a/app/src/main/res/drawable/btn_player_go_list.png b/app/src/main/res/drawable/btn_player_go_list.png new file mode 100644 index 0000000..1b2d977 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_go_list.png differ diff --git a/app/src/main/res/drawable/btn_player_more.png b/app/src/main/res/drawable/btn_player_more.png new file mode 100644 index 0000000..a8ad9e6 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_more.png differ diff --git a/app/src/main/res/drawable/btn_player_related.png b/app/src/main/res/drawable/btn_player_related.png new file mode 100644 index 0000000..9026fe5 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_related.png differ diff --git a/app/src/main/res/drawable/btn_player_setting.png b/app/src/main/res/drawable/btn_player_setting.png new file mode 100644 index 0000000..0df8f69 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_setting.png differ diff --git a/app/src/main/res/drawable/btn_player_unlike_off.png b/app/src/main/res/drawable/btn_player_unlike_off.png new file mode 100644 index 0000000..b539504 Binary files /dev/null and b/app/src/main/res/drawable/btn_player_unlike_off.png differ diff --git a/app/src/main/res/drawable/discovery_banner_aos.jpg b/app/src/main/res/drawable/discovery_banner_aos.jpg new file mode 100644 index 0000000..c905515 Binary files /dev/null and b/app/src/main/res/drawable/discovery_banner_aos.jpg differ diff --git a/app/src/main/res/drawable/ic_bottom_home_no_select.png b/app/src/main/res/drawable/ic_bottom_home_no_select.png new file mode 100644 index 0000000..69a8ab6 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_home_no_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_home_select.png b/app/src/main/res/drawable/ic_bottom_home_select.png new file mode 100644 index 0000000..c0ff48e Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_home_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_locker_no_select.png b/app/src/main/res/drawable/ic_bottom_locker_no_select.png new file mode 100644 index 0000000..a67dec3 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_locker_no_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_locker_select.png b/app/src/main/res/drawable/ic_bottom_locker_select.png new file mode 100644 index 0000000..042489f Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_locker_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_look_no_select.png b/app/src/main/res/drawable/ic_bottom_look_no_select.png new file mode 100644 index 0000000..6c2f4f0 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_look_no_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_look_select.png b/app/src/main/res/drawable/ic_bottom_look_select.png new file mode 100644 index 0000000..3d169e4 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_look_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_search_no_select.png b/app/src/main/res/drawable/ic_bottom_search_no_select.png new file mode 100644 index 0000000..a77b8c5 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_search_no_select.png differ diff --git a/app/src/main/res/drawable/ic_bottom_search_select.png b/app/src/main/res/drawable/ic_bottom_search_select.png new file mode 100644 index 0000000..d5c8a72 Binary files /dev/null and b/app/src/main/res/drawable/ic_bottom_search_select.png differ diff --git a/app/src/main/res/drawable/ic_flo_logo.png b/app/src/main/res/drawable/ic_flo_logo.png new file mode 100644 index 0000000..643224d Binary files /dev/null and b/app/src/main/res/drawable/ic_flo_logo.png differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_main_facebook.png b/app/src/main/res/drawable/ic_main_facebook.png new file mode 100644 index 0000000..83e9732 Binary files /dev/null and b/app/src/main/res/drawable/ic_main_facebook.png differ diff --git a/app/src/main/res/drawable/ic_main_instagram.png b/app/src/main/res/drawable/ic_main_instagram.png new file mode 100644 index 0000000..398ce61 Binary files /dev/null and b/app/src/main/res/drawable/ic_main_instagram.png differ diff --git a/app/src/main/res/drawable/ic_main_twitter.png b/app/src/main/res/drawable/ic_main_twitter.png new file mode 100644 index 0000000..6ddc68e Binary files /dev/null and b/app/src/main/res/drawable/ic_main_twitter.png differ diff --git a/app/src/main/res/drawable/ic_main_youtube.png b/app/src/main/res/drawable/ic_main_youtube.png new file mode 100644 index 0000000..0c4ec93 Binary files /dev/null and b/app/src/main/res/drawable/ic_main_youtube.png differ diff --git a/app/src/main/res/drawable/ic_my_like_off.png b/app/src/main/res/drawable/ic_my_like_off.png new file mode 100644 index 0000000..c06e139 Binary files /dev/null and b/app/src/main/res/drawable/ic_my_like_off.png differ diff --git a/app/src/main/res/drawable/ic_today_music.png b/app/src/main/res/drawable/ic_today_music.png new file mode 100644 index 0000000..714f4ad Binary files /dev/null and b/app/src/main/res/drawable/ic_today_music.png differ diff --git a/app/src/main/res/drawable/img_album_exp.png b/app/src/main/res/drawable/img_album_exp.png new file mode 100644 index 0000000..6e3f38a Binary files /dev/null and b/app/src/main/res/drawable/img_album_exp.png differ diff --git a/app/src/main/res/drawable/img_album_exp2.png b/app/src/main/res/drawable/img_album_exp2.png new file mode 100644 index 0000000..28ea3ee Binary files /dev/null and b/app/src/main/res/drawable/img_album_exp2.png differ diff --git a/app/src/main/res/drawable/img_album_lp.png b/app/src/main/res/drawable/img_album_lp.png new file mode 100644 index 0000000..29fb1b4 Binary files /dev/null and b/app/src/main/res/drawable/img_album_lp.png differ diff --git a/app/src/main/res/drawable/img_first_album_default.png b/app/src/main/res/drawable/img_first_album_default.png new file mode 100644 index 0000000..926d34f Binary files /dev/null and b/app/src/main/res/drawable/img_first_album_default.png differ diff --git a/app/src/main/res/drawable/img_home_viewpager_exp.png b/app/src/main/res/drawable/img_home_viewpager_exp.png new file mode 100644 index 0000000..da78032 Binary files /dev/null and b/app/src/main/res/drawable/img_home_viewpager_exp.png differ diff --git a/app/src/main/res/drawable/img_home_viewpager_exp2.png b/app/src/main/res/drawable/img_home_viewpager_exp2.png new file mode 100644 index 0000000..50fa4be Binary files /dev/null and b/app/src/main/res/drawable/img_home_viewpager_exp2.png differ diff --git a/app/src/main/res/drawable/img_potcast_exp.png b/app/src/main/res/drawable/img_potcast_exp.png new file mode 100644 index 0000000..50a46e0 Binary files /dev/null and b/app/src/main/res/drawable/img_potcast_exp.png differ diff --git a/app/src/main/res/drawable/img_video_exp.png b/app/src/main/res/drawable/img_video_exp.png new file mode 100644 index 0000000..7f6b05f Binary files /dev/null and b/app/src/main/res/drawable/img_video_exp.png differ diff --git a/app/src/main/res/drawable/nugu_btn_down.png b/app/src/main/res/drawable/nugu_btn_down.png new file mode 100644 index 0000000..03a04c5 Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_down.png differ diff --git a/app/src/main/res/drawable/nugu_btn_pause_32.png b/app/src/main/res/drawable/nugu_btn_pause_32.png new file mode 100644 index 0000000..9388aa3 Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_pause_32.png differ diff --git a/app/src/main/res/drawable/nugu_btn_play_32.png b/app/src/main/res/drawable/nugu_btn_play_32.png new file mode 100644 index 0000000..b781e4c Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_play_32.png differ diff --git a/app/src/main/res/drawable/nugu_btn_random_inactive.png b/app/src/main/res/drawable/nugu_btn_random_inactive.png new file mode 100644 index 0000000..fe4f880 Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_random_inactive.png differ diff --git a/app/src/main/res/drawable/nugu_btn_repeat_inactive.png b/app/src/main/res/drawable/nugu_btn_repeat_inactive.png new file mode 100644 index 0000000..1e4044d Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_repeat_inactive.png differ diff --git a/app/src/main/res/drawable/nugu_btn_skip_next_32.png b/app/src/main/res/drawable/nugu_btn_skip_next_32.png new file mode 100644 index 0000000..fc02f28 Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_skip_next_32.png differ diff --git a/app/src/main/res/drawable/nugu_btn_skip_previous_32.png b/app/src/main/res/drawable/nugu_btn_skip_previous_32.png new file mode 100644 index 0000000..03ec854 Binary files /dev/null and b/app/src/main/res/drawable/nugu_btn_skip_previous_32.png differ diff --git a/app/src/main/res/drawable/widget_black_play.png b/app/src/main/res/drawable/widget_black_play.png new file mode 100644 index 0000000..0ec2700 Binary files /dev/null and b/app/src/main/res/drawable/widget_black_play.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..91a6ca1 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_song.xml b/app/src/main/res/layout/activity_song.xml new file mode 100644 index 0000000..508d71c --- /dev/null +++ b/app/src/main/res/layout/activity_song.xml @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..eb6e1c1 --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album.xml b/app/src/main/res/layout/fragment_album.xml new file mode 100644 index 0000000..8f4fe46 --- /dev/null +++ b/app/src/main/res/layout/fragment_album.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..b064ee9 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_locker.xml b/app/src/main/res/layout/fragment_locker.xml new file mode 100644 index 0000000..64b8ca9 --- /dev/null +++ b/app/src/main/res/layout/fragment_locker.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_look.xml b/app/src/main/res/layout/fragment_look.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_look.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_song_activity.xml b/app/src/main/res/layout/fragment_song_activity.xml new file mode 100644 index 0000000..2be8fd8 --- /dev/null +++ b/app/src/main/res/layout/fragment_song_activity.xml @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml new file mode 100644 index 0000000..9ce569b --- /dev/null +++ b/app/src/main/res/layout/item_album.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_saved_song.xml b/app/src/main/res/layout/item_saved_song.xml new file mode 100644 index 0000000..1e37452 --- /dev/null +++ b/app/src/main/res/layout/item_saved_song.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_song.xml b/app/src/main/res/layout/item_song.xml new file mode 100644 index 0000000..b1b081a --- /dev/null +++ b/app/src/main/res/layout/item_song.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..a198054 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/raw/butter.mp3 b/app/src/main/res/raw/butter.mp3 new file mode 100644 index 0000000..6fdbfd9 Binary files /dev/null and b/app/src/main/res/raw/butter.mp3 differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..be4f9a9 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c8524cd --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..ca79f85 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + week4 + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..84c3eef --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + +