diff --git a/firstweek b/firstweek new file mode 100644 index 0000000..ccabfdf --- /dev/null +++ b/firstweek @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/.gitignore b/gdjea_udemy_android_template_bottomnavi/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.gitignore @@ -0,0 +1,15 @@ +*.iml +.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/gdjea_udemy_android_template_bottomnavi/.idea/.gitignore b/gdjea_udemy_android_template_bottomnavi/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/.name b/gdjea_udemy_android_template_bottomnavi/.idea/.name new file mode 100644 index 0000000..997352e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/.name @@ -0,0 +1 @@ +FLO \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/compiler.xml b/gdjea_udemy_android_template_bottomnavi/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/deploymentTargetDropDown.xml b/gdjea_udemy_android_template_bottomnavi/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..83542c4 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/gradle.xml b/gdjea_udemy_android_template_bottomnavi/.idea/gradle.xml new file mode 100644 index 0000000..526b4c2 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/misc.xml b/gdjea_udemy_android_template_bottomnavi/.idea/misc.xml new file mode 100644 index 0000000..a75331f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/misc.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/.idea/vcs.xml b/gdjea_udemy_android_template_bottomnavi/.idea/vcs.xml new file mode 100644 index 0000000..d0fffca --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/README.md b/gdjea_udemy_android_template_bottomnavi/README.md new file mode 100644 index 0000000..1af4f63 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/README.md @@ -0,0 +1,2 @@ +# udemy_android_template_bottomnavi +안드로이드 플로 클론 1주차에 필요한 템플릿입니다. diff --git a/gdjea_udemy_android_template_bottomnavi/app/.gitignore b/gdjea_udemy_android_template_bottomnavi/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/build.gradle b/gdjea_udemy_android_template_bottomnavi/app/build.gradle new file mode 100644 index 0000000..f08480c --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/build.gradle @@ -0,0 +1,68 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-kapt' +} + +android { + compileSdk 31 + + viewBinding { + enabled true + } + + defaultConfig { + applicationId "com.example.flo" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.google.code.gson:gson:2.9.0'//Gson + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + //RoomDB + implementation 'androidx.room:room-ktx:2.4.2' + implementation 'androidx.room:room-runtime:2.4.2' + kapt 'androidx.room:room-compiler:2.4.2' + + //Retrofit + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + implementation "com.squareup.retrofit2:adapter-rxjava2:2.9.0" + + //okHttp + implementation "com.squareup.okhttp3:okhttp:4.9.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.9.0" + + //Glide + implementation 'com.github.bumptech.glide:glide:4.11.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/proguard-rules.pro b/gdjea_udemy_android_template_bottomnavi/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/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/gdjea_udemy_android_template_bottomnavi/app/src/androidTest/java/com/example/flo/ExampleInstrumentedTest.kt b/gdjea_udemy_android_template_bottomnavi/app/src/androidTest/java/com/example/flo/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..6dfac89 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/androidTest/java/com/example/flo/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.flo + +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.flo", appContext.packageName) + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/AndroidManifest.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bdd4304 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumDao.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumDao.kt new file mode 100644 index 0000000..153bfe4 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumDao.kt @@ -0,0 +1,29 @@ +package com.example.flo + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.example.flo.data.entities.Album +import com.example.flo.data.entities.Like + +@Dao +interface AlbumDao { + + @Insert + fun insert(album: Album) + + @Query("SELECT * FROM AlbumTable") //테이블의 모든 값을 가져옴 + fun getAlbums(): List + + @Insert + fun likeAlbum(like: Like) + + @Query("SELECT id FROM LikeTable WHERE userId = :userId AND albumId = :albumId") + fun isLikedAlbum(userId: Int, albumId: Int): Int? + + @Query("DELETE FROM LikeTable WHERE userId = :userId AND albumId = :albumId") + fun disLikeAlbum(userId: Int, albumId: Int) + + @Query("SELECT AT.* FROM LikeTable as LT LEFT JOIN AlbumTable as AT ON LT.albumId = AT.id WHERE LT.userId = :userId") + fun getLikedAlbums(userId: Int): List +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumFragment.kt new file mode 100644 index 0000000..1da1637 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumFragment.kt @@ -0,0 +1,108 @@ +package com.example.flo + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import com.example.flo.data.entities.Album +import com.example.flo.data.entities.Like +import com.example.flo.databinding.FragmentAlbumBinding +import com.google.android.material.tabs.TabLayoutMediator +import com.google.gson.Gson + +class AlbumFragment : Fragment() { + + lateinit var binding : FragmentAlbumBinding + private var gson: Gson = Gson() + + private val information = arrayListOf("수록곡", "상세정보", "영상") + + private var isLiked: Boolean = false + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentAlbumBinding.inflate(inflater, container, false) + + //Home에서 데이터 받아옴 + val albumJson = arguments?.getString("album") + val album = gson.fromJson(albumJson, Album::class.java) + + //Home에서 받아온 데이터 반영 + isLiked = isLikedAlbum(album.id) + setInit(album) + setOnClickListeners(album) + + 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, position -> + tab.text = information[position] + }.attach() + + return binding.root + } + + private fun setInit(album: Album){ + binding.albumAlbumIv.setImageResource(album.coverImg!!) + binding.albumMusicTitleTv.text = album.title.toString() + binding.albumSingerNameTv.text = album.singer.toString() + + if (isLiked){ + binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_on) + } + else { + binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_off) + } + } + + private fun getJwt(): Int { + val spf = activity?.getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE) + return spf!!.getInt("jwt", 0) + } + + private fun likeAlbum(userId: Int, albumId: Int){ + val songDB = SongDatabase.getInstance(requireContext())!! + val like = Like(userId, albumId) + + songDB.albumDao().likeAlbum(like) + } + + private fun isLikedAlbum(albumId: Int): Boolean { + val songDB = SongDatabase.getInstance(requireContext())!! + val userId = getJwt() + + val likeId: Int? = songDB.albumDao().isLikedAlbum(userId, albumId) + + return likeId != null + } + + private fun disLikeAlbum(albumId: Int) { + val songDB = SongDatabase.getInstance(requireContext())!! + val userId = getJwt() + + songDB.albumDao().disLikeAlbum(userId, albumId) + } + + private fun setOnClickListeners(album: Album) { + val userId = getJwt() + binding.albumLikeIv.setOnClickListener { + if (isLiked){ + binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_off) + disLikeAlbum(album.id) + } + else { + binding.albumLikeIv.setImageResource(R.drawable.ic_my_like_on) + likeAlbum(userId, album.id) + } + } + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumLockerRVAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumLockerRVAdapter.kt new file mode 100644 index 0000000..22cc9b9 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumLockerRVAdapter.kt @@ -0,0 +1,60 @@ +package com.example.flo + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.flo.data.entities.Album +import com.example.flo.databinding.ItemLockerAlbumBinding + +class AlbumLockerRVAdapter (): RecyclerView.Adapter() { + private val albums = ArrayList() + + interface MyItemClickListener{ + fun onRemoveSong(songId: Int) + } + + private lateinit var mItemClickListener: MyItemClickListener + + fun setMyItemClickListener(itemClickListener: MyItemClickListener){ + mItemClickListener = itemClickListener + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): AlbumLockerRVAdapter.ViewHolder { + val binding: ItemLockerAlbumBinding = ItemLockerAlbumBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: AlbumLockerRVAdapter.ViewHolder, position: Int) { + holder.bind(albums[position]) + holder.binding.itemAlbumMoreIv.setOnClickListener { + mItemClickListener.onRemoveSong(albums[position].id) + removeSong(position) + } + } + + override fun getItemCount(): Int = albums.size + + @SuppressLint("NotifyDataSetChanged") + fun addAlbums(albums: ArrayList) { + this.albums.clear() + this.albums.addAll(albums) + + notifyDataSetChanged() + } + + fun removeSong(position: Int){ + albums.removeAt(position) + notifyDataSetChanged() + } + + inner class ViewHolder(val binding: ItemLockerAlbumBinding) : RecyclerView.ViewHolder(binding.root){ + fun bind(album: Album){ + binding.itemAlbumImgIv.setImageResource(album.coverImg!!) + binding.itemAlbumTitleTv.text = album.title + binding.itemAlbumSingerTv.text = album.singer + } + } + +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumRVAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumRVAdapter.kt new file mode 100644 index 0000000..f09e2c7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumRVAdapter.kt @@ -0,0 +1,54 @@ +package com.example.flo + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.flo.data.entities.Album +import com.example.flo.databinding.ItemAlbumBinding + +class AlbumRVAdapter(private val albumList: ArrayList): RecyclerView.Adapter() { + + interface MyItemClickListener{ + fun onItemClick(album: Album) + } + + private lateinit var mItemClickListener: MyItemClickListener + fun setMyItemClickListener(itemClickListener: MyItemClickListener){ + mItemClickListener = itemClickListener + } + +// fun addItem(album: Album){ +// albumList.add(album) +// notifyDataSetChanged() +// } +// +// fun removeItem(position: Int){ +// albumList.removeAt(position) +// notifyDataSetChanged() +// } + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): AlbumRVAdapter.ViewHolder { + val binding: ItemAlbumBinding = ItemAlbumBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: AlbumRVAdapter.ViewHolder, position: Int) { + holder.bind(albumList[position]) + + //클릭이벤트 처리 + holder.bind(albumList[position]) + holder.itemView.setOnClickListener{mItemClickListener.onItemClick(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.itemAlbumCoverImgIv.setImageResource(album.coverImg!!) + } + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumVPAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumVPAdapter.kt new file mode 100644 index 0000000..9776928 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/AlbumVPAdapter.kt @@ -0,0 +1,18 @@ +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() + } + } + + +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerFragment.kt new file mode 100644 index 0000000..f5ad28d --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerFragment.kt @@ -0,0 +1,25 @@ +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 + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerVPAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerVPAdapter.kt new file mode 100644 index 0000000..bd1ddb5 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/BannerVPAdapter.kt @@ -0,0 +1,18 @@ +package com.example.flo + +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter + +class BannerVPAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + + private val fragmentlist : ArrayList = ArrayList() //여러가지 프레그먼트들을 담아둘 공간 생성 + + override fun getItemCount(): Int = fragmentlist.size //몇 개를 가져올 것이냐, fragmentlist의 size만큼 가져오겠다 + + override fun createFragment(position: Int): Fragment = fragmentlist[position] + + fun addFragment(fragment: Fragment) { //처음에 비어있을 fragmentlist에 HomeFrgment에서 프레그먼트를 추가하기 위함 + fragmentlist.add(fragment) + notifyItemInserted(fragmentlist.size - 1) //list안에 새로운 값이 추가되었을 때 뷰페이저에 이를 알림, 새로운 값이 추가되는 곳은 가장 끝이기 때문. 새로 추가된 것들도 같이 보여줘라 + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/DetailFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/DetailFragment.kt new file mode 100644 index 0000000..9aaebd5 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/DetailFragment.kt @@ -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 + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/HomeFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/HomeFragment.kt new file mode 100644 index 0000000..aa6acf4 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/HomeFragment.kt @@ -0,0 +1,73 @@ +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 androidx.recyclerview.widget.LinearLayoutManager +import androidx.viewpager2.widget.ViewPager2 +import com.example.flo.data.entities.Album +import com.example.flo.databinding.FragmentHomeBinding +import com.google.gson.Gson + +class HomeFragment : Fragment() { + + lateinit var binding: FragmentHomeBinding + private var albumDatas = ArrayList() + + private lateinit var songDB: SongDatabase + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentHomeBinding.inflate(inflater, container, false) + +// binding.homeTodayMusic01AlbumIv.setOnClickListener { +// (context as MainActivity).supportFragmentManager.beginTransaction().replace(R.id.main_frm,AlbumFragment()).commitAllowingStateLoss() +// } + +// 데이터 리스트 생성 더미 데이터 +// albumDatas.apply { +// add(Album("Butter", "방탄소년단(BTS)", R.drawable.img_album_exp)) +// add(Album("LILAC", "아이유(IU)", R.drawable.img_album_exp2)) +// add(Album("Next Level", "에스파(aespa)", R.drawable.img_album_exp3)) +// add(Album("작은 것들을 위한 시 (Boy With Love) (Feat. Halsey)", "방탄소년단(BTS)", R.drawable.img_album_exp4)) +// add(Album("뿜뿜", "모모랜드(MOMOLAND)", R.drawable.img_album_exp5)) +// add(Album("Weekend", "태연", R.drawable.img_album_exp6)) +// } + songDB = SongDatabase.getInstance(requireContext())!! + albumDatas.addAll(songDB.albumDao().getAlbums()) + + val albumRVAdapter = AlbumRVAdapter(albumDatas) + binding.homeTodayMusicRv.adapter = albumRVAdapter + binding.homeTodayMusicRv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + albumRVAdapter.setMyItemClickListener(object: AlbumRVAdapter.MyItemClickListener{ + override fun onItemClick(album: Album) { + changeAlbumFragment(album) + } + + private fun changeAlbumFragment(album: Album) { + (context as MainActivity).supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, AlbumFragment().apply { + arguments = Bundle().apply { + val gson = Gson() + val albumJson = gson.toJson(album) + putString("album", albumJson) + } + }).commitAllowingStateLoss() + } + }) + + 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 + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerFragment.kt new file mode 100644 index 0000000..ad8d82f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerFragment.kt @@ -0,0 +1,81 @@ +package com.example.flo + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import com.example.flo.databinding.FragmentLockerBinding +import com.google.android.material.tabs.TabLayoutMediator +import kotlin.math.log10 + +class LockerFragment : Fragment() { + + lateinit var binding: FragmentLockerBinding + private val information = arrayListOf("저장한 곡", "음악파일", "저장앨범") + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentLockerBinding.inflate(inflater, container, false) + + val lockerAdapter = LockerVPAdapter(this) + binding.lockerContentVp.adapter = lockerAdapter + TabLayoutMediator(binding.lockerContentTb, binding.lockerContentVp){ + tab, position -> + tab.text = information[position] + }.attach() + + binding.lockerLoginTv.setOnClickListener { + startActivity(Intent(activity, LoginActivity::class.java)) + } + +// val songDB = SongDatabase.getInstance(requireContext())!! +// val userId = getJwt() +// val likedAlbums = songDB.albumDao().getLikedAlbums(userId) +// +// Log.d("LOKERFRAG/GET_ALBUMS", likedAlbums.toString()) + + return binding.root + } + + override fun onStart() { + super.onStart() + initView() + } + + private fun getJwt(): Int { + val spf = activity?.getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE) + return spf!!.getInt("jwt", 0) + } + + private fun initView() { + val jwt: Int = getJwt() + if (jwt == 0) { + binding.lockerLoginTv.text = "로그인" + binding.lockerLoginTv.setOnClickListener { + startActivity(Intent(activity, LoginActivity::class.java)) + } + } + else { + binding.lockerLoginTv.text = "로그아웃" + binding.lockerLoginTv.setOnClickListener { + //로그아웃 진행 + logout() + startActivity(Intent(activity, MainActivity::class.java)) + } + } + } + + private fun logout(){ + val spf = activity?.getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE) + val editor = spf!!.edit() + editor.remove("jwt") + editor.apply() + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerVPAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerVPAdapter.kt new file mode 100644 index 0000000..e2373e4 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LockerVPAdapter.kt @@ -0,0 +1,17 @@ +package com.example.flo + +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.example.flo.databinding.FragmentLockerMusicfileBinding + +class LockerVPAdapter (fragment : Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = 2 + + override fun createFragment(position: Int): Fragment { + return when(position){ + 0 -> SavedSongFragment() + 1 -> MusicFileFragment() + else -> SavedAlbumFragment() + } + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginActivity.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginActivity.kt new file mode 100644 index 0000000..d7cbda2 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginActivity.kt @@ -0,0 +1,91 @@ +package com.example.flo + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.example.flo.data.entities.User +import com.example.flo.data.remote.AuthService +import com.example.flo.data.remote.Result +import com.example.flo.databinding.ActivityLoginBinding + +class LoginActivity : AppCompatActivity(), LoginView { + + lateinit var binding: ActivityLoginBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityLoginBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.loginSignUpTv.setOnClickListener{ + startActivity(Intent(this, SignupActivity::class.java)) + } + + binding.loginSignInBtn.setOnClickListener { + login() + } + } + private fun login() { + if (binding.loginIdEt.text.toString().isEmpty() || binding.loginDirectInputEt.text.toString().isEmpty()) { + Toast.makeText(this, "이메일을 입력해주세요.", Toast.LENGTH_SHORT).show() + return + } + if (binding.loginPasswordEt.text.toString().isEmpty()) { + Toast.makeText(this, "비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show() + return + } + + val email: String = binding.loginIdEt.text.toString() + "@" + binding.loginDirectInputEt.text.toString() + val password: String = binding.loginPasswordEt.text.toString() + +// val songDB = SongDatabase.getInstance(this)!! +// val user = songDB.userDao().getUser(email, password) +// +// user?.let { +// Log.d("LOGIN_ACT/GET_USER", "userID: ${user.id}, $user") +//// saveJwt(user.id) +// startMainActivity() +// } + + val authService = AuthService() + authService.setLoginView(this) + + authService.login(User(email, password, "")) + + } + +// private fun saveJwt(jwt: Int){ +// val spf = getSharedPreferences("auth", MODE_PRIVATE) +// val editor = spf.edit() +// +// editor.putInt("jwt", jwt) +// editor.apply() +// } + + private fun saveJwt2(jwt: String){ + val spf = getSharedPreferences("auth2", MODE_PRIVATE) + val editor = spf.edit() + + editor.putString("jwt", jwt) + editor.apply() + } + + private fun startMainActivity() { + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + } + + override fun onLoginSuccess(code: Int, result: Result) { + when(code){ + 1000 -> { + saveJwt2(result.jwt) + startMainActivity() + } + } + } + + override fun onLoginFailure() { + Toast.makeText(this, "회원 정보가 존재하지 않습니다.", Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginView.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginView.kt new file mode 100644 index 0000000..59a3a6a --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LoginView.kt @@ -0,0 +1,8 @@ +package com.example.flo + +import com.example.flo.data.remote.Result + +interface LoginView { + fun onLoginSuccess(code: Int, result: Result) + fun onLoginFailure() +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookFragment.kt new file mode 100644 index 0000000..d8bcd6d --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookFragment.kt @@ -0,0 +1,57 @@ +package com.example.flo + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.example.flo.databinding.FragmentLookBinding + +class LookFragment : Fragment(), LookView { + + lateinit var binding: FragmentLookBinding + private lateinit var floCharAdapter: SongRVAdapter + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentLookBinding.inflate(inflater, container, false) + + return binding.root + } + + + override fun onStart() { + super.onStart() + getSongs() + } + + private fun initRecyclerView(result: FloChartResult) { + floCharAdapter = SongRVAdapter(requireContext(), result) + binding.lookFloChartRv.adapter = floCharAdapter + } + + private fun getSongs() { + val songService = SongService() + songService.setLookView(this) + songService.getSongs() + + } + + override fun onGetSongLoading() { + binding.lookLoadingPb.visibility = View.VISIBLE + } + + override fun onGetSongSuccess(code: Int, result: FloChartResult) { + binding.lookLoadingPb.visibility = View.GONE + initRecyclerView(result) + } + + override fun onGetSongFailure(code: Int, message: String) { + binding.lookLoadingPb.visibility = View.GONE + Log.d("LOOK-FRAG/SONG-RESPONSE", message) + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookView.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookView.kt new file mode 100644 index 0000000..6e75cfc --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/LookView.kt @@ -0,0 +1,7 @@ +package com.example.flo + +interface LookView { + fun onGetSongLoading() + fun onGetSongSuccess(code: Int, result: FloChartResult) + fun onGetSongFailure(code: Int, message: String) +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MainActivity.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MainActivity.kt new file mode 100644 index 0000000..ca72cbb --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MainActivity.kt @@ -0,0 +1,261 @@ +package com.example.flo + + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import com.example.flo.data.entities.Album +import com.example.flo.data.entities.Song +import com.example.flo.databinding.ActivityMainBinding +import com.google.gson.Gson + + +class MainActivity : AppCompatActivity() { + + lateinit var binding: ActivityMainBinding + + private var song: Song = Song() + private var gson: Gson = Gson() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setTheme(R.style.Theme_FLO) + + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + inputDummySongs() + inputDummyAlbums() + initBottomNavigation() + +// val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString(), 0, 60, false, "lilac_iu") + + 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) +// intent.putExtra("music", song.music) +// startActivity(intent) + + val editor = getSharedPreferences("song", MODE_PRIVATE).edit() + editor.putInt("songId", song.id) + editor.apply() + + val intent = Intent(this, SongActivity::class.java) + startActivity(intent) + + } + + Log.d("MAIN/JWT_TO_SERVER", getJwt().toString()) + + } + + private fun getJwt(): String? { + val spf = this.getSharedPreferences("auth2", AppCompatActivity.MODE_PRIVATE) + + return spf!!.getString("jwt", "") + } + + override fun onStart() { + super.onStart() +// val sharedPreferences = getSharedPreferences("song", MODE_PRIVATE) +// val songJson = sharedPreferences.getString("songData", null) +// +// song = if(songJson == null){ +// Song("라일락", "아이유(IU)", 0, 60,false, "liiac_iu") +// } else { +// gson.fromJson(songJson, Song::class.java) +// } + + val spf = getSharedPreferences("song", MODE_PRIVATE) + val songId = spf.getInt("songId", 0) + + val songDB = SongDatabase.getInstance(this)!! + + song = if (songId == 0) { + songDB.songDao().getSong(1) + } else { + songDB.songDao().getSong(songId) + } + + Log.d("song ID", song.id.toString()) + + setMiniPlayer(song) + } + + private fun initBottomNavigation() { + + supportFragmentManager.beginTransaction() + .replace(R.id.main_frm, HomeFragment()) + .commitAllowingStateLoss() + + 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 + } + } + + private fun setMiniPlayer(song: Song) { + binding.mainMiniplayerTitleTv.text = song.title + binding.mainMiniplayerSingerTv.text = song.singer + binding.mainMiniplayerProgressSb.progress = (song.second * 100000) / song.playTime + } + + private fun inputDummySongs() { + val songDB = SongDatabase.getInstance(this)!! + val songs = songDB.songDao().getSongs() + + if (songs.isNotEmpty()) return + + songDB.songDao().insert( + Song( + "Lilac", + "아이유 (IU)", + 0, + 200, + false, + "lilac_iu", + R.drawable.img_album_exp2, + false, + ) + ) + + songDB.songDao().insert( + Song( + "Flu", + "아이유 (IU)", + 0, + 200, + false, + "flu_iu", + R.drawable.img_album_exp2, + false, + ) + ) + + songDB.songDao().insert( + Song( + "Butter", + "방탄소년단 (BTS)", + 0, + 190, + false, + "butter_bts", + R.drawable.img_album_exp, + false, + ) + ) + + songDB.songDao().insert( + Song( + "Next Level", + "에스파 (AESPA)", + 0, + 210, + false, + "nextlevel_aespa", + R.drawable.img_album_exp3, + false, + ) + ) + + + songDB.songDao().insert( + Song( + "BBoom BBoom", + "모모랜드 (MOMOLAND)", + 0, + 240, + false, + "bboom_momoland", + R.drawable.img_album_exp5, + false, + ) + ) + + val _songs = songDB.songDao().getSongs() + Log.d("DB data", _songs.toString()) + } + + private fun inputDummyAlbums() { + val songDB = SongDatabase.getInstance(this)!! + val albums = songDB.songDao().getSongs() + + if (albums.isNotEmpty()) return + + songDB.albumDao().insert( + Album( + 0, + "IU 5th Album 'LILAC'", "아이유 (IU)", R.drawable.img_album_exp2 + ) + ) + + songDB.albumDao().insert( + Album( + 1, + "Butter", "방탄소년단 (BTS)", R.drawable.img_album_exp + ) + ) + + songDB.albumDao().insert( + Album( + 2, + "iScreaM Vol.10 : Next Level Remixes", "에스파 (AESPA)", R.drawable.img_album_exp3 + ) + ) + + songDB.albumDao().insert( + Album( + 3, + "MAP OF THE SOUL : PERSONA", "방탄소년단 (BTS)", R.drawable.img_album_exp4 + ) + ) + + songDB.albumDao().insert( + Album( + 4, + "GREAT!", "모모랜드 (MOMOLAND)", R.drawable.img_album_exp5 + ) + ) + + val _albums = songDB.albumDao().getAlbums() + Log.d("DB data", _albums.toString()) + } +} + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MusicFileFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MusicFileFragment.kt new file mode 100644 index 0000000..58c021f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/MusicFileFragment.kt @@ -0,0 +1,20 @@ +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.FragmentLockerMusicfileBinding +import com.example.flo.databinding.FragmentVideoBinding + +class MusicFileFragment: Fragment() { + + lateinit var binding: FragmentLockerMusicfileBinding + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + binding = FragmentLockerMusicfileBinding.inflate(inflater, container, false) + + return binding.root + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/NetworkModule.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/NetworkModule.kt new file mode 100644 index 0000000..4d39a13 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/NetworkModule.kt @@ -0,0 +1,13 @@ +package com.example.flo + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +const val BASE_URL = "https://edu-api-test.softsquared.com" + +fun getRetrofit(): Retrofit{ + val retrofit = Retrofit.Builder().baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()).build() + + return retrofit +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedAlbumFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedAlbumFragment.kt new file mode 100644 index 0000000..cd99312 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedAlbumFragment.kt @@ -0,0 +1,60 @@ +package com.example.flo + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.example.flo.databinding.FragmentLockerSavedalbumBinding + +class SavedAlbumFragment : Fragment() { + lateinit var binding: FragmentLockerSavedalbumBinding + lateinit var albumDB: SongDatabase + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentLockerSavedalbumBinding.inflate(inflater, container, false) + + albumDB = SongDatabase.getInstance(requireContext())!! + + return binding.root + } + + override fun onStart() { + super.onStart() + initRecyclerview() + } + + private fun initRecyclerview() { + binding.lockerSavedSongRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + + val albumRVAdapter = AlbumLockerRVAdapter() + //리스너 객체 생성 및 전달 + + albumRVAdapter.setMyItemClickListener(object : AlbumLockerRVAdapter.MyItemClickListener { + override fun onRemoveSong(songId: Int) { + albumDB.albumDao().getLikedAlbums(getJwt()) + } + }) + + binding.lockerSavedSongRecyclerView.adapter = albumRVAdapter + + albumRVAdapter.addAlbums(albumDB.albumDao().getLikedAlbums(getJwt()) as ArrayList) + + } + + private fun getJwt() : Int { + val spf = activity?.getSharedPreferences("auth" , AppCompatActivity.MODE_PRIVATE) + val jwt = spf!!.getInt("jwt", 0) + Log.d("MAIN_ACT/GET_JWT", "jwt_token: $jwt") + + return jwt + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongFragment.kt new file mode 100644 index 0000000..c02e1f5 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongFragment.kt @@ -0,0 +1,48 @@ +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 androidx.recyclerview.widget.LinearLayoutManager +import com.example.flo.data.entities.Song +import com.example.flo.databinding.FragmentLockerSavedsongBinding + +class SavedSongFragment : Fragment() { + lateinit var binding: FragmentLockerSavedsongBinding + lateinit var songDB: SongDatabase + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentLockerSavedsongBinding.inflate(inflater, container, false) + + songDB = SongDatabase.getInstance(requireContext())!! + + return binding.root + } + + override fun onStart() { + super.onStart() + initRecyclerview() + } + + private fun initRecyclerview(){ + binding.lockerSavedSongRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + + val songRVAdapter = SavedSongRVAdapter() + + songRVAdapter.setMyItemClickListener(object : SavedSongRVAdapter.MyItemClickListener{ + override fun onRemoveSong(songId: Int) { + songDB.songDao().updateIsLikeById(false,songId) + } + }) + + binding.lockerSavedSongRecyclerView.adapter = songRVAdapter + + songRVAdapter.addSongs(songDB.songDao().getLikedSongs(true) as ArrayList) + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongRVAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongRVAdapter.kt new file mode 100644 index 0000000..c7e0e41 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SavedSongRVAdapter.kt @@ -0,0 +1,61 @@ +package com.example.flo + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.flo.data.entities.Song +import com.example.flo.databinding.ItemSongBinding + +class SavedSongRVAdapter() : + RecyclerView.Adapter() { + private val songs = ArrayList() + + interface MyItemClickListener{ + fun onRemoveSong(songId: Int) + } + private lateinit var mItemClickListener : MyItemClickListener + + fun setMyItemClickListener(itemClickListener: MyItemClickListener){ + mItemClickListener = itemClickListener + } + + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): SavedSongRVAdapter.ViewHolder { + val binding: ItemSongBinding = ItemSongBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: SavedSongRVAdapter.ViewHolder, position: Int) { + holder.bind(songs[position]) + holder.binding.itemSongMoreIv.setOnClickListener { + mItemClickListener.onRemoveSong(songs[position].id) + removeSong(position) + } + } + + override fun getItemCount(): Int = songs.size + + @SuppressLint("NotifyDataSetChanged") + fun addSongs(songs: ArrayList) { + this.songs.clear() + this.songs.addAll(songs) + + notifyDataSetChanged() + } + + @SuppressLint("NotifyDataSetChanged") + private fun removeSong(position: Int){ + songs.removeAt(position) + notifyDataSetChanged() + } + + inner class ViewHolder(val binding: ItemSongBinding) : RecyclerView.ViewHolder(binding.root){ + fun bind(song: Song){ + binding.itemSongImgIv.setImageResource(song.coverImg!!) + binding.itemSongTitleTv.text = song.title + binding.itemSongSingerTv.text = song.singer + } + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SearchFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SearchFragment.kt new file mode 100644 index 0000000..71d1bc8 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SearchFragment.kt @@ -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.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/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignUpView.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignUpView.kt new file mode 100644 index 0000000..35dac1e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignUpView.kt @@ -0,0 +1,6 @@ +package com.example.flo + +interface SignUpView { + fun onSignUpSuccess() + fun onSignUpFailure() +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignupActivity.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignupActivity.kt new file mode 100644 index 0000000..c8e8e2d --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SignupActivity.kt @@ -0,0 +1,98 @@ +package com.example.flo + +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.example.flo.data.entities.User +import com.example.flo.data.remote.AuthService +import com.example.flo.databinding.ActivitySignupBinding + +class SignupActivity: AppCompatActivity(), SignUpView { + + lateinit var binding: ActivitySignupBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySignupBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.signUpSignUpBtn.setOnClickListener{ + signUp() +// finish() + } + } + + private fun getUser(): User { + val email: String = binding.signUpIdEt.text.toString() + "@" + binding.signUpDirectInputEt.text.toString() + val password: String = binding.signUpPasswordEt.text.toString() + var name: String = binding.signUpNameEt.text.toString() + + return User(email, password, name) + } + +// private fun signUp() { +// if (binding.signUpIdEt.text.toString().isEmpty() || binding.signUpDirectInputEt.text.toString().isEmpty()) { +// Toast.makeText(this, "이메일 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show() +// return +// } +// if (binding.signUpPasswordEt.text.toString() != binding.signUpPasswordCheckEt.text.toString()) { +// Toast.makeText(this, "비밀번호가 일치하지 않습니다.", Toast.LENGTH_SHORT).show() +// return +// } +// +// val userDB = SongDatabase.getInstance(this)!! +// userDB.userDao().insert(getUser()) +// +// val user = userDB.userDao().getUsers() +// Log.d("SIGNUP EVENT", user.toString()) +// } + + private fun signUp() { + if (binding.signUpIdEt.text.toString().isEmpty() || binding.signUpDirectInputEt.text.toString().isEmpty()) { + Toast.makeText(this, "이메일 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show() + return + } + + if (binding.signUpNameEt.text.toString().isEmpty()) { + Toast.makeText(this, "이름 형식이 잘못었습니다.", Toast.LENGTH_SHORT).show() + return + } + + if (binding.signUpPasswordEt.text.toString() != binding.signUpPasswordCheckEt.text.toString()) { + Toast.makeText(this, "비밀번호가 일치하지 않습니다.", Toast.LENGTH_SHORT).show() + return + } + +// val authService = getRetrofit().create(AuthRetrofitInterface::class.java) +// authService.signUp(getUser()).enqueue(object: Callback{ +// override fun onResponse(call: Call, response: Response) { +// Log.d("Signup/SUCCESS", response.toString()) +// val resp: AuthResponse = response.body()!! +// when(resp.code){ +// 1000 -> finish() +// 2016, 2018 -> { +// binding.signUpEmailErrorTv.visibility = View.VISIBLE +// binding.signUpEmailErrorTv.text = resp.message +// } +// } +// } +// override fun onFailure(call: Call, t: Throwable) { +// Log.d("Signup/FAILURE", t.message.toString()) +// } +// }) +// Log.d("SignUp", "HELLO") + + val authService = AuthService() + authService.setSignUpView(this) + + authService.signUp(getUser()) + } + + override fun onSignUpSuccess() { + finish() + } + + override fun onSignUpFailure() { + + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongActivity.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongActivity.kt new file mode 100644 index 0000000..40dd883 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongActivity.kt @@ -0,0 +1,245 @@ +package com.example.flo + +import android.media.MediaPlayer +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.example.flo.data.entities.Song +import com.example.flo.databinding.ActivitySongBinding +import com.google.gson.Gson + +class SongActivity : AppCompatActivity() { + + lateinit var binding: ActivitySongBinding +// lateinit var song : Song + lateinit var timer: Timer + private var mediaPlayer: MediaPlayer? = null + private var gson: Gson = Gson() + + val songs = arrayListOf() + lateinit var songDB: SongDatabase + var nowPos = 0 + + var isPlaying = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySongBinding.inflate(layoutInflater) + setContentView(binding.root) + + initPlayList() + initSong() +// setPlayer(song) + initClickListener() + } + + //사용자 포커스를 잃었을 때 음악 중지 + override fun onPause() { + super.onPause() + isPlaying = false + setPlayerStatus() + +// song.second = ((binding.songProgressSb.progress * song.playTime)/100)/1000 + songs[nowPos].second = ((binding.songProgressSb.progress * songs[nowPos].playTime)/100)/1000 + val sharedPreferences = getSharedPreferences("song", MODE_PRIVATE) + val editor = sharedPreferences.edit() //에디터 +// val songJson = gson.toJson(song) +// editor.putString("songData", songJson) + editor.putInt("songId", songs[nowPos].id) + + editor.apply() + } + + override fun onDestroy() { + super.onDestroy() + timer.interrupt() + mediaPlayer?.release() //미디어플레이어가 갖고 있던 리소스 해제 + mediaPlayer = null //미디어플레이어 해제 + } + + private fun initPlayList(){ + songDB = SongDatabase.getInstance(this)!! + songs.addAll(songDB.songDao().getSongs()) + } + + private fun initClickListener(){ + binding.songDownIb.setOnClickListener { + finish() + } + + binding.songMiniplayerIv.setOnClickListener { + setPlayerStatus() + } + + binding.songNextIv.setOnClickListener { + moveSong(+1) + } + + binding.songPreviousIv.setOnClickListener { + moveSong(-1) + } + + binding.songLikeIv.setOnClickListener { + setLike(songs[nowPos].isLike) + } + } + + 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), +// intent.getStringExtra("music")!! +// ) +// } + val spf = getSharedPreferences("song", MODE_PRIVATE) + val songId = spf.getInt("songId", 0) + + nowPos = getPlayingSongPosition(songId) + + Log.d("now Song ID", songs[nowPos].id.toString()) + + startTimer() + setPlayer(songs[nowPos]) + } + + + private fun getPlayingSongPosition(songId: Int): Int{ + for (i in 0 until songs.size){ + if (songs[i].id == songId){ + return i + } + } + return 0 + } + + + private fun setLike(isLike: Boolean){ + songs[nowPos].isLike = !isLike + songDB.songDao().updateIsLikeById(!isLike,songs[nowPos].id) + + if (!isLike){ + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_on) + } + else{ + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_off) + } + + } + + private fun moveSong(direct: Int){ + if (nowPos + direct < 0){ + Toast.makeText(this, "first song!", Toast.LENGTH_SHORT).show() + return + } + if (nowPos + direct >= songs.size){ + Toast.makeText(this, "last song!", Toast.LENGTH_SHORT).show() + return + } + + nowPos += direct + + timer.interrupt() + startTimer() + + mediaPlayer?.release() //미디어플레이어가 갖고 있던 리소스 해제 + mediaPlayer = null //미디어플레이어 해제 + + setPlayer(songs[nowPos]) + } + + private fun setPlayer(song : Song){ +// binding.songMusicTitleTv.text = intent.getStringExtra("title")!! +// binding.songMusicSingerTv.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.songProgressSb.progress = (song.second * 1000 / song.playTime) +// val music = resources.getIdentifier(song.music, "raw", this.packageName) +// mediaPlayer = MediaPlayer.create(this, music) + binding.songMusicTitleTv.text = song.title + binding.songMusicSingerTv.text = song.singer + binding.songStartTimeTv.text = String.format("%02d:%02d",song.second / 60, song.second % 60) + binding.songEndTimeTv.text = String.format("%02d:%02d",song.playTime / 60, song.playTime % 60) + binding.songAlbumIv.setImageResource(song.coverImg!!) + binding.songProgressSb.progress = (song.second * 1000 / song.playTime) + + val music = resources.getIdentifier(song.music, "raw", this.packageName) + mediaPlayer = MediaPlayer.create(this, music) + + if (song.isLike){ + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_on) + } + else { + binding.songLikeIv.setImageResource(R.drawable.ic_my_like_off) + } + + setPlayerStatus() + } + + private fun setPlayerStatus(){ + +// song.isPlaying = isPlaying + songs[nowPos].isPlaying = isPlaying + timer.isPlaying = isPlaying + + if(isPlaying){ + binding.songMiniplayerIv.setImageResource(R.drawable.btn_miniplay_pause) + isPlaying = false + mediaPlayer?.start() + } + else{ + binding.songMiniplayerIv.setImageResource(R.drawable.btn_miniplayer_play) + isPlaying = true + if(mediaPlayer?.isPlaying == true){ //미디어플레이어 재생 중 아닐 때 pause하면 오류날 수 있어서 방지하기 위함 + mediaPlayer?.pause() + } + } + } + + private fun startTimer(){ +// timer = Timer(song.playTime, song.isPlaying) + timer = Timer(songs[nowPos].playTime, songs[nowPos].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 { //isPlaying으로 Thread 동작, 정지를 간접적으로 결정하긴 했으나, 사실 while 문은 계속 돌고 있으니 비효율적. 프로그램이 종료되지 않으면서도 오류를 강제적으로 내고, 그 때 catch문이 실행되게끔 하는 try catch 문 사용 + 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", "Thread가 죽었습니다. ${e.message}") + } + } + } + +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDao.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDao.kt new file mode 100644 index 0000000..b816f26 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDao.kt @@ -0,0 +1,29 @@ +package com.example.flo + +import androidx.room.* +import com.example.flo.data.entities.Song + +@Dao +interface SongDao { + + @Insert + fun insert(song: Song) + + @Update + fun update(song: Song) + + @Delete + fun delete(song: Song) + + @Query("SELECT * FROM SongTable") + fun getSongs(): List + + @Query("SELECT * FROM SongTable WHERE id = :id") + fun getSong(id: Int): Song + + @Query("UPDATE SongTable SET isLike = :isLike WHERE id = :id") + fun updateIsLikeById(isLike: Boolean,id: Int) + + @Query("SELECT * FROM SongTable WHERE isLike = :isLike") + fun getLikedSongs(isLike: Boolean): List +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDatabase.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDatabase.kt new file mode 100644 index 0000000..e92f90a --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongDatabase.kt @@ -0,0 +1,37 @@ +package com.example.flo + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.example.flo.data.entities.Album +import com.example.flo.data.entities.Like +import com.example.flo.data.entities.Song +import com.example.flo.data.entities.User + + +@Database(entities = [Song::class, User::class, Like::class, Album::class], version = 1) +abstract class SongDatabase: RoomDatabase() { + abstract fun songDao(): SongDao + abstract fun userDao(): UserDao + abstract fun albumDao(): AlbumDao + + companion object { + private var instance: SongDatabase? = null + + @Synchronized + fun getInstance(context: Context): SongDatabase? { + if (instance == null) { + synchronized(SongDatabase::class){ + instance = Room.databaseBuilder( + context.applicationContext, + SongDatabase::class.java, + "song-database"//다른 데이터 베이스랑 이름겹치면 꼬임 + ).allowMainThreadQueries().build() //원래 더 효율적으로 하려면 메인 스레드에 넘기지 않음 + } + } + + return instance + } + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongFragment.kt new file mode 100644 index 0000000..bafc0d8 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongFragment.kt @@ -0,0 +1,45 @@ +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.ActivitySongBinding +//import com.example.flo.databinding.FragmentDetailBinding +import com.example.flo.databinding.FragmentSongBinding + +class SongFragment : Fragment() { + + lateinit var binding: FragmentSongBinding + private var on = true + + + fun setMIxStatus(){ + + if(on){ + binding.songMixTg.setImageResource(R.drawable.btn_toggle_on) + on = false + } + else{ + binding.songMixTg.setImageResource(R.drawable.btn_toggle_off) + on = true + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSongBinding.inflate(inflater,container,false) + + binding.songMixTg.setOnClickListener { + setMIxStatus() + } + + return binding.root + } +} + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRVAdapter.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRVAdapter.kt new file mode 100644 index 0000000..7d6efbf --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRVAdapter.kt @@ -0,0 +1,67 @@ +package com.example.flo + +import android.annotation.SuppressLint +import android.content.Context +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.example.flo.databinding.ItemSongBinding + +class SongRVAdapter(val context: Context, val result : FloChartResult) : RecyclerView.Adapter() { + + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): SongRVAdapter.ViewHolder { + val binding: ItemSongBinding = ItemSongBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) + + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: SongRVAdapter.ViewHolder, position: Int) { + //holder.bind(result.songs[position]) + + if(result.songs[position].coverImgUrl == "" || result.songs[position].coverImgUrl == null) { + } + else { + Log.d("image",result.songs[position].coverImgUrl ) + Glide.with(context).load(result.songs[position].coverImgUrl).into(holder.coverImg) + } + holder.title.text = result.songs[position].title + holder.singer.text = result.songs[position].singer + + } + + override fun getItemCount(): Int = result.songs.size + + + inner class ViewHolder(val binding: ItemSongBinding) : RecyclerView.ViewHolder(binding.root){ + + val coverImg : ImageView = binding.itemSongImgIv + val title : TextView = binding.itemSongTitleTv + val singer : TextView = binding.itemSongSingerTv + +// fun bind(song: FloChartSongs){ +// if(song.coverImgUrl == "" || song.coverImgUrl == null) { +// } else { +// Glide.with(context).load(song.coverImgUrl).into(binding.itemSongImgIv) +// } +// +// binding.itemSongTitleTv.text = song.title +// binding.itemSongSingerTv.text = song.singer +// } + } + + interface MyItemClickListener{ + fun onRemoveSong(songId: Int) + } + + private lateinit var mItemClickListener: MyItemClickListener + + fun setMyItemClickListener(itemClickListener: MyItemClickListener){ + mItemClickListener = itemClickListener + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongResponse.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongResponse.kt new file mode 100644 index 0000000..fa9f67e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongResponse.kt @@ -0,0 +1,22 @@ +package com.example.flo + +import com.google.gson.annotations.SerializedName + +data class SongResponse( + @SerializedName("isSuccess") val isSuccess: Boolean, + @SerializedName("code") val code: Int, + @SerializedName("message") val message: String, + @SerializedName("result") val result: FloChartResult +) + +data class FloChartResult( + @SerializedName("songs") val songs: List +) + +data class FloChartSongs( + @SerializedName("songIdx") val songIdx: Int, + @SerializedName("albumIdx") val albumIdx: Int, + @SerializedName("singer") val singer: String, + @SerializedName("title") val title:String, + @SerializedName("coverImgUrl") val coverImgUrl : String +) \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRetrofitInterface.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRetrofitInterface.kt new file mode 100644 index 0000000..1de9a7e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongRetrofitInterface.kt @@ -0,0 +1,11 @@ +package com.example.flo + +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST + +interface SongRetrofitInterfaces { + @GET("/songs") + fun getSongs(): Call +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongService.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongService.kt new file mode 100644 index 0000000..0072c3e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/SongService.kt @@ -0,0 +1,42 @@ +package com.example.flo + +import android.util.Log +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class SongService() { + private lateinit var lookView: LookView + + fun setLookView(lookView: LookView) { + this.lookView = lookView + } + + fun getSongs() { + val songService = getRetrofit().create(SongRetrofitInterfaces::class.java) + + lookView.onGetSongLoading() + + songService.getSongs().enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful && response.code() == 200) { + val songResponse: SongResponse = response.body()!! + + Log.d("SONG-RESPONSE", songResponse.toString()) + + when (val code = songResponse.code) { + 1000 -> { + lookView.onGetSongSuccess(code, songResponse.result!!) + } + + else -> lookView.onGetSongFailure(code, songResponse.message) + } + } + } + + override fun onFailure(call: Call, t: Throwable) { + lookView.onGetSongFailure(400, "네트워크 오류가 발생했습니다.") + } + }) + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/UserDao.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/UserDao.kt new file mode 100644 index 0000000..00665e7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/UserDao.kt @@ -0,0 +1,19 @@ +package com.example.flo + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.example.flo.data.entities.User + +@Dao +interface UserDao { + + @Insert + fun insert(user: User) + + @Query("SELECT * FROM UserTable") + fun getUsers(): List + + @Query("SELECT * FROM UserTable WHERE email = :email AND password = :password") + fun getUser(email: String, password: String): User? +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/VideoFragment.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/VideoFragment.kt new file mode 100644 index 0000000..de671e6 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/VideoFragment.kt @@ -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.FragmentVideoBinding + +class VideoFragment : Fragment() { + + lateinit var binding: FragmentVideoBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentVideoBinding.inflate(inflater,container,false) + + return binding.root + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Album.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Album.kt new file mode 100644 index 0000000..b944f7a --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Album.kt @@ -0,0 +1,14 @@ +package com.example.flo.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.util.* + + +@Entity(tableName = "AlbumTable") +data class Album( + @PrimaryKey(autoGenerate = false) var id: Int = 0, // album의 primarykey는 임의로 지정해주기 위해 autogenerate 안씁니다. + var title: String? = "", + var singer: String? = "", + var coverImg: Int? = null +) diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Like.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Like.kt new file mode 100644 index 0000000..a65739e --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Like.kt @@ -0,0 +1,12 @@ +package com.example.flo.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "LikeTable") +data class Like( + var userId: Int, + var albumId: Int + ){ + @PrimaryKey(autoGenerate = true) var id: Int = 0 +} diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Song.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Song.kt new file mode 100644 index 0000000..5e351df --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/Song.kt @@ -0,0 +1,19 @@ +package com.example.flo.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "SongTable") //Table화 +data class Song( + + val title: String = "", + val singer: String = "", + var second: Int = 0, + var playTime: Int = 0, + var isPlaying: Boolean = false, + var music: String = "", + var coverImg: Int? = null, + var isLike: Boolean = false +){ + @PrimaryKey(autoGenerate = true) var id : Int = 0 +} diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/User.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/User.kt new file mode 100644 index 0000000..7d2a2f3 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/entities/User.kt @@ -0,0 +1,14 @@ +package com.example.flo.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.google.gson.annotations.SerializedName + +@Entity(tableName = "UserTable") +data class User( + @SerializedName(value = "email") var email : String, + @SerializedName(value = "password") var password : String, + @SerializedName(value = "name") var name : String +){ + @PrimaryKey(autoGenerate = true) var id : Int = 0 +} diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthResponse.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthResponse.kt new file mode 100644 index 0000000..656a85d --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthResponse.kt @@ -0,0 +1,15 @@ +package com.example.flo.data.remote + +import com.google.gson.annotations.SerializedName + +data class AuthResponse( + @SerializedName(value = "isSuccess") val isSuccess: Boolean, + @SerializedName(value = "code") val code: Int, + @SerializedName(value = "message") val message: String, + @SerializedName(value = "result") val result: Result? + ) + +data class Result( + @SerializedName(value = "userIdx") var userIdx: Int, + @SerializedName(value = "jwt") var jwt: String +) diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthRetrofitInterface.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthRetrofitInterface.kt new file mode 100644 index 0000000..340c717 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthRetrofitInterface.kt @@ -0,0 +1,14 @@ +package com.example.flo.data.remote + +import com.example.flo.data.entities.User +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.POST + +interface AuthRetrofitInterface { + @POST("/users") + fun signUp(@Body user: User): Call + + @POST("/users/login") + fun login(@Body user: User): Call +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthService.kt b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthService.kt new file mode 100644 index 0000000..f134c87 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/java/com/example/flo/data/remote/AuthService.kt @@ -0,0 +1,61 @@ +package com.example.flo.data.remote + +import android.util.Log +import com.example.flo.LoginView +import com.example.flo.SignUpView +import com.example.flo.data.entities.User +import com.example.flo.getRetrofit +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class AuthService { + private lateinit var signUpView: SignUpView + private lateinit var loginView: LoginView + + fun setSignUpView(signUpView: SignUpView){ + this.signUpView = signUpView + } + + fun setLoginView(loginView: LoginView){ + this.loginView = loginView + } + + fun signUp(user: User){ + val authService = getRetrofit().create(AuthRetrofitInterface::class.java) + + authService.signUp(user).enqueue(object: Callback{ + override fun onResponse(call: Call, response: Response) { + Log.d("Signup/SUCCESS", response.toString()) + val resp: AuthResponse = response.body()!! + when(resp.code){ + 1000 -> signUpView.onSignUpSuccess() + else -> signUpView.onSignUpFailure() + } + } + override fun onFailure(call: Call, t: Throwable) { + Log.d("Signup/FAILURE", t.message.toString()) + } + }) + Log.d("SignUp", "HELLO") + } + + fun login(user: User){ + val authService = getRetrofit().create(AuthRetrofitInterface::class.java) + + authService.login(user).enqueue(object: Callback{ + override fun onResponse(call: Call, response: Response) { + Log.d("LOGIN/SUCCESS", response.toString()) + val resp: AuthResponse = response.body()!! + when(val code = resp.code){ + 1000 -> loginView.onLoginSuccess(code, resp.result!!) + else -> loginView.onLoginFailure() + } + } + override fun onFailure(call: Call, t: Throwable) { + Log.d("LOGIN/FAILURE", t.message.toString()) + } + }) + Log.d("SignUp", "HELLO") + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/apple_44.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/apple_44.png new file mode 100644 index 0000000..f365d20 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/apple_44.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btm_color_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btm_color_selector.xml new file mode 100644 index 0000000..3ecf8a7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btm_color_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_close.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_close.png new file mode 100644 index 0000000..b6cc3cc Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_close.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_instagram.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_instagram.png new file mode 100644 index 0000000..90bc027 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_actionbar_instagram.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_black.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_black.png new file mode 100644 index 0000000..cc38ca8 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_black.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_more.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_more.png new file mode 100644 index 0000000..59e410c Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_arrow_more.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password.png new file mode 100644 index 0000000..8c2eb18 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password_off.png new file mode 100644 index 0000000..8234f53 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_input_password_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_alarm.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_alarm.png new file mode 100644 index 0000000..6e845b5 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_alarm.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_arrow_more.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_arrow_more.png new file mode 100644 index 0000000..59e410c Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_arrow_more.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_mike.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_mike.png new file mode 100644 index 0000000..9bddec6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_mike.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_setting.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_setting.png new file mode 100644 index 0000000..7a8d5d6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_setting.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_ticket.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_ticket.png new file mode 100644 index 0000000..52b6d64 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_main_ticket.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvpause.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvpause.png new file mode 100644 index 0000000..470e046 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvpause.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvplay.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvplay.png new file mode 100644 index 0000000..d118677 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_mvplay.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_pause.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_pause.png new file mode 100644 index 0000000..470e046 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplay_pause.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_go_list.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_go_list.png new file mode 100644 index 0000000..1b2d977 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_go_list.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_next.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_next.png new file mode 100644 index 0000000..3aedba3 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_next.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_play.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_play.png new file mode 100644 index 0000000..f619072 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_play.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_previous.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_previous.png new file mode 100644 index 0000000..d0bf1f6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_miniplayer_previous.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_nugu.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_nugu.png new file mode 100644 index 0000000..9bddec6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_nugu.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_panel_play_large.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_panel_play_large.png new file mode 100644 index 0000000..4ac7103 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_panel_play_large.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_eq_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_eq_off.png new file mode 100644 index 0000000..f23d9c6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_eq_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_go_list.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_go_list.png new file mode 100644 index 0000000..1b2d977 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_go_list.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_more.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_more.png new file mode 100644 index 0000000..a8ad9e6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_more.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_play.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_play.png new file mode 100644 index 0000000..f6c3201 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_play.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_related.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_related.png new file mode 100644 index 0000000..9026fe5 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_related.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_setting.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_setting.png new file mode 100644 index 0000000..0df8f69 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_setting.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_off.png new file mode 100644 index 0000000..b539504 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_on.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_on.png new file mode 100644 index 0000000..45a43ca Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_player_unlike_on.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_off.png new file mode 100644 index 0000000..62ef45c Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_on.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_on.png new file mode 100644 index 0000000..2d3b6af Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_playlist_select_on.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_setting_phone.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_setting_phone.png new file mode 100644 index 0000000..d6de4c6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_setting_phone.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_textbox_close.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_textbox_close.png new file mode 100644 index 0000000..10f1f63 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_textbox_close.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_titlebar_close.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_titlebar_close.png new file mode 100644 index 0000000..6615def Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_titlebar_close.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_off.png new file mode 100644 index 0000000..983360d Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_on.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_on.png new file mode 100644 index 0000000..fb609f4 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/btn_toggle_on.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_black_color.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_black_color.xml new file mode 100644 index 0000000..cad3794 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_black_color.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_flo_color.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_flo_color.xml new file mode 100644 index 0000000..d5e92f3 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_flo_color.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_gray_color.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_gray_color.xml new file mode 100644 index 0000000..dbcaae2 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_gray_color.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_white_color.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_white_color.xml new file mode 100644 index 0000000..32e9583 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/button_background_white_color.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/discovery_banner_aos.jpg b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/discovery_banner_aos.jpg new file mode 100644 index 0000000..c905515 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/discovery_banner_aos.jpg differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chart_background.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chart_background.xml new file mode 100644 index 0000000..64c040f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chart_background.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_off_background.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_off_background.xml new file mode 100644 index 0000000..43005ce --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_off_background.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_on_background.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_on_background.xml new file mode 100644 index 0000000..ce894ed --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/fragment_look_chip_on_background.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_no_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_no_select.png new file mode 100644 index 0000000..69a8ab6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_no_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_select.png new file mode 100644 index 0000000..c0ff48e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_home_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_no_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_no_select.png new file mode 100644 index 0000000..a67dec3 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_no_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_select.png new file mode 100644 index 0000000..042489f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_locker_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_no_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_no_select.png new file mode 100644 index 0000000..6c2f4f0 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_no_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_select.png new file mode 100644 index 0000000..3d169e4 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_look_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_no_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_no_select.png new file mode 100644 index 0000000..a67dec3 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_no_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_select.png new file mode 100644 index 0000000..042489f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_my_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_no_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_no_select.png new file mode 100644 index 0000000..a77b8c5 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_no_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_select.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_select.png new file mode 100644 index 0000000..d5c8a72 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_bottom_search_select.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_browse_arrow_right.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_browse_arrow_right.png new file mode 100644 index 0000000..71b588b Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_browse_arrow_right.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_flo_logo.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_flo_logo.png new file mode 100644 index 0000000..643224d Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_flo_logo.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_launcher_background.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook.png new file mode 100644 index 0000000..83e9732 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook_btn.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook_btn.png new file mode 100644 index 0000000..83e9732 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_facebook_btn.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram.png new file mode 100644 index 0000000..398ce61 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram_btn.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram_btn.png new file mode 100644 index 0000000..398ce61 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_instagram_btn.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter.png new file mode 100644 index 0000000..6ddc68e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter_btn.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter_btn.png new file mode 100644 index 0000000..6ddc68e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_twitter_btn.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube.png new file mode 100644 index 0000000..0c4ec93 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube_btn.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube_btn.png new file mode 100644 index 0000000..0c4ec93 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_main_youtube_btn.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_off.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_off.png new file mode 100644 index 0000000..c06e139 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_off.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_on.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_on.png new file mode 100644 index 0000000..22577c0 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ic_my_like_on.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ico_20_logo_tid_white.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ico_20_logo_tid_white.png new file mode 100644 index 0000000..c6f4d4f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/ico_20_logo_tid_white.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/icon_browse_arrow_right.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/icon_browse_arrow_right.png new file mode 100644 index 0000000..71b588b Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/icon_browse_arrow_right.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp.png new file mode 100644 index 0000000..6e3f38a Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp2.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp2.png new file mode 100644 index 0000000..28ea3ee Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp2.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp3.jpg b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp3.jpg new file mode 100644 index 0000000..6641600 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp3.jpg differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp4.jpg b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp4.jpg new file mode 100644 index 0000000..aecebb6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp4.jpg differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp5.jpg b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp5.jpg new file mode 100644 index 0000000..6a8d870 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp5.jpg differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp6.jpg b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp6.jpg new file mode 100644 index 0000000..48202f2 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_exp6.jpg differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_lp.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_lp.png new file mode 100644 index 0000000..29fb1b4 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_album_lp.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_default_4_x_1.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_default_4_x_1.png new file mode 100644 index 0000000..926d34f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_default_4_x_1.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_first_album_default.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_first_album_default.png new file mode 100644 index 0000000..926d34f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_first_album_default.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp.png new file mode 100644 index 0000000..da78032 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp2.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp2.png new file mode 100644 index 0000000..50fa4be Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_home_viewpager_exp2.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_1.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_1.png new file mode 100644 index 0000000..0d43e8e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_1.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_2.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_2.png new file mode 100644 index 0000000..f03efb2 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_2.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_3.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_3.png new file mode 100644 index 0000000..51de684 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_jenre_exp_3.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_potcast_exp.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_potcast_exp.png new file mode 100644 index 0000000..50a46e0 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_potcast_exp.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_video_exp.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_video_exp.png new file mode 100644 index 0000000..7f6b05f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/img_video_exp.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/kakako_44.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/kakako_44.png new file mode 100644 index 0000000..243298e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/kakako_44.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_color_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_color_selector.xml new file mode 100644 index 0000000..3ecf8a7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_color_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_home_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_home_selector.xml new file mode 100644 index 0000000..b018478 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_look_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_look_selector.xml new file mode 100644 index 0000000..89ced75 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_look_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_my_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_my_selector.xml new file mode 100644 index 0000000..d6739bf --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_my_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_search_selector.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_search_selector.xml new file mode 100644 index 0000000..e6e823f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/main_btm_search_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/naver_44.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/naver_44.png new file mode 100644 index 0000000..d984487 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/naver_44.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_down.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_down.png new file mode 100644 index 0000000..03a04c5 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_down.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_pause_32.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_pause_32.png new file mode 100644 index 0000000..9388aa3 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_pause_32.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_play_32.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_play_32.png new file mode 100644 index 0000000..b781e4c Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_play_32.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_random_inactive.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_random_inactive.png new file mode 100644 index 0000000..fe4f880 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_random_inactive.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_repeat_inactive.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_repeat_inactive.png new file mode 100644 index 0000000..1e4044d Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_repeat_inactive.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_next_32.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_next_32.png new file mode 100644 index 0000000..fc02f28 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_next_32.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_previous_32.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_previous_32.png new file mode 100644 index 0000000..03ec854 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/nugu_btn_skip_previous_32.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/round_tip_background.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/round_tip_background.xml new file mode 100644 index 0000000..0d5b843 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/round_tip_background.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/splash.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/splash.xml new file mode 100644 index 0000000..ace8a7d --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/splash.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_radius.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_radius.xml new file mode 100644 index 0000000..53beead --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_radius.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_select_color_radius.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_select_color_radius.xml new file mode 100644 index 0000000..ea8dc88 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/textview_background_select_color_radius.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/widget_black_play.png b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/widget_black_play.png new file mode 100644 index 0000000..0ec2700 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/drawable/widget_black_play.png differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_login.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..7a3b16f --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_main.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b0e0387 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_signup.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_signup.xml new file mode 100644 index 0000000..e5e99f2 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_signup.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_song.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_song.xml new file mode 100644 index 0000000..4bc22fa --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_song.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_splash.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_album.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_album.xml new file mode 100644 index 0000000..6047565 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_album.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_banner.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_banner.xml new file mode 100644 index 0000000..92e67fa --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_banner.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_detail.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_detail.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_detail.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_home.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7b260ba --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker.xml new file mode 100644 index 0000000..fac8de9 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_musicfile.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_musicfile.xml new file mode 100644 index 0000000..3dd2ff0 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_musicfile.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedalbum.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedalbum.xml new file mode 100644 index 0000000..2f7e2d0 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedalbum.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedsong.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedsong.xml new file mode 100644 index 0000000..333cd5c --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_locker_savedsong.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_look.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_look.xml new file mode 100644 index 0000000..31b020c --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_look.xml @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_search.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..6fbc0a9 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_song.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_song.xml new file mode 100644 index 0000000..642e5bd --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_song.xml @@ -0,0 +1,549 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_video.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_video.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/fragment_video.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_album.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_album.xml new file mode 100644 index 0000000..5eba725 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_album.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_locker_album.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_locker_album.xml new file mode 100644 index 0000000..11a3ab9 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_locker_album.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_song.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_song.xml new file mode 100644 index 0000000..5a494ba --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/layout/item_song.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/menu/bottom_nav_menu.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..9a55b1a --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/bboom_momoland.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/bboom_momoland.mp3 new file mode 100644 index 0000000..b555591 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/bboom_momoland.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/boywithlove_bts.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/boywithlove_bts.mp3 new file mode 100644 index 0000000..c19f239 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/boywithlove_bts.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/butter_bts.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/butter_bts.mp3 new file mode 100644 index 0000000..a6b952f Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/butter_bts.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/flu_iu.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/flu_iu.mp3 new file mode 100644 index 0000000..e6a0d7e Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/flu_iu.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/lilac_iu.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/lilac_iu.mp3 new file mode 100644 index 0000000..a86c426 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/lilac_iu.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/nextlevel_aespa.mp3 b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/nextlevel_aespa.mp3 new file mode 100644 index 0000000..6261b05 Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/raw/nextlevel_aespa.mp3 differ diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values-night/themes.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..f430368 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/colors.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..d60b4b8 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/colors.xml @@ -0,0 +1,25 @@ + + + #3f3fff + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + + #9cbee2 + #062342 + #424242 + #6bb2ff + + #00ff0000 + #3f3fff + #a8a8a8 + #3f3fff + #a8a8a8 + + #F11818 + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/strings.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..9ac5010 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + FLO + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/themes.xml b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..0e616b7 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/main/res/values/themes.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/app/src/test/java/com/example/flo/ExampleUnitTest.kt b/gdjea_udemy_android_template_bottomnavi/app/src/test/java/com/example/flo/ExampleUnitTest.kt new file mode 100644 index 0000000..d39df20 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/app/src/test/java/com/example/flo/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.example.flo + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/build.gradle b/gdjea_udemy_android_template_bottomnavi/build.gradle new file mode 100644 index 0000000..3fd7332 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/build.gradle @@ -0,0 +1,18 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/gradle.properties b/gdjea_udemy_android_template_bottomnavi/gradle.properties new file mode 100644 index 0000000..98bed16 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.jar b/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.properties b/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..8552cef --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Dec 28 23:15:55 KST 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gdjea_udemy_android_template_bottomnavi/gradlew b/gdjea_udemy_android_template_bottomnavi/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gdjea_udemy_android_template_bottomnavi/gradlew.bat b/gdjea_udemy_android_template_bottomnavi/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gdjea_udemy_android_template_bottomnavi/settings.gradle b/gdjea_udemy_android_template_bottomnavi/settings.gradle new file mode 100644 index 0000000..5cb40e4 --- /dev/null +++ b/gdjea_udemy_android_template_bottomnavi/settings.gradle @@ -0,0 +1,10 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + jcenter() // Warning: this repository is going to shut down soon + } +} +rootProject.name = "FLO" +include ':app'