diff --git a/app/src/main/java/kr/co/vividnext/sodalive/content/main/ContentMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/content/main/ContentMainFragment.kt new file mode 100644 index 0000000..5e7fbd2 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/content/main/ContentMainFragment.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.content.main + +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentContentMainBinding + +class ContentMainFragment : BaseFragment( + FragmentContentMainBinding::inflate +) { +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt index f15a8b3..8ee9865 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt @@ -4,6 +4,7 @@ import android.content.Context import com.google.gson.GsonBuilder import kr.co.vividnext.sodalive.BuildConfig import kr.co.vividnext.sodalive.common.ApiBuilder +import kr.co.vividnext.sodalive.main.MainViewModel import kr.co.vividnext.sodalive.network.TokenAuthenticator import kr.co.vividnext.sodalive.settings.TermsApi import kr.co.vividnext.sodalive.settings.TermsRepository @@ -64,6 +65,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { SignUpViewModel(get()) } viewModel { TermsViewModel(get()) } viewModel { FindPasswordViewModel(get()) } + viewModel { MainViewModel() } } private val repositoryModule = module { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerFragment.kt new file mode 100644 index 0000000..9500a0a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerFragment.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.explorer + +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentExplorerBinding + +class ExplorerFragment : BaseFragment( + FragmentExplorerBinding::inflate +) { +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt new file mode 100644 index 0000000..c46c85e --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.live + +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentLiveBinding + +class LiveFragment : BaseFragment(FragmentLiveBinding::inflate) { +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt index 6187bf7..c8adc9a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt @@ -1,8 +1,183 @@ package kr.co.vividnext.sodalive.main +import android.content.res.ColorStateList +import android.os.Bundle +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseActivity +import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.content.main.ContentMainFragment import kr.co.vividnext.sodalive.databinding.ActivityMainBinding +import kr.co.vividnext.sodalive.databinding.ItemMainTabBinding +import kr.co.vividnext.sodalive.explorer.ExplorerFragment +import kr.co.vividnext.sodalive.live.LiveFragment +import kr.co.vividnext.sodalive.message.MessageFragment +import kr.co.vividnext.sodalive.mypage.MyPageFragment +import org.koin.android.ext.android.inject class MainActivity : BaseActivity(ActivityMainBinding::inflate) { - override fun setupView() {} + + private val viewModel: MainViewModel by inject() + + private lateinit var liveFragment: LiveFragment + private lateinit var loadingDialog: LoadingDialog + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setupBottomTabLayout() + } + + override fun setupView() { + loadingDialog = LoadingDialog(this, layoutInflater) + liveFragment = LiveFragment() + } + + private fun setupBottomTabLayout() { + setupTab( + binding = binding.tabContent, + title = "콘텐츠", + imageSrc = R.drawable.ic_tabbar_content, + colorStateList = ContextCompat.getColorStateList( + applicationContext, + R.color.color_tabbar_title + ), + tab = MainViewModel.CurrentTab.CONTENT + ) + + setupTab( + binding = binding.tabSuda, + title = "라이브", + imageSrc = R.drawable.ic_tabbar_live, + colorStateList = ContextCompat.getColorStateList( + applicationContext, + R.color.color_tabbar_title + ), + tab = MainViewModel.CurrentTab.LIVE + ) + + setupTab( + binding = binding.tabExplorer, + title = "탐색", + imageSrc = R.drawable.ic_tabbar_explorer, + colorStateList = ContextCompat.getColorStateList( + applicationContext, + R.color.color_tabbar_title + ), + tab = MainViewModel.CurrentTab.EXPLORER + ) + + setupTab( + binding = binding.tabMessage, + title = "메시지", + imageSrc = R.drawable.ic_tabbar_message, + colorStateList = ContextCompat.getColorStateList( + applicationContext, + R.color.color_tabbar_title + ), + tab = MainViewModel.CurrentTab.MESSAGE + ) + + setupTab( + binding = binding.tabMy, + title = "마이", + imageSrc = R.drawable.ic_tabbar_my, + colorStateList = ContextCompat.getColorStateList( + applicationContext, + R.color.color_tabbar_title + ), + tab = MainViewModel.CurrentTab.MY + ) + + viewModel.currentTab.observe(this) { + setTabSelected(binding.tabContent, isSelected = false) + setTabSelected(binding.tabSuda, isSelected = false) + setTabSelected(binding.tabExplorer, isSelected = false) + setTabSelected(binding.tabMessage, isSelected = false) + setTabSelected(binding.tabMy, isSelected = false) + + changeFragment(it) + when (it) { + MainViewModel.CurrentTab.CONTENT -> { + setTabSelected(binding.tabContent, isSelected = true) + } + + MainViewModel.CurrentTab.LIVE -> { + setTabSelected(binding.tabSuda, isSelected = true) + } + + MainViewModel.CurrentTab.EXPLORER -> { + setTabSelected(binding.tabExplorer, isSelected = true) + } + + MainViewModel.CurrentTab.MESSAGE -> { + setTabSelected(binding.tabMessage, isSelected = true) + } + + MainViewModel.CurrentTab.MY -> { + setTabSelected(binding.tabMy, isSelected = true) + } + + else -> { + } + } + } + } + + private fun setupTab( + binding: ItemMainTabBinding, + title: String, + imageSrc: Int, + colorStateList: ColorStateList?, + tab: MainViewModel.CurrentTab + ) { + binding.tvTab.text = title + binding.tvTab.setTextColor(colorStateList) + binding.ivTab.setImageResource(imageSrc) + binding.root.setOnClickListener { viewModel.clickTab(tab) } + } + + private fun setTabSelected(binding: ItemMainTabBinding, isSelected: Boolean) { + binding.tvTab.isSelected = isSelected + binding.ivTab.isSelected = isSelected + + val fontRes = if (isSelected) { + R.font.gmarket_sans_bold + } else { + R.font.gmarket_sans_light + } + binding.tvTab.typeface = ResourcesCompat.getFont(applicationContext, fontRes) + } + + private fun changeFragment(currentTab: MainViewModel.CurrentTab) { + val tag = currentTab.toString() + + val fragmentManager = supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + + val currentFragment = fragmentManager.primaryNavigationFragment + if (currentFragment != null) { + fragmentTransaction.hide(currentFragment) + } + + var fragment = fragmentManager.findFragmentByTag(tag) + if (fragment == null) { + fragment = when (currentTab) { + MainViewModel.CurrentTab.LIVE -> liveFragment + MainViewModel.CurrentTab.CONTENT -> ContentMainFragment() + MainViewModel.CurrentTab.EXPLORER -> ExplorerFragment() + MainViewModel.CurrentTab.MESSAGE -> MessageFragment() + MainViewModel.CurrentTab.MY -> MyPageFragment() + } + + fragmentTransaction.add(R.id.fl_container, fragment, tag) + } else { + fragmentTransaction.show(fragment) + } + + fragmentTransaction.setPrimaryNavigationFragment(fragment) + fragmentTransaction.setReorderingAllowed(true) + fragmentTransaction.commitNow() + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/main/MainViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/main/MainViewModel.kt new file mode 100644 index 0000000..fb5c774 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/main/MainViewModel.kt @@ -0,0 +1,35 @@ +package kr.co.vividnext.sodalive.main + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.base.BaseViewModel + +class MainViewModel : BaseViewModel() { + enum class CurrentTab { + @SerializedName("CONTENT") + CONTENT, + + @SerializedName("LIVE") + LIVE, + + @SerializedName("EXPLORER") + EXPLORER, + + @SerializedName("MESSAGE") + MESSAGE, + + @SerializedName("MY") + MY + } + + private val _currentTab = MutableLiveData(CurrentTab.LIVE) + val currentTab: LiveData + get() = _currentTab + + fun clickTab(tab: CurrentTab) { + if (_currentTab.value != tab) { + _currentTab.postValue(tab) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/message/MessageFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/message/MessageFragment.kt new file mode 100644 index 0000000..8604483 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/message/MessageFragment.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.message + +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentMessageBinding + +class MessageFragment : BaseFragment(FragmentMessageBinding::inflate) { +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt new file mode 100644 index 0000000..595ba44 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.mypage + +import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.databinding.FragmentMyBinding + +class MyPageFragment : BaseFragment(FragmentMyBinding::inflate) { +} diff --git a/app/src/main/res/color/color_payment_method.xml b/app/src/main/res/color/color_payment_method.xml new file mode 100644 index 0000000..99cac77 --- /dev/null +++ b/app/src/main/res/color/color_payment_method.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/color/color_tabbar_title.xml b/app/src/main/res/color/color_tabbar_title.xml new file mode 100644 index 0000000..b91c6c6 --- /dev/null +++ b/app/src/main/res/color/color_tabbar_title.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_normal.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_normal.png new file mode 100644 index 0000000..d5f9f9e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_selected.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_selected.png new file mode 100644 index 0000000..607dd45 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_content_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_normal.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_normal.png new file mode 100644 index 0000000..db5b289 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_selected.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_selected.png new file mode 100644 index 0000000..aee34d2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_explorer_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_normal.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_normal.png new file mode 100644 index 0000000..883c81b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_selected.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_selected.png new file mode 100644 index 0000000..a4529c1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_live_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_normal.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_normal.png new file mode 100644 index 0000000..fe33f48 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_selected.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_selected.png new file mode 100644 index 0000000..4ab6c90 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_message_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_normal.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_normal.png new file mode 100644 index 0000000..617e462 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_normal.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_selected.png b/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_selected.png new file mode 100644 index 0000000..92ba532 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_tabbar_my_selected.png differ diff --git a/app/src/main/res/drawable/ic_tabbar_content.xml b/app/src/main/res/drawable/ic_tabbar_content.xml new file mode 100644 index 0000000..b56f398 --- /dev/null +++ b/app/src/main/res/drawable/ic_tabbar_content.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tabbar_explorer.xml b/app/src/main/res/drawable/ic_tabbar_explorer.xml new file mode 100644 index 0000000..f1493fb --- /dev/null +++ b/app/src/main/res/drawable/ic_tabbar_explorer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tabbar_live.xml b/app/src/main/res/drawable/ic_tabbar_live.xml new file mode 100644 index 0000000..b1c2c48 --- /dev/null +++ b/app/src/main/res/drawable/ic_tabbar_live.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tabbar_message.xml b/app/src/main/res/drawable/ic_tabbar_message.xml new file mode 100644 index 0000000..3946675 --- /dev/null +++ b/app/src/main/res/drawable/ic_tabbar_message.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tabbar_my.xml b/app/src/main/res/drawable/ic_tabbar_my.xml new file mode 100644 index 0000000..0f0410d --- /dev/null +++ b/app/src/main/res/drawable/ic_tabbar_my.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d8c3dbe..454b926 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,61 @@ - + android:background="@color/black"> - + + + android:layout_alignParentBottom="true" + android:background="@color/color_111111" + android:baselineAligned="false" + android:orientation="horizontal" + android:paddingVertical="10dp" + app:labelVisibilityMode="labeled"> - + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_content_main.xml b/app/src/main/res/layout/fragment_content_main.xml new file mode 100644 index 0000000..c904c59 --- /dev/null +++ b/app/src/main/res/layout/fragment_content_main.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_explorer.xml b/app/src/main/res/layout/fragment_explorer.xml new file mode 100644 index 0000000..0241f98 --- /dev/null +++ b/app/src/main/res/layout/fragment_explorer.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_live.xml b/app/src/main/res/layout/fragment_live.xml new file mode 100644 index 0000000..d7a8f06 --- /dev/null +++ b/app/src/main/res/layout/fragment_live.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml new file mode 100644 index 0000000..53b2014 --- /dev/null +++ b/app/src/main/res/layout/fragment_message.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_my.xml b/app/src/main/res/layout/fragment_my.xml new file mode 100644 index 0000000..70a9204 --- /dev/null +++ b/app/src/main/res/layout/fragment_my.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/item_main_tab.xml b/app/src/main/res/layout/item_main_tab.xml new file mode 100644 index 0000000..9482691 --- /dev/null +++ b/app/src/main/res/layout/item_main_tab.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 90840ad..5cfc8c2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,8 +10,9 @@ #222222 #909090 #3E3358 - - #B3909090 #A0E2FF #ECFAFF + #111111 + + #B3909090