Skip to content

Commit

Permalink
Merge branch 'develop' into feat/onboarding-#3
Browse files Browse the repository at this point in the history
  • Loading branch information
huiwoo-jo authored Mar 12, 2024
2 parents c645835 + 86424b3 commit 4e7eb45
Show file tree
Hide file tree
Showing 18 changed files with 425 additions and 273 deletions.
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
<activity
android:name=".ui.view.depart.DepartActivity"
android:exported="false" />
<activity
android:name=".ui.view.depart.OnboardingDepartActivity"
android:exported="false" />
<activity
android:name=".ui.view.splash.SplashActivity"
android:exported="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,12 @@ interface NoticeService {
@Query("page") page: Int,
@Query("size") size: Int
): List<Notice>
}

@GET("api/v1/dmu/notice/{searchWord}")
suspend fun getSearchNotice(
@Path("searchWord") searchWord: String,
@Query("department") department: String,
@Query("page") page: Int,
@Query("size") size: Int
): List<Notice>
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ class NoticeRepository(
}
}

suspend fun fetchDepartmentNotices(department: String, page: Int): NetworkResult<List<Notice>> {
suspend fun fetchDepartmentNotices(
department: String,
page: Int)
: NetworkResult<List<Notice>> {
return try {
val departmentNotices = RetrofitObject.getNetwork().create(NoticeService::class.java)
.getDepartmentNotice(department, page, DEFAULT_SIZE)
Expand All @@ -32,6 +35,20 @@ class NoticeRepository(
}
}

suspend fun fetchSearchNotices(
searchWord: String,
page: Int
): NetworkResult<List<Notice>> {
return try {
val searchNotices = RetrofitObject.getNetwork().create(NoticeService::class.java)
.getSearchNotice(searchWord, "์ปดํ“จํ„ฐ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™๊ณผ", page, DEFAULT_SIZE)
NetworkResult.Success(searchNotices)
} catch (exception: Exception) {
val error = errorResponseHandler.getError(exception)
NetworkResult.Error(error)
}
}

companion object {
private const val DEFAULT_SIZE = 20
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.dongyang.android.youdongknowme.standard.base

import android.content.Context
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableStringBuilder
Expand Down Expand Up @@ -32,7 +33,12 @@ abstract class BaseActivity<T : ViewDataBinding, R : BaseViewModel> : AppCompatA
initAfterBinding()
}

protected fun setSpanText(spanTextView: TextView, startIdx: Int, endIdx: Int){
protected fun setSpanText(
baseContext: Context,
spanTextView: TextView,
startIdx: Int,
endIdx: Int
){
SpannableStringBuilder(spanTextView.text).apply {
setSpan(
ForegroundColorSpan(getColor(com.dongyang.android.youdongknowme.R.color.main)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.scope.get
import org.koin.dsl.module

val databaseModule = module {
Expand Down Expand Up @@ -97,7 +96,7 @@ val viewModelModule = module {
LicenseViewModel()
}
viewModel {
SearchViewModel()
SearchViewModel(get())
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dongyang.android.youdongknowme.ui.adapter

import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.graphics.Typeface
import android.view.LayoutInflater
import android.view.View
Expand All @@ -20,28 +21,30 @@ class DepartAdapter : RecyclerView.Adapter<DepartAdapter.ViewHolder>() {

inner class ViewHolder(private val binding: ItemDepartBinding) :
RecyclerView.ViewHolder(binding.root) {
@SuppressLint("UseCompatLoadingForColorStateLists")
fun bind(item: String, position: Int) {
binding.itemDepartName.text = item
binding.itemClickListener = itemClickListener
binding.currentPosition = position

// ์„ ํƒํ•œ ํฌ์ง€์…˜์ด ๋งž์„ ๋•Œ ๊ฐ•์กฐ ํ‘œ์‹œ
if (currentPosition == position) {
binding.itemDepartCheck.visibility = View.VISIBLE
binding.itemDepartContainer.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(binding.root.context, R.color.blue300))
binding.itemDepartName.setTextColor(
ContextCompat.getColor(
binding.root.context,
R.color.sub
R.color.white
)
)
} else {
binding.itemDepartCheck.visibility = View.INVISIBLE
binding.itemDepartContainer.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(binding.root.context, R.color.white))
binding.itemDepartName.setTextColor(
ContextCompat.getColor(
binding.root.context,
R.color.black
R.color.gray400
)
)

}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import com.dongyang.android.youdongknowme.data.remote.entity.Notice
import com.dongyang.android.youdongknowme.databinding.ItemNoticeBinding
import com.dongyang.android.youdongknowme.ui.viewholder.NoticeViewHolder

class NoticeAdapter(private val clickListener: (url: String) -> Unit) :
class NoticeAdapter(private val onItemClick: (url: String) -> Unit) :
RecyclerView.Adapter<NoticeViewHolder>() {

private val noticeList = arrayListOf<Notice>()
Expand All @@ -24,7 +24,7 @@ class NoticeAdapter(private val clickListener: (url: String) -> Unit) :
return NoticeViewHolder(
ItemNoticeBinding.inflate(
LayoutInflater.from(parent.context), parent, false
), clickListener
), onItemClick
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,28 @@
package com.dongyang.android.youdongknowme.ui.view.depart

import android.content.Intent
import android.graphics.Typeface
import android.os.Bundle
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.LinearLayoutManager
import com.dongyang.android.youdongknowme.R
import com.dongyang.android.youdongknowme.databinding.ActivityDepartBinding
import com.dongyang.android.youdongknowme.function.setSpanText
import com.dongyang.android.youdongknowme.standard.base.BaseActivity
import com.dongyang.android.youdongknowme.ui.adapter.DepartAdapter
import com.dongyang.android.youdongknowme.ui.view.keyword.KeywordActivity
import com.dongyang.android.youdongknowme.ui.view.main.MainActivity
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
import com.google.android.material.snackbar.Snackbar
import org.koin.androidx.viewmodel.ext.android.viewModel

class DepartActivity : AppCompatActivity(), DepartClickListener {
class DepartActivity : BaseActivity<ActivityDepartBinding, DepartViewModel>(), DepartClickListener {

private lateinit var adapter: DepartAdapter
private lateinit var binding: ActivityDepartBinding
private val viewModel: DepartViewModel by viewModel()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDepartBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.vm = viewModel

viewModel.checkFirstLaunch()

// ๋ถ€๋ถ„ ์ƒ‰์ƒ ์ง€์ •
setSpanText(baseContext, binding.tvDepartTitleMain, startIdx = 0, endIdx = 5)
override val layoutResourceId: Int = R.layout.activity_depart
override val viewModel: DepartViewModel by viewModel()
private lateinit var adapter: DepartAdapter
private lateinit var items: ArrayList<String>

// ํ•™๊ณผ ๋ฆฌ์ŠคํŠธ
val items =
override fun initStartView() {
items =
resources.getStringArray(R.array.dmu_department_list).toCollection(ArrayList<String>())
items.sort()

// ํ•™๊ณผ ๋ฆฌ์ŠคํŠธ
adapter = DepartAdapter().apply {
submitList(items)
setItemClickListener(this@DepartActivity)
Expand All @@ -53,13 +34,19 @@ class DepartActivity : AppCompatActivity(), DepartClickListener {
this.setHasFixedSize(true)
}

// ์„ ํƒ ํฌ์ง€์…˜์„ ์‹ค์‹œ๊ฐ„ ์˜ต์ €๋น™
}

override fun initDataBinding() = Unit

override fun initAfterBinding() {
viewModel.selectDepartPosition.observe(this) {
adapter.submitPosition(it)

// ํฌ์ง€์…˜ ์„ ํƒ ์‹œ ์Šค๋‚ต๋ฐ”๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ ํ‘œ์‹œ
if (it != -1) getSnackBar(items).show()
if (it != -1) getDepart(items)
}

binding.toolbarDepart.btnToolbarExit.setOnClickListener { finish() }
}

// ์ปจํ…Œ์ด๋„ˆ ํด๋ฆญ ์‹œ ์„ ํƒํ•œ ํ•™๊ณผ์˜ ํฌ์ง€์…˜ ์ €์žฅ
Expand All @@ -68,51 +55,13 @@ class DepartActivity : AppCompatActivity(), DepartClickListener {
}

// ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‚ด๋ถ€ DB์— ํ•™๊ณผ๋ฅผ ๋‹ด๊ณ  ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ด๋™
private fun getSnackBar(items: ArrayList<String>): Snackbar {
val snackbar =
Snackbar.make(
binding.coordinatorDepart,
getString(R.string.department_snackbar_title),
LENGTH_LONG
)
.setAction(getString(R.string.department_snackbar_positive_button)) {
viewModel.setDepartment(items[viewModel.selectDepartPosition.value ?: 0])
if (viewModel.isFirstLaunch.value == true) {
val intent = Intent(this, KeywordActivity::class.java)
startActivity(intent)
finish()
} else {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
finish()
}
}.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
override fun onShown(transientBottomBar: Snackbar?) {
super.onShown(transientBottomBar)

binding.rvDepart.updateLayoutParams<ViewGroup.MarginLayoutParams> {
setMargins(0, 0, 0, transientBottomBar?.view?.height ?: 0)
}
}

override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
super.onDismissed(transientBottomBar, event)

binding.rvDepart.updateLayoutParams<ViewGroup.MarginLayoutParams> {
setMargins(0, 0, 0, 0)
}
}
})


val snackBarView = snackbar.view
val snackBarText =
snackBarView.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
snackBarText.typeface = Typeface.createFromAsset(this.assets, "pretendard_regular.otf")

snackbar.animationMode = BaseTransientBottomBar.ANIMATION_MODE_SLIDE

return snackbar
private fun getDepart(items: ArrayList<String>) {
return binding.btnDepartComplete.setOnClickListener {
viewModel.setDepartment(items[viewModel.selectDepartPosition.value ?: 0])
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
finish()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.dongyang.android.youdongknowme.ui.view.depart

import android.content.Intent
import androidx.recyclerview.widget.LinearLayoutManager
import com.dongyang.android.youdongknowme.R
import com.dongyang.android.youdongknowme.databinding.ActivityOnboardingDepartBinding
import com.dongyang.android.youdongknowme.standard.base.BaseActivity
import com.dongyang.android.youdongknowme.ui.adapter.DepartAdapter
import com.dongyang.android.youdongknowme.ui.view.keyword.OnboardingKeywordActivity
import com.dongyang.android.youdongknowme.ui.view.main.MainActivity
import org.koin.androidx.viewmodel.ext.android.viewModel

class OnboardingDepartActivity : BaseActivity<ActivityOnboardingDepartBinding, DepartViewModel>(),
DepartClickListener {

override val layoutResourceId: Int = R.layout.activity_onboarding_depart
override val viewModel: DepartViewModel by viewModel()
private lateinit var adapter: DepartAdapter
private lateinit var items: ArrayList<String>

override fun initStartView() {
viewModel.checkFirstLaunch()

items =
resources.getStringArray(R.array.dmu_department_list).toCollection(ArrayList<String>())
items.sort()

// ํ•™๊ณผ ๋ฆฌ์ŠคํŠธ
adapter = DepartAdapter().apply {
submitList(items)
setItemClickListener(this@OnboardingDepartActivity)
}

binding.rvOnboardingDepart.apply {
this.adapter = this@OnboardingDepartActivity.adapter
this.layoutManager = LinearLayoutManager(this@OnboardingDepartActivity)
this.setHasFixedSize(true)
}

// ๋ถ€๋ถ„ ์ƒ‰์ƒ ์ง€์ •
setSpanText(baseContext, binding.tvOnboardingDepartTitleMain, startIdx = 0, endIdx = 5)
}

override fun initDataBinding() = Unit

override fun initAfterBinding() {
viewModel.selectDepartPosition.observe(this) {
adapter.submitPosition(it)

// ํฌ์ง€์…˜ ์„ ํƒ ์‹œ ์Šค๋‚ต๋ฐ”๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ ํ‘œ์‹œ
if (it != -1) getDepart(items)
}
}

// ์ปจํ…Œ์ด๋„ˆ ํด๋ฆญ ์‹œ ์„ ํƒํ•œ ํ•™๊ณผ์˜ ํฌ์ง€์…˜ ์ €์žฅ
override fun containerClick(position: Int) {
viewModel.setSelectPosition(position)
}

// ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‚ด๋ถ€ DB์— ํ•™๊ณผ๋ฅผ ๋‹ด๊ณ  ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ด๋™
private fun getDepart(items: ArrayList<String>) {
return binding.btnOnboardingDepartNext.setOnClickListener {
viewModel.setDepartment(items[viewModel.selectDepartPosition.value ?: 0])
if (viewModel.isFirstLaunch.value == true) {
val intent = Intent(this, OnboardingKeywordActivity::class.java)
startActivity(intent)
finish()
} else {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
finish()
}
}
}
}
Loading

0 comments on commit 4e7eb45

Please sign in to comment.