diff --git a/.gitignore b/.gitignore
index 8cbed094..68b1aab3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,4 @@ captures
.cxx
local.properties
.idea
-strings.xml
\ No newline at end of file
+constant.xml
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 097b3b13..33f00777 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,14 +6,17 @@ plugins {
id 'dagger.hilt.android.plugin'
}
+Properties properties = new Properties()
+properties.load(project.rootProject.file('local.properties').newDataInputStream())
+
android {
namespace 'com.umc.ttoklip'
- compileSdk 33
+ compileSdk 34
defaultConfig {
applicationId "com.umc.ttoklip"
minSdk 24
- targetSdk 33
+ targetSdk 34
versionCode 1
versionName "1.0"
@@ -33,11 +36,11 @@ android {
kotlinOptions {
jvmTarget = '17'
}
- dataBinding{
+ dataBinding {
enabled = true
}
- viewBinding{
- enabled =true
+ viewBinding {
+ enabled = true
}
}
@@ -66,6 +69,7 @@ dependencies {
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
implementation "androidx.lifecycle:lifecycle-runtime:2.6.2"
+ implementation "androidx.activity:activity-ktx:1.7.2"
//lifecycle
@@ -74,6 +78,7 @@ dependencies {
//Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
+ implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
// https://github.com/square/okhttp
implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2"
@@ -88,6 +93,18 @@ dependencies {
implementation "com.google.dagger:hilt-android:2.47"
kapt "com.google.dagger:hilt-compiler:2.47"
+ //indicator : https://github.com/tommybuonomo/dotsindicator?utm_source=android-arsenal.com&utm_medium=referral&utm_campaign=7127
+ implementation "com.tbuonomo:dotsindicator:5.0"
+
+ //circleViwe: https://github.com/hdodenhof/CircleImageView
+ implementation 'de.hdodenhof:circleimageview:3.1.0'
+
+
+ implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
+ implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
+
+ //naver map
+ //implementation "com.naver.maps:map-sdk:3.16.2"
}
kapt {
correctErrorTypes true
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e4986cc9..d69b5e3a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,9 +2,10 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -27,6 +57,23 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/TtoklipApplication.kt b/app/src/main/java/com/umc/ttoklip/TtoklipApplication.kt
index 7c6e43bc..ef95ac03 100644
--- a/app/src/main/java/com/umc/ttoklip/TtoklipApplication.kt
+++ b/app/src/main/java/com/umc/ttoklip/TtoklipApplication.kt
@@ -1,8 +1,41 @@
package com.umc.ttoklip
+import android.annotation.SuppressLint
import android.app.Application
+import android.content.Context
+import androidx.annotation.StringRes
+import androidx.lifecycle.DefaultLifecycleObserver
+import androidx.lifecycle.LifecycleOwner
+import com.umc.ttoklip.module.NetworkConnectionChecker
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
-class TtoklipApplication : Application() {
+class TtoklipApplication : Application(), DefaultLifecycleObserver {
+ override fun onCreate() {
+ super.onCreate()
+ context = applicationContext
+ networkConnectionChecker = NetworkConnectionChecker(context)
+ }
+
+ override fun onStop(owner: LifecycleOwner) {
+ networkConnectionChecker.unregister()
+ super.onStop(owner)
+ }
+
+ override fun onStart(owner: LifecycleOwner) {
+ networkConnectionChecker.register()
+ super.onStart(owner)
+ }
+
+ companion object {
+ @SuppressLint("StaticFieldLeak")
+ private lateinit var context: Context
+
+ fun getString(@StringRes stringResId: Int): String {
+ return context.getString(stringResId)
+ }
+
+ private lateinit var networkConnectionChecker: NetworkConnectionChecker
+ fun isOnline() = networkConnectionChecker.isOnline()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/data/api/TestApi.kt b/app/src/main/java/com/umc/ttoklip/data/api/TestApi.kt
new file mode 100644
index 00000000..36774a06
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/data/api/TestApi.kt
@@ -0,0 +1,11 @@
+package com.umc.ttoklip.data.api
+
+import com.umc.ttoklip.data.model.TestResponse
+import retrofit2.Response
+import retrofit2.http.GET
+
+//테스트용 api
+interface TestApi {
+ @GET("/")
+ suspend fun testGet(): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/data/model/TestResponse.kt b/app/src/main/java/com/umc/ttoklip/data/model/TestResponse.kt
new file mode 100644
index 00000000..80639043
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/data/model/TestResponse.kt
@@ -0,0 +1,9 @@
+package com.umc.ttoklip.data.model
+
+
+//테스트용 response
+data class TestResponse(
+ val time: String,
+ val milliseconds_since_epoch: Long,
+ val date: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/TestRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/TestRepository.kt
new file mode 100644
index 00000000..21695d11
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/data/repository/TestRepository.kt
@@ -0,0 +1,10 @@
+package com.umc.ttoklip.data.repository
+
+import com.umc.ttoklip.data.model.TestResponse
+import retrofit2.Response
+
+//테스트용 repository
+interface TestRepository {
+
+ suspend fun test(): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/TestRepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/TestRepositoryImpl.kt
new file mode 100644
index 00000000..29a77d9a
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/data/repository/TestRepositoryImpl.kt
@@ -0,0 +1,18 @@
+package com.umc.ttoklip.data.repository
+
+import com.umc.ttoklip.data.api.TestApi
+import com.umc.ttoklip.data.model.TestResponse
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+
+//테스트용 repositoryimpl
+@Singleton
+class TestRepositoryImpl @Inject constructor(
+ private val api: TestApi
+) : TestRepository {
+ override suspend fun test(): Response {
+ return api.testGet()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt b/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt
new file mode 100644
index 00000000..d5b4bfc2
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/di/NetworkModule.kt
@@ -0,0 +1,52 @@
+package com.umc.ttoklip.di
+
+import com.umc.ttoklip.R
+import com.umc.ttoklip.TtoklipApplication
+import com.umc.ttoklip.data.api.TestApi
+import com.umc.ttoklip.module.HttpRequestInterceptor
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import okhttp3.OkHttpClient
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import retrofit2.converter.scalars.ScalarsConverterFactory
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object NetworkModule {
+ const val NETWORK_EXCEPTION_OFFLINE_CASE = "network status is offline"
+ const val NETWORK_EXCEPTION_BODY_IS_NULL = "result body is null"
+
+ @Provides
+ @Singleton
+ fun provideOKHttpClient(): OkHttpClient {
+ return OkHttpClient.Builder()
+ .addInterceptor(HttpRequestInterceptor())
+ .retryOnConnectionFailure(false)
+ .build()
+ }
+
+ @Provides
+ @Singleton
+ fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
+ return Retrofit.Builder()
+ .client(okHttpClient)
+ .baseUrl(TtoklipApplication.getString(R.string.base_url))
+ .addConverterFactory(ScalarsConverterFactory.create())
+ .addConverterFactory(GsonConverterFactory.create())
+ .build()
+ }
+
+ @Provides
+ @Singleton
+ fun provideTestApi(retrofit: Retrofit): TestApi {
+ return retrofit.buildService()
+ }
+
+ private inline fun Retrofit.buildService(): T {
+ return this.create(T::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/module/AppConfig.kt b/app/src/main/java/com/umc/ttoklip/module/AppConfig.kt
new file mode 100644
index 00000000..3ba13b6b
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/module/AppConfig.kt
@@ -0,0 +1,5 @@
+package com.umc.ttoklip.module
+
+object AppConfig {
+ const val TAG_DEBUG = "TAG_DEBUG"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/module/HandleApi.kt b/app/src/main/java/com/umc/ttoklip/module/HandleApi.kt
new file mode 100644
index 00000000..e884a7d3
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/module/HandleApi.kt
@@ -0,0 +1,37 @@
+package com.umc.ttoklip.module
+
+import com.umc.ttoklip.TtoklipApplication
+import com.umc.ttoklip.di.NetworkModule
+import retrofit2.Response
+
+suspend fun handleApi(
+ execute: suspend () -> Response,
+ mapper: (T) -> R
+): NetworkResult {
+ if (TtoklipApplication.isOnline().not()) {
+ return NetworkResult.Error(Exception(NetworkModule.NETWORK_EXCEPTION_OFFLINE_CASE))
+ }
+
+ return try {
+ val response = execute()
+ val body = response.body()
+ if (response.isSuccessful) {
+ body?.let {
+ NetworkResult.Success(mapper(it))
+ } ?: run {
+ throw NullPointerException(NetworkModule.NETWORK_EXCEPTION_BODY_IS_NULL)
+ }
+ } else {
+ getFailDataResult(body, response)
+ }
+ } catch (e: Exception) {
+ NetworkResult.Error(e)
+ }
+}
+
+
+private fun getFailDataResult(body: T?, response: Response) = body?.let {
+ NetworkResult.Fail(statusCode = response.code(), message = it.toString())
+} ?: run {
+ NetworkResult.Fail(statusCode = response.code(), message = response.message())
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/module/HttpRequestInterceptor.kt b/app/src/main/java/com/umc/ttoklip/module/HttpRequestInterceptor.kt
new file mode 100644
index 00000000..2d2d8f7c
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/module/HttpRequestInterceptor.kt
@@ -0,0 +1,19 @@
+package com.umc.ttoklip.module
+
+import android.util.Log
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class HttpRequestInterceptor : Interceptor {
+ override fun intercept(chain: Interceptor.Chain): Response {
+ try {
+ val originRequest = chain.request()
+ Log.d(AppConfig.TAG_DEBUG, "HttpRequestInterceptor: ${originRequest.url}")
+
+ return chain.proceed(originRequest)
+ } catch (e: Exception) {
+ Log.d(AppConfig.TAG_DEBUG, "HttpRequestInterceptor error: ${e.message}")
+ throw e
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/module/NetworkConnectionChecker.kt b/app/src/main/java/com/umc/ttoklip/module/NetworkConnectionChecker.kt
new file mode 100644
index 00000000..af9a5efd
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/module/NetworkConnectionChecker.kt
@@ -0,0 +1,34 @@
+package com.umc.ttoklip.module
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+
+class NetworkConnectionChecker(context: Context) : ConnectivityManager.NetworkCallback() {
+
+ private val networkRequest: NetworkRequest = NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .build()
+ private val connectivityManager: ConnectivityManager =
+ context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+
+ fun register() {
+ connectivityManager.registerNetworkCallback(networkRequest, this)
+ }
+
+ fun unregister() {
+ connectivityManager.unregisterNetworkCallback(this)
+ }
+
+ fun isOnline(): Boolean {
+ val nw = connectivityManager.activeNetwork ?: return false
+ val actNw = connectivityManager.getNetworkCapabilities(nw) ?: return false
+ return when {
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
+ else -> false
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/module/NetworkResult.kt b/app/src/main/java/com/umc/ttoklip/module/NetworkResult.kt
new file mode 100644
index 00000000..833f9365
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/module/NetworkResult.kt
@@ -0,0 +1,37 @@
+package com.umc.ttoklip.module
+
+sealed class NetworkResult {
+ data class Success(val data: T) : NetworkResult()
+ data class Fail(val statusCode: Int, val message: String) : NetworkResult()
+ data class Error(val exception: Exception) : NetworkResult()
+}
+
+inline fun NetworkResult.onSuccess(action: (T) -> Unit): NetworkResult {
+ if (this is NetworkResult.Success) {
+ action(data)
+ }
+ return this
+}
+
+inline fun NetworkResult.onFail(resultCode: (Int) -> Unit): NetworkResult {
+ if (this is NetworkResult.Fail) {
+ resultCode(this.statusCode)
+ }
+ return this
+}
+
+inline fun NetworkResult.onError(action: (Exception) -> Unit): NetworkResult {
+ if (this is NetworkResult.Fail) {
+ action(IllegalArgumentException("code : ${this.statusCode}, message : ${this.message}"))
+ } else if (this is NetworkResult.Error) {
+ action(this.exception)
+ }
+ return this
+}
+
+inline fun NetworkResult.onException(action: (Exception) -> Unit): NetworkResult {
+ if (this is NetworkResult.Error) {
+ action(this.exception)
+ }
+ return this
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/MainActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/MainActivity.kt
index e1556bc5..44b45040 100644
--- a/app/src/main/java/com/umc/ttoklip/presentation/MainActivity.kt
+++ b/app/src/main/java/com/umc/ttoklip/presentation/MainActivity.kt
@@ -2,11 +2,30 @@ package com.umc.ttoklip.presentation
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import androidx.navigation.fragment.NavHostFragment
+import androidx.navigation.ui.setupWithNavController
import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityMainBinding
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
+
+ lateinit var binding: ActivityMainBinding
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ val navHostFragment =
+ supportFragmentManager.findFragmentById(R.id.fragmentContainer) as NavHostFragment
+ val navController = navHostFragment.navController
+
+ binding.bottomNav.setupWithNavController(navController)
+ }
+
+ fun goNews() {
+ binding.bottomNav.selectedItemId = R.id.newsFragment
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/TownFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/TownFragment.kt
new file mode 100644
index 00000000..6c4691ea
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/TownFragment.kt
@@ -0,0 +1,60 @@
+package com.umc.ttoklip.presentation
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.umc.ttoklip.R
+
+// TODO: Rename parameter arguments, choose names that match
+// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+private const val ARG_PARAM1 = "param1"
+private const val ARG_PARAM2 = "param2"
+
+/**
+ * A simple [Fragment] subclass.
+ * Use the [TownFragment.newInstance] factory method to
+ * create an instance of this fragment.
+ */
+class TownFragment : Fragment() {
+ // TODO: Rename and change types of parameters
+ private var param1: String? = null
+ private var param2: String? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ arguments?.let {
+ param1 = it.getString(ARG_PARAM1)
+ param2 = it.getString(ARG_PARAM2)
+ }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_town, container, false)
+ }
+
+ companion object {
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment TownFragment.
+ */
+ // TODO: Rename and change types and number of parameters
+ @JvmStatic
+ fun newInstance(param1: String, param2: String) =
+ TownFragment().apply {
+ arguments = Bundle().apply {
+ putString(ARG_PARAM1, param1)
+ putString(ARG_PARAM2, param2)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmActivity.kt
new file mode 100644
index 00000000..ce31465a
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmActivity.kt
@@ -0,0 +1,35 @@
+package com.umc.ttoklip.presentation.alarm
+
+import android.content.Context
+import android.content.Intent
+import androidx.activity.viewModels
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityAlarmBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+
+class AlarmActivity : BaseActivity(R.layout.activity_alarm) {
+
+ private val viewModel: AlarmViewModel by viewModels()
+
+
+ override fun initView() {
+ binding.vm = viewModel
+ binding.backBtn.setOnClickListener {
+ finish()
+ }
+
+ }
+
+ override fun initObserver() {
+
+ }
+
+ companion object{
+ const val ALARM = "alarm"
+
+ fun newIntent(context : Context) =
+ Intent(context, AlarmActivity::class.java)
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModel.kt
new file mode 100644
index 00000000..a65e0679
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModel.kt
@@ -0,0 +1,4 @@
+package com.umc.ttoklip.presentation.alarm
+
+interface AlarmViewModel {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModelImpl.kt b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModelImpl.kt
new file mode 100644
index 00000000..43dd896f
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/alarm/AlarmViewModelImpl.kt
@@ -0,0 +1,6 @@
+package com.umc.ttoklip.presentation.alarm
+
+import androidx.lifecycle.ViewModel
+
+class AlarmViewModelImpl: AlarmViewModel, ViewModel() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/base/BaseActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseActivity.kt
new file mode 100644
index 00000000..35bd4072
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseActivity.kt
@@ -0,0 +1,26 @@
+package com.umc.ttoklip.presentation.base
+
+import android.os.Bundle
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.DataBindingUtil.setContentView
+import androidx.databinding.ViewDataBinding
+
+abstract class BaseActivity(@LayoutRes val layoutResource: Int) :
+ AppCompatActivity() {
+
+ private var _binding: V? = null
+ protected val binding: V get() = _binding!!
+ abstract fun initView()
+ protected abstract fun initObserver()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ _binding = DataBindingUtil.setContentView(this, layoutResource)
+ binding.lifecycleOwner = this
+ setContentView(binding.root)
+ initObserver()
+ initView()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/base/BaseBottomSheetDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseBottomSheetDialogFragment.kt
new file mode 100644
index 00000000..607572f4
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseBottomSheetDialogFragment.kt
@@ -0,0 +1,44 @@
+package com.umc.ttoklip.presentation.base
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.LayoutRes
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+
+abstract class BaseBottomSheetDialogFragment(@LayoutRes val layoutResource: Int) :
+ BottomSheetDialogFragment() {
+ private var _binding: V? = null
+ protected val binding: V get() = _binding!!
+ abstract fun initObserver()
+ abstract fun initView()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = DataBindingUtil.inflate(
+ layoutInflater,
+ layoutResource,
+ null,
+ false
+ )
+ binding.lifecycleOwner = this
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initObserver()
+ initView()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/base/BaseDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseDialogFragment.kt
new file mode 100644
index 00000000..05db9ded
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseDialogFragment.kt
@@ -0,0 +1,47 @@
+package com.umc.ttoklip.presentation.base
+
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.LayoutRes
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.DialogFragment
+
+abstract class BaseDialogFragment(@LayoutRes val layoutResource: Int) :
+ DialogFragment() {
+ private var _binding: V? = null
+ protected val binding: V get() = _binding!!
+ abstract fun initObserver()
+ abstract fun initView()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = DataBindingUtil.inflate(
+ layoutInflater,
+ layoutResource,
+ null,
+ false
+ )
+ binding.lifecycleOwner = this
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ initObserver()
+ initView()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/base/BaseFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseFragment.kt
new file mode 100644
index 00000000..6b821a45
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/base/BaseFragment.kt
@@ -0,0 +1,44 @@
+package com.umc.ttoklip.presentation.base
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.LayoutRes
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.Fragment
+
+abstract class BaseFragment(@LayoutRes val layoutResource: Int) : Fragment() {
+
+ private var _binding: V? = null
+ protected val binding: V get() = _binding!!
+ abstract fun initObserver()
+ abstract fun initView()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = DataBindingUtil.inflate(
+ layoutInflater,
+ layoutResource,
+ null,
+ false
+ )
+ binding.lifecycleOwner = this
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initObserver()
+ initView()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/home/HomeFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeFragment.kt
new file mode 100644
index 00000000..b1c5c937
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeFragment.kt
@@ -0,0 +1,70 @@
+package com.umc.ttoklip.presentation.home
+
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentHomeBinding
+import com.umc.ttoklip.presentation.MainActivity
+import com.umc.ttoklip.presentation.alarm.AlarmActivity
+import com.umc.ttoklip.presentation.base.BaseFragment
+import com.umc.ttoklip.presentation.news.adapter.Dummy
+import com.umc.ttoklip.presentation.news.adapter.NewsRVA
+import com.umc.ttoklip.presentation.news.detail.ArticleActivity
+import com.umc.ttoklip.presentation.search.SearchActivity
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.launch
+
+@AndroidEntryPoint
+class HomeFragment : BaseFragment(R.layout.fragment_home) {
+
+ private val viewModel: HomeViewModel by viewModels()
+ private val newsRVA by lazy {
+ NewsRVA(onClick = {
+ startActivity(ArticleActivity.newIntent(requireContext()))
+ }
+ )
+ }
+
+ override fun initObserver() {
+ viewLifecycleOwner.lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ viewModel.activityBus.collect {
+ when (it) {
+ HomeViewModel.ActivityEventBus.SEARCH -> {
+ startActivity(SearchActivity.newIntent(requireContext()))
+ }
+
+ HomeViewModel.ActivityEventBus.NEWS_DETAIL -> {
+ (requireActivity() as MainActivity).goNews()
+ }
+
+ HomeViewModel.ActivityEventBus.TIP_DETAIL -> {}
+
+ HomeViewModel.ActivityEventBus.ALARM -> {
+ startActivity(AlarmActivity.newIntent(requireContext()))
+ }
+
+ HomeViewModel.ActivityEventBus.GROUP_BUY_DETAIL -> {
+ (requireActivity() as MainActivity).goNews()
+ }
+
+ else -> {}
+ }
+ }
+ }
+ }
+ }
+
+ override fun initView() {
+ binding.vm = viewModel
+ binding.newsRV.adapter = newsRVA
+ newsRVA.submitList(
+ listOf(
+ Dummy("1"), Dummy("2"), Dummy("3")
+ )
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModel.kt
new file mode 100644
index 00000000..134e6b32
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModel.kt
@@ -0,0 +1,26 @@
+package com.umc.ttoklip.presentation.home
+
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.StateFlow
+
+interface HomeViewModel {
+ val haveWork : StateFlow
+ val doneWork : StateFlow
+ val activityBus : SharedFlow
+
+ fun clickDelayWork()
+ fun clickDoneWork()
+ fun clickMoreNews()
+ fun clickMoreTip()
+ fun clickMoreGroupBuy()
+ fun clickAlarm()
+ fun clickSearch()
+
+ enum class ActivityEventBus{
+ SEARCH,
+ NEWS_DETAIL,
+ TIP_DETAIL,
+ ALARM,
+ GROUP_BUY_DETAIL
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModelImpl.kt b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModelImpl.kt
new file mode 100644
index 00000000..c43717ac
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/home/HomeViewModelImpl.kt
@@ -0,0 +1,79 @@
+package com.umc.ttoklip.presentation.home
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.umc.ttoklip.module.NetworkResult
+import com.umc.ttoklip.module.onException
+import com.umc.ttoklip.module.onFail
+import com.umc.ttoklip.module.onSuccess
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.launch
+import java.io.IOException
+import javax.inject.Inject
+
+@HiltViewModel
+class HomeViewModelImpl @Inject constructor(
+
+): ViewModel(),HomeViewModel {
+
+ private val _haveWork: MutableStateFlow = MutableStateFlow(true)
+ override val haveWork: StateFlow
+ get() = _haveWork
+
+ private val _doneWork : MutableStateFlow = MutableStateFlow(false)
+ override val doneWork: StateFlow
+ get() = _doneWork
+
+ private val _activityBus = MutableSharedFlow()
+ override val activityBus: SharedFlow
+ get() = _activityBus.asSharedFlow()
+ override fun clickDelayWork() {
+ viewModelScope.launch {
+ _haveWork.emit(haveWork.value.not())
+ }
+ }
+
+ override fun clickDoneWork() {
+ viewModelScope.launch {
+ _doneWork.emit(doneWork.value.not())
+ }
+ }
+
+ override fun clickMoreNews() {
+ viewModelScope.launch {
+ _activityBus.emit(HomeViewModel.ActivityEventBus.NEWS_DETAIL)
+ }
+ }
+
+ override fun clickMoreTip() {
+ viewModelScope.launch {
+ _activityBus.emit(HomeViewModel.ActivityEventBus.TIP_DETAIL)
+ }
+ }
+
+ override fun clickMoreGroupBuy() {
+ viewModelScope.launch {
+ _activityBus.emit(HomeViewModel.ActivityEventBus.GROUP_BUY_DETAIL)
+ }
+ }
+
+ override fun clickAlarm() {
+ viewModelScope.launch {
+ _activityBus.emit(HomeViewModel.ActivityEventBus.ALARM)
+ }
+ }
+
+ override fun clickSearch() {
+ viewModelScope.launch {
+ _activityBus.emit(HomeViewModel.ActivityEventBus.SEARCH)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/DetailHoneyTipFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/DetailHoneyTipFragment.kt
new file mode 100644
index 00000000..1b0a6bc2
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/DetailHoneyTipFragment.kt
@@ -0,0 +1,20 @@
+package com.umc.ttoklip.presentation.honeytip
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.umc.ttoklip.databinding.FragmentDetailHoneyTipBinding
+
+class DetailHoneyTipFragment: Fragment() {
+ private lateinit var binding: FragmentDetailHoneyTipBinding
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentDetailHoneyTipBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipFragment.kt
new file mode 100644
index 00000000..30166f64
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipFragment.kt
@@ -0,0 +1,70 @@
+package com.umc.ttoklip.presentation.honeytip
+
+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.core.content.ContextCompat.startActivity
+import androidx.fragment.app.Fragment
+import com.google.android.material.tabs.TabLayout
+import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
+import com.google.android.material.tabs.TabLayoutMediator
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentHoneyTipBinding
+import com.umc.ttoklip.presentation.base.BaseFragment
+import com.umc.ttoklip.presentation.honeytip.adapter.HoneyTipAndQuestionVPA
+import com.umc.ttoklip.presentation.honeytip.write.WriteHoneyTipActivity
+
+
+class HoneyTipFragment: BaseFragment(R.layout.fragment_honey_tip) {
+ private var board = 0
+ override fun initObserver() {
+
+ }
+
+ override fun initView() {
+
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initTabLayout()
+ view
+ binding.writeFab.setOnClickListener {
+ val intent = Intent(activity, WriteHoneyTipActivity::class.java)
+ intent.putExtra("caller", "writeFab")
+ startActivity(intent)
+ }
+ }
+ private fun initTabLayout(){
+ val tabTitles = listOf("꿀팁 공유", "질문해요")
+ binding.boardVp.adapter = HoneyTipAndQuestionVPA(this)
+ binding.boardVp.isUserInputEnabled = false
+
+ TabLayoutMediator(binding.boardTablayout, binding.boardVp){ tab, position ->
+ for (i in tabTitles.indices){
+ tab.text = tabTitles[position]
+ }
+ }.attach()
+ binding.boardTablayout.addOnTabSelectedListener(object : OnTabSelectedListener{
+ override fun onTabSelected(tab: TabLayout.Tab?) {
+
+ }
+
+ override fun onTabUnselected(tab: TabLayout.Tab?) {
+
+ }
+
+ override fun onTabReselected(tab: TabLayout.Tab?) {
+
+ }
+
+ })
+ }
+ fun updateBoard(){
+ board = binding.boardTablayout.selectedTabPosition
+ Log.d("board", board.toString())
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipListFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipListFragment.kt
new file mode 100644
index 00000000..ba860d45
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipListFragment.kt
@@ -0,0 +1,67 @@
+package com.umc.ttoklip.presentation.honeytip
+
+import android.content.Intent
+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.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.umc.ttoklip.databinding.FragmentHoneyTipListBinding
+import com.umc.ttoklip.presentation.honeytip.adapter.HoneyTipListRVA
+import com.umc.ttoklip.presentation.honeytip.adapter.HoneyTips
+import com.umc.ttoklip.presentation.honeytip.adapter.OnItemClickListener
+import com.umc.ttoklip.presentation.honeytip.read.ReadActivity
+
+class HoneyTipListFragment: Fragment(), OnItemClickListener {
+ private lateinit var binding: FragmentHoneyTipListBinding
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentHoneyTipListBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initRV()
+ }
+
+ private fun initRV() {
+ val honeyTipList = listOf(
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0),
+ )
+
+ binding.rv.layoutManager =
+ LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+ val honeyTipListRVA = HoneyTipListRVA(this)
+ binding.rv.addItemDecoration(
+ DividerItemDecoration(
+ requireContext(),
+ LinearLayoutManager.VERTICAL
+ )
+ )
+ binding.rv.adapter = honeyTipListRVA
+ honeyTipListRVA.submitList(honeyTipList)
+
+ }
+
+ override fun onClick(honeyTips: HoneyTips) {
+ val intent = Intent(activity, ReadActivity::class.java)
+ intent.putExtra("caller", "honeyTipList")
+ startActivity(intent)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipViewModel.kt
new file mode 100644
index 00000000..3ce49964
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/HoneyTipViewModel.kt
@@ -0,0 +1,10 @@
+package com.umc.ttoklip.presentation.honeytip
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class HoneyTipViewModel: ViewModel() {
+ val boardLiveData: LiveData by lazy { _boardLiveData }
+ private val _boardLiveData by lazy { MutableLiveData() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/PageDecoration.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/PageDecoration.kt
new file mode 100644
index 00000000..6379485c
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/PageDecoration.kt
@@ -0,0 +1,17 @@
+package com.umc.ttoklip.presentation.honeytip
+
+import android.graphics.Rect
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+
+class PageDecoration(private val margin: Int): RecyclerView.ItemDecoration() {
+ override fun getItemOffsets(
+ outRect: Rect,
+ view: View,
+ parent: RecyclerView,
+ state: RecyclerView.State
+ ) {
+ outRect.left = margin
+ outRect.right = margin
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/ShareHoneyTipFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/ShareHoneyTipFragment.kt
new file mode 100644
index 00000000..dd5ef8ee
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/ShareHoneyTipFragment.kt
@@ -0,0 +1,70 @@
+package com.umc.ttoklip.presentation.honeytip
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.google.android.material.tabs.TabLayoutMediator
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentShareHoneyTipBinding
+import com.umc.ttoklip.presentation.honeytip.adapter.CategoryVPA
+import com.umc.ttoklip.presentation.honeytip.adapter.DailyPopularHoneyTipsVPA
+
+class ShareHoneyTipFragment: Fragment() {
+ private lateinit var binding: FragmentShareHoneyTipBinding
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentShareHoneyTipBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initPopularHoneyTipsViewPager(85, 30)
+ initCategoryViewPager()
+ }
+
+ private fun initPopularHoneyTipsViewPager(previewWidth: Int, itemMargin: Int) {
+ val decoMargin = previewWidth + itemMargin
+ val pageTransX = decoMargin + previewWidth
+ val decoration = PageDecoration(decoMargin)
+ binding.popularHoneyTipsVp.apply {
+ offscreenPageLimit = 1
+ addItemDecoration(decoration)
+ adapter = DailyPopularHoneyTipsVPA()
+ binding.indicator.attachTo(this)
+ setPageTransformer { page, position ->
+ page.translationX = position * -pageTransX
+ when {
+ position < -1 -> {
+ page.background =
+ resources.getDrawable(R.drawable.item_daily_popular_honey_tip_external_background)
+ }
+
+ position <= 0.5 && position >= -0.5 -> {
+ page.background =
+ resources.getDrawable(R.drawable.item_daily_popular_honey_tip_background)
+ }
+
+ else -> {
+ page.background =
+ resources.getDrawable(R.drawable.item_daily_popular_honey_tip_external_background)
+ }
+ }
+ }
+ }
+ }
+
+ private fun initCategoryViewPager(){
+ val tabTitles = listOf("집안일", "요리", "안전한 생활", "복지 \u00b7 정책")
+ binding.categoryVp.adapter = CategoryVPA(this, tabTitles.size)
+
+ TabLayoutMediator(binding.categoryTablayout, binding.categoryVp){ tab, position ->
+ tab.text = tabTitles[position]
+ }.attach()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CategoryVPA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CategoryVPA.kt
new file mode 100644
index 00000000..230a1283
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CategoryVPA.kt
@@ -0,0 +1,17 @@
+package com.umc.ttoklip.presentation.honeytip.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.umc.ttoklip.presentation.honeytip.HoneyTipListFragment
+
+class CategoryVPA (fragment: Fragment, private val count: Int): FragmentStateAdapter(fragment) {
+ /*private var fragmentList = for (i in 0..count){
+ mutableListOf(ShareHoneyTipFragment(), HoneyTipListFragment())}*/
+ override fun getItemCount(): Int {
+ return count
+ }
+
+ override fun createFragment(position: Int): Fragment {
+ return HoneyTipListFragment()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CustomSpinnerAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CustomSpinnerAdapter.kt
new file mode 100644
index 00000000..c00488c3
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/CustomSpinnerAdapter.kt
@@ -0,0 +1,58 @@
+import android.R
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.TextView
+import com.umc.ttoklip.databinding.SpinnerInnerViewBinding
+import com.umc.ttoklip.databinding.SpinnerOuterViewBinding
+
+class CustomSpinnerAdapter(context: Context, private val list: List?) :
+ BaseAdapter() {
+ private val inflater: LayoutInflater
+
+ // 스피너에서 선택된 아이템을 액티비티에서 꺼내오는 메서드
+ var item: String? = null
+ private set
+
+ init {
+ inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+ }
+
+ override fun getCount(): Int {
+ return list?.size ?: 0
+ }
+
+ override fun getItem(position: Int): Any {
+ return list!![position]
+ }
+
+ override fun getItemId(position: Int): Long {
+ return position.toLong()
+ }
+
+ // 화면에 들어왔을 때 보여지는 텍스트뷰 설정
+ override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
+ var convertView = convertView
+ val binding = SpinnerOuterViewBinding.inflate(inflater, parent, false)
+ if (convertView == null) convertView = binding.root
+ if (list != null) {
+ item = list[position]
+ binding.spinnerOuterTv.text = item
+ }
+ return convertView
+ }
+
+ // 클릭 후 나타나는 텍스트뷰 설정
+ override fun getDropDownView(position: Int, convertView: View, parent: ViewGroup): View {
+ var convertView = convertView
+ val binding = SpinnerInnerViewBinding.inflate(inflater, parent, false)
+ if (convertView == null) convertView = binding.root
+ if (list != null) {
+ item = list[position]
+ binding.spinnerInnerTv.text = item
+ }
+ return convertView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/DailyPopularHoneyTipsVPA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/DailyPopularHoneyTipsVPA.kt
new file mode 100644
index 00000000..cafce9e4
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/DailyPopularHoneyTipsVPA.kt
@@ -0,0 +1,55 @@
+package com.umc.ttoklip.presentation.honeytip.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemDailyPopularHoneyTipBinding
+
+class DailyPopularHoneyTipsVPA: RecyclerView.Adapter() {
+ private var popularHoneyTipsList = listOf(
+ PopularHoneyTips("똑리비", "삘래 후, 냄새가 난다면?", "빨래를 돌렸는데 냄새가 나는 것 같거나 옷이 오히려 더러워진 것 같으시면 세탁기 청소 상태 문제일 수도 있어요. 세탁기 내부에 있는 먼지 거름망을 확인..",
+ 0, 0, 0),
+ PopularHoneyTips("똑리비", "삘래 후, 냄새가 난다면?", "빨래를 돌렸는데 냄새가 나는 것 같거나 옷이 오히려 더러워진 것 같으시면 세탁기 청소 상태 문제일 수도 있어요. 세탁기 내부에 있는 먼지 거름망을 확인..",
+ 0, 0, 0),
+ PopularHoneyTips("똑리비", "삘래 후, 냄새가 난다면?", "빨래를 돌렸는데 냄새가 나는 것 같거나 옷이 오히려 더러워진 것 같으시면 세탁기 청소 상태 문제일 수도 있어요. 세탁기 내부에 있는 먼지 거름망을 확인..",
+ 0, 0, 0),
+ PopularHoneyTips("똑리비", "삘래 후, 냄새가 난다면?", "빨래를 돌렸는데 냄새가 나는 것 같거나 옷이 오히려 더러워진 것 같으시면 세탁기 청소 상태 문제일 수도 있어요. 세탁기 내부에 있는 먼지 거름망을 확인..",
+ 0, 0, 0),
+ PopularHoneyTips("똑리비", "삘래 후, 냄새가 난다면?", "빨래를 돌렸는데 냄새가 나는 것 같거나 옷이 오히려 더러워진 것 같으시면 세탁기 청소 상태 문제일 수도 있어요. 세탁기 내부에 있는 먼지 거름망을 확인..",
+ 0, 0, 0)
+ )
+ inner class DailyPopularHoneyTipsViewHolder(private val binding: ItemDailyPopularHoneyTipBinding): RecyclerView.ViewHolder(binding.root){
+ fun bind(popularHoneyTips: PopularHoneyTips){
+ binding.writerTv.text = popularHoneyTips.writer
+ binding.honeyTipTitleTv.text = popularHoneyTips.title
+ binding.honeyTipBodyContentTv.text = popularHoneyTips.body
+ binding.starCountTv.text = popularHoneyTips.starCount.toString()
+ binding.likeCountTv.text = popularHoneyTips.likeCount.toString()
+ binding.commentCountTv.text = popularHoneyTips.commentCount.toString()
+ }
+ }
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyPopularHoneyTipsViewHolder {
+ return DailyPopularHoneyTipsViewHolder(
+ ItemDailyPopularHoneyTipBinding.inflate(
+ LayoutInflater.from(parent.context), parent, false
+ )
+ )
+ }
+
+ override fun getItemCount(): Int {
+ return popularHoneyTipsList.size
+ }
+
+ override fun onBindViewHolder(holder: DailyPopularHoneyTipsViewHolder, position: Int) {
+ holder.bind(popularHoneyTipsList[position])
+ }
+}
+
+data class PopularHoneyTips(
+ val writer: String,
+ val title: String,
+ val body: String,
+ val starCount: Int = 0,
+ val likeCount: Int = 0,
+ val commentCount: Int = 0,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipAndQuestionVPA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipAndQuestionVPA.kt
new file mode 100644
index 00000000..4c332fab
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipAndQuestionVPA.kt
@@ -0,0 +1,16 @@
+package com.umc.ttoklip.presentation.honeytip.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.umc.ttoklip.presentation.honeytip.ShareHoneyTipFragment
+
+class HoneyTipAndQuestionVPA(fragment: Fragment): FragmentStateAdapter(fragment) {
+ private var fragmentList = mutableListOf(ShareHoneyTipFragment(), ShareHoneyTipFragment())
+ override fun getItemCount(): Int {
+ return fragmentList.size
+ }
+
+ override fun createFragment(position: Int): Fragment {
+ return fragmentList[position]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt
new file mode 100644
index 00000000..2dfb2a22
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt
@@ -0,0 +1,57 @@
+package com.umc.ttoklip.presentation.honeytip.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemListHoneyTipBinding
+
+class HoneyTipListRVA(private var listener: OnItemClickListener): ListAdapter(object: DiffUtil.ItemCallback(){
+ override fun areItemsTheSame(oldItem: HoneyTips, newItem: HoneyTips): Boolean {
+ return oldItem.writer == newItem.writer && oldItem.title == newItem.title
+ }
+
+ override fun areContentsTheSame(oldItem: HoneyTips, newItem: HoneyTips): Boolean {
+ return oldItem == newItem
+ }
+
+}){
+ inner class HoneyTipListViewHolder(private val binding: ItemListHoneyTipBinding): RecyclerView.ViewHolder(binding.root){
+ fun bind(honeyTips: HoneyTips){
+ binding.titleTv.text = honeyTips.title
+ binding.writerTv.text = honeyTips.writer
+ binding.dateTv.text = honeyTips.date
+ binding.bodyTv.text = honeyTips.body
+ binding.commentCountTv.text = honeyTips.chatCnt.toString()
+
+ binding.root.setOnClickListener {
+ listener.onClick(honeyTips)
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HoneyTipListViewHolder {
+ return HoneyTipListViewHolder(
+ ItemListHoneyTipBinding.inflate(
+ LayoutInflater.from(parent.context), parent, false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: HoneyTipListViewHolder, position: Int) {
+ holder.bind(currentList[position])
+ }
+}
+
+interface OnItemClickListener {
+ fun onClick(honeyTips: HoneyTips)
+}
+
+data class HoneyTips(
+ val writer: String,
+ val title: String,
+ val body: String,
+ val date: String,
+ val chatCnt: Int = 0,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/ImageRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/ImageRVA.kt
new file mode 100644
index 00000000..a57a23cd
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/ImageRVA.kt
@@ -0,0 +1,42 @@
+package com.umc.ttoklip.presentation.honeytip.adapter
+
+import android.net.Uri
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemImageBinding
+
+class ImageRVA: ListAdapter(object : DiffUtil.ItemCallback(){
+ override fun areItemsTheSame(oldItem: Image, newItem: Image): Boolean {
+ return oldItem === newItem
+ }
+
+ override fun areContentsTheSame(oldItem: Image, newItem: Image): Boolean {
+ return oldItem == newItem
+ }
+
+}) {
+ inner class ImageViewHolder(private val binding: ItemImageBinding): RecyclerView.ViewHolder(binding.root){
+ fun bind(image: Image){
+ binding.iv.setImageURI(image.uri)
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
+ return ImageViewHolder(
+ ItemImageBinding.inflate(
+ LayoutInflater.from(parent.context), parent, false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
+ holder.bind(currentList[position])
+ }
+}
+
+data class Image(
+ val uri: Uri
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialog.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialog.kt
new file mode 100644
index 00000000..51957799
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialog.kt
@@ -0,0 +1,42 @@
+package com.umc.ttoklip.presentation.honeytip.dialog
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.view.LayoutInflater
+import com.umc.ttoklip.databinding.DialogImageBinding
+
+class ImageDialog(context: Context): Dialog(context){
+ private lateinit var dialogClickListener: DialogClickListener
+ private lateinit var binding: DialogImageBinding
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = DialogImageBinding.inflate(LayoutInflater.from(context))
+ setContentView(binding.root)
+
+ window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+
+ setCanceledOnTouchOutside(true)
+
+ setCancelable(true)
+
+ binding.cancelBtn.setOnClickListener {
+ dismiss()
+ }
+ binding.acceptBtn.setOnClickListener {
+ dialogClickListener.onClick()
+ dismiss()
+ }
+ }
+
+ fun setDialogClickListener(dialogClickListener: DialogClickListener){
+ this.dialogClickListener = dialogClickListener
+ }
+
+ interface DialogClickListener{
+ fun onClick()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialogFragment.kt
new file mode 100644
index 00000000..3b81ddf0
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/dialog/ImageDialogFragment.kt
@@ -0,0 +1,30 @@
+package com.umc.ttoklip.presentation.honeytip.dialog
+
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.DialogImageBinding
+import com.umc.ttoklip.presentation.base.BaseDialogFragment
+
+class ImageDialogFragment: BaseDialogFragment(R.layout.dialog_image) {
+ private lateinit var dialogClickListener: DialogClickListener
+ override fun initObserver() {
+
+ }
+
+ override fun initView() {
+ binding.cancelBtn.setOnClickListener {
+ dismiss()
+ }
+ binding.acceptBtn.setOnClickListener {
+ dialogClickListener.onClick()
+ dismiss()
+ }
+ }
+
+ fun setDialogClickListener(dialogClickListener: DialogClickListener){
+ this.dialogClickListener = dialogClickListener
+ }
+
+ interface DialogClickListener{
+ fun onClick()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/read/ReadActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/read/ReadActivity.kt
new file mode 100644
index 00000000..8a5bf986
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/read/ReadActivity.kt
@@ -0,0 +1,22 @@
+package com.umc.ttoklip.presentation.honeytip.read
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import androidx.databinding.DataBindingUtil.setContentView
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityReadBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import com.umc.ttoklip.presentation.honeytip.DetailHoneyTipFragment
+import com.umc.ttoklip.presentation.honeytip.write.WriteHoneyTipFragment
+
+class ReadActivity : BaseActivity(R.layout.activity_read) {
+ override fun initView() {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.container, DetailHoneyTipFragment())
+ .commit()
+ }
+
+ override fun initObserver() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipActivity.kt
new file mode 100644
index 00000000..7b5d0e91
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipActivity.kt
@@ -0,0 +1,32 @@
+package com.umc.ttoklip.presentation.honeytip.write
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityHoneyTipBinding
+import com.umc.ttoklip.presentation.honeytip.DetailHoneyTipFragment
+
+class WriteHoneyTipActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityHoneyTipBinding
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityHoneyTipBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ val transaction = supportFragmentManager.beginTransaction()
+ when(intent.getStringExtra("caller")){
+ "writeFab" -> {
+ transaction
+ .replace(R.id.container, WriteHoneyTipFragment())
+ .commit()
+ }
+ else -> {
+ transaction
+ .replace(R.id.container, DetailHoneyTipFragment())
+ .commit()
+ }
+ }
+ binding.backBtn.setOnClickListener {
+ finish()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipFragment.kt
new file mode 100644
index 00000000..d07f3058
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipFragment.kt
@@ -0,0 +1,228 @@
+package com.umc.ttoklip.presentation.honeytip.write
+
+
+import android.graphics.Typeface
+import android.net.Uri
+import android.os.Bundle
+import android.util.Log
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.activity.result.PickVisualMediaRequest
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.content.res.ResourcesCompat
+import androidx.lifecycle.ViewModelProvider
+import com.google.android.material.tabs.TabLayout
+import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentWriteHoneyTipBinding
+import com.umc.ttoklip.presentation.base.BaseFragment
+import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialog
+import com.umc.ttoklip.presentation.honeytip.adapter.Image
+import com.umc.ttoklip.presentation.honeytip.adapter.ImageRVA
+import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment
+
+
+class WriteHoneyTipFragment : BaseFragment(R.layout.fragment_write_honey_tip) {
+ /*private val imageLoadLauncher = registerForActivityResult(
+ ActivityResultContracts.GetMultipleContents()
+ ) { uriList ->
+ updateImages(uriList)
+ }*/
+ private val pickMultipleMedia = registerForActivityResult(
+ ActivityResultContracts.PickMultipleVisualMedia(
+ 100
+ )
+ ) { uris ->
+ if (uris.isNotEmpty()) {
+ updateImages(uris)
+ } else {
+ Log.d("PhotoPicker", "No media selected")
+ }
+ }
+ private lateinit var viewModel: WriteHoneyTipViewModel
+ private lateinit var imageAdapter: ImageRVA
+ override fun initObserver() {
+
+ }
+
+ override fun initView() {
+
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ initTabLayout()
+ initImageRVA()
+ addLink()
+ addImage()
+ viewModel = ViewModelProvider(this).get(WriteHoneyTipViewModel::class.java)
+ binding.viewModel = viewModel
+
+ viewModel.titleLiveData.observe(viewLifecycleOwner) {
+ val isTitleEmpty = !binding.titleEt.text.isNullOrEmpty()
+ }
+
+ viewModel.bodyLiveData.observe(viewLifecycleOwner) {
+ val isBodyEmpty = !binding.bodyEt.text.isNullOrEmpty()
+ }
+
+ binding.bodyEt.setOnTouchListener { v, event ->
+ if (v.id == com.umc.ttoklip.R.id.body_et) {
+ v.parent.requestDisallowInterceptTouchEvent(true)
+ when (event.action and MotionEvent.ACTION_MASK) {
+ MotionEvent.ACTION_UP -> v.parent.requestDisallowInterceptTouchEvent(false)
+ }
+ }
+ false
+ }
+ }
+
+ private fun initImageRVA() {
+ imageAdapter = ImageRVA()
+ binding.imageRv.adapter = imageAdapter
+ }
+
+ private fun initTabLayout() {
+ val tabTitles = listOf("집안일", "요리", "안전한 생활", "사기", "복지 \u00b7 정책")
+ for (i in tabTitles.indices) {
+ binding.tabLayout.addTab(binding.tabLayout.newTab().setText(tabTitles[i]))
+ }
+
+ setTabItemMargin(binding.tabLayout, 40)
+ setSelectedTabTextStyleBold()
+ }
+
+ private fun setTabItemMargin(tabLayout: TabLayout, marginEnd: Int = 20) {
+ for (i in 0 until 3) {
+ val tabs = tabLayout.getChildAt(0) as ViewGroup
+ for (i in 0 until tabs.childCount) {
+ val tab = tabs.getChildAt(i)
+ val lp = tab.layoutParams as LinearLayout.LayoutParams
+ lp.marginEnd = marginEnd
+ // -1: wrap_content, -2: match_parent
+ lp.height = -2
+ tab.layoutParams = lp
+ tabLayout.requestLayout()
+ }
+ }
+ }
+
+ private fun setSelectedTabTextStyleBold() {
+ binding.tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
+ override fun onTabSelected(tab: TabLayout.Tab?) {
+ val tabLayout =
+ (binding.tabLayout.getChildAt(0) as ViewGroup).getChildAt(tab!!.position) as LinearLayout
+ val tabTextView = tabLayout.getChildAt(1) as TextView
+ val typeface =
+ ResourcesCompat.getFont(
+ requireContext(),
+ com.umc.ttoklip.R.font.pretendard_bold
+ )
+ tabTextView.setTypeface(typeface, Typeface.NORMAL)
+ }
+
+ override fun onTabUnselected(tab: TabLayout.Tab?) {
+ val tabLayout =
+ (binding.tabLayout.getChildAt(0) as ViewGroup).getChildAt(tab!!.position) as LinearLayout
+ val tabTextView = tabLayout.getChildAt(1) as TextView
+ val typeface =
+ ResourcesCompat.getFont(
+ requireContext(),
+ com.umc.ttoklip.R.font.pretendard_medium
+ )
+ tabTextView.setTypeface(typeface, Typeface.NORMAL)
+ }
+
+ override fun onTabReselected(tab: TabLayout.Tab?) {
+ }
+ })
+ }
+
+ private fun addLink() {
+ binding.addLinkBtn.setOnClickListener {
+ binding.addLinkBtn.visibility = View.GONE
+ binding.inputUrlBtn.visibility = View.VISIBLE
+ }
+ }
+
+ private fun addImage() {
+ binding.addImageBtn.setOnClickListener {
+ /*val imageDialog = ImageDialog(requireContext())
+ imageDialog.setDialogClickListener(object : ImageDialog.DialogClickListener {
+ override fun onClick() {
+ binding.imageRv.visibility = View.VISIBLE
+ pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
+ }
+ })
+ imageDialog.show()*/
+
+ val imageDialog = ImageDialogFragment()
+ imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener{
+ override fun onClick() {
+ binding.imageRv.visibility = View.VISIBLE
+ pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
+ }
+ })
+ imageDialog.show(parentFragmentManager, imageDialog.toString())
+ }
+ }
+
+ private fun updateImages(uriList: List) {
+ val images = uriList.map { Image(it) }
+ val updatedImages = imageAdapter.currentList.toMutableList().apply { addAll(images) }
+ imageAdapter.submitList(updatedImages)
+ }
+}
+
+
+ /*
+ private fun checkPermission() {
+ when {
+ ContextCompat.checkSelfPermission(
+ requireContext(),
+ android.Manifest.permission.READ_EXTERNAL_STORAGE
+ ) == PackageManager.PERMISSION_GRANTED -> {
+ loadImage()
+ }
+
+ ActivityCompat.shouldShowRequestPermissionRationale(
+ requireActivity(), android.Manifest.permission.READ_EXTERNAL_STORAGE
+ ) -> {
+ showPermissionInfoDialog()
+ }
+
+ else -> {
+ requestReadExternalStorage()
+ }
+ }
+ }
+
+ private fun showPermissionInfoDialog() {
+ AlertDialog.Builder(requireContext()).apply {
+ setMessage("이미지를 가져오기 위해서, 외부 저장소 읽기 권한이 필요합니다.")
+ setPositiveButton("동의") { _, _ ->
+ requestReadExternalStorage()
+ }
+ setNegativeButton("취소", null)
+ }.show()
+ }
+
+ private fun requestReadExternalStorage() {
+ ActivityCompat.requestPermissions(
+ requireActivity(),
+ arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
+ REQUEST_READ_EXTERNAL_STORAGE
+ )
+ }
+
+ private fun loadImage() {
+ imageLoadLauncher.launch("image/*")
+ }
+
+ companion object {
+ const val REQUEST_READ_EXTERNAL_STORAGE = 100
+ }*/
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipViewModel.kt
new file mode 100644
index 00000000..ceaccd12
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/write/WriteHoneyTipViewModel.kt
@@ -0,0 +1,13 @@
+package com.umc.ttoklip.presentation.honeytip.write
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class WriteHoneyTipViewModel: ViewModel() {
+ val titleLiveData: LiveData by lazy { _titleLiveData }
+ private val _titleLiveData by lazy { MutableLiveData() }
+
+ val bodyLiveData: LiveData by lazy { _bodyLiveData }
+ private val _bodyLiveData by lazy { MutableLiveData() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/intro/IntroActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/intro/IntroActivity.kt
new file mode 100644
index 00000000..0b7204ae
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/intro/IntroActivity.kt
@@ -0,0 +1,24 @@
+package com.umc.ttoklip.presentation.intro
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivitySplashBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+
+class IntroActivity:BaseActivity(R.layout.activity_intro){
+ override fun initView() {
+ val handler= Handler(Looper.getMainLooper())
+ handler.postDelayed({
+ //activity 이름 알아오기
+ //startActivity(Intent(this,MainActivity::class.java))
+ },2000)
+ }
+ override fun initObserver() {
+ }
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt
new file mode 100644
index 00000000..5d9d6820
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt
@@ -0,0 +1,13 @@
+package com.umc.ttoklip.presentation.intro
+
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivitySplashBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+
+class SplashActivity:BaseActivity(R.layout.activity_splash) {
+ override fun initView() {
+ }
+
+ override fun initObserver() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt
new file mode 100644
index 00000000..e184a204
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ChooseMainInterestDialogFragment.kt
@@ -0,0 +1,105 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.util.Log
+import com.google.android.material.chip.Chip
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentChooseMainInterestBinding
+import com.umc.ttoklip.presentation.base.BaseBottomSheetDialogFragment
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ChooseMainInterestDialogFragment(private val btnClickListener: (List) -> Unit) :
+ BaseBottomSheetDialogFragment(R.layout.fragment_choose_main_interest) {
+ private val interest = ArrayList()
+ override fun initObserver() = Unit
+
+ override fun initView() {
+ with(binding) {
+ noInterestChip.setOnClickListener {
+ removeAllInterest()
+ }
+ houseworkChip.setOnClickListener {
+ changeInterest(houseworkChip)
+ }
+ cookingChip.setOnClickListener {
+ changeInterest(cookingChip)
+ }
+ safeLifeChip.setOnClickListener {
+ changeInterest(safeLifeChip)
+ }
+ fraudChip.setOnClickListener {
+ changeInterest(fraudChip)
+ }
+ welfarePolicyChip.setOnClickListener {
+ changeInterest(welfarePolicyChip)
+ }
+ chooseBtn.setOnClickListener {
+ if (interest.isNotEmpty()) {
+ btnClickListener(interest.toList())
+ dismiss()
+ }
+ }
+ }
+ }
+
+ private fun changeInterest(chip: Chip) {
+ Log.d("chip", chip.text.toString())
+ if (binding.noInterestChip.tag == YES_INTERESTING) {
+ removeInterest(binding.noInterestChip)
+ }
+ if (chip.tag == NOT_INTERESTING) {
+ addInterest(chip)
+ } else {
+ removeInterest(chip)
+ }
+ checkInterest()
+ }
+
+ private fun removeAllInterest() {
+ with(binding) {
+ if (noInterestChip.tag == NOT_INTERESTING) {
+ removeInterest(houseworkChip)
+ removeInterest(cookingChip)
+ removeInterest(safeLifeChip)
+ removeInterest(fraudChip)
+ removeInterest(welfarePolicyChip)
+ addInterest(noInterestChip)
+ } else {
+ removeInterest(noInterestChip)
+ }
+ }
+ checkInterest()
+ }
+
+ private fun addInterest(chip: Chip) {
+ chip.tag = YES_INTERESTING
+ chip.setChipBackgroundColorResource(R.color.yellow)
+ chip.setChipStrokeColorResource(R.color.yellow)
+ interest.add(chip.text.toString())
+ }
+
+ private fun removeInterest(chip: Chip) {
+ chip.tag = NOT_INTERESTING
+ chip.setChipBackgroundColorResource(R.color.white)
+ chip.setChipStrokeColorResource(R.color.gray40)
+ interest.remove(chip.text.toString())
+ }
+
+ private fun checkInterest() {
+ with(binding.chooseBtn) {
+ if (interest.isNotEmpty()) {
+ setBackgroundResource(R.drawable.yellow_btn_background)
+ setTextAppearance(R.style.TextAppearance_App_16sp_700)
+ } else {
+ setBackgroundResource(R.drawable.rectangle_corner_10_strok_1_black)
+ setTextAppearance(R.style.TextAppearance_App_16sp_500)
+ }
+ }
+
+ }
+
+ companion object {
+ private const val NOT_INTERESTING = "NO"
+ private const val YES_INTERESTING = "YES"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/InputIndependentCareerDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/InputIndependentCareerDialogFragment.kt
new file mode 100644
index 00000000..0f5753d4
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/InputIndependentCareerDialogFragment.kt
@@ -0,0 +1,47 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.os.Build
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.widget.NumberPicker
+import androidx.annotation.RequiresApi
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentInputIndependentCareerBinding
+import com.umc.ttoklip.presentation.base.BaseBottomSheetDialogFragment
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class InputIndependentCareerDialogFragment(private val btnClickListener: (Int, Int) -> Unit) :
+ BaseBottomSheetDialogFragment(R.layout.fragment_input_independent_career) {
+ override fun initObserver() = Unit
+
+ @RequiresApi(Build.VERSION_CODES.Q)
+ override fun initView() {
+ this@InputIndependentCareerDialogFragment.dialog?.window?.setLayout(
+ WRAP_CONTENT,
+ WRAP_CONTENT
+ )
+ with(binding.yearSelector) {
+ minValue = PERIOD_START
+ maxValue = YEAR_END
+ descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
+ selectionDividerHeight = DIVIDER_HEIGHT_ZERO
+ }
+ with(binding.monthSelector) {
+ minValue = PERIOD_START
+ maxValue = MONTH_END
+ descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
+ selectionDividerHeight = DIVIDER_HEIGHT_ZERO
+ }
+ binding.chooseBtn.setOnClickListener {
+ btnClickListener(binding.yearSelector.value, binding.monthSelector.value)
+ this@InputIndependentCareerDialogFragment.dismiss()
+ }
+ }
+
+ companion object {
+ private const val PERIOD_START = 0
+ private const val YEAR_END = 99
+ private const val MONTH_END = 12
+ private const val DIVIDER_HEIGHT_ZERO = 0
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageAccountActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageAccountActivity.kt
new file mode 100644
index 00000000..d7cf3f9e
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageAccountActivity.kt
@@ -0,0 +1,124 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.text.Editable
+import android.text.InputType.TYPE_CLASS_TEXT
+import android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD
+import android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+import android.text.TextWatcher
+import android.util.Log
+import android.view.inputmethod.InputMethodManager
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityManageAccountBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ManageAccountActivity :
+ BaseActivity(R.layout.activity_manage_account) {
+ override fun initView() {
+ binding.manageAccountInfoBackBtn.setOnClickListener {
+ onBackPressedDispatcher.onBackPressed()
+ }
+ binding.root.setOnClickListener {
+ removeKeyboard()
+ }
+ binding.manageAccountInfoFrame.setOnClickListener {
+ removeKeyboard()
+ }
+ binding.inputCurrentPasswordEt.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) =
+ Unit
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+ s?.let {
+ if (it.isNotEmpty()) {
+ when (binding.inputCurrentPasswordEt.tag) {
+ PASSWORD_INVISIBLE_BLANK -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_off_black_24)
+ setTag(PASSWORD_INVISIBLE)
+ }
+
+ PASSWORD_VISIBLE_BLANK -> {
+ //검은 눈 올 예정
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_on_24)
+ setTag(PASSWORD_VISIBLE)
+ }
+ }
+ } else {
+ when (binding.inputCurrentPasswordEt.tag) {
+ PASSWORD_INVISIBLE -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_off_24)
+ setTag(PASSWORD_INVISIBLE_BLANK)
+ }
+
+ PASSWORD_VISIBLE_BLANK -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_on_24)
+ setTag(PASSWORD_VISIBLE_BLANK)
+ }
+ }
+ }
+ }
+ Log.d("visibility et", binding.inputCurrentPasswordEt.tag.toString())
+ Log.d("visibility btn", binding.currentPasswordVisibilityBtn.tag.toString())
+ }
+
+ override fun afterTextChanged(s: Editable?) = Unit
+ })
+
+ binding.currentPasswordVisibilityBtn.setOnClickListener {
+ when (binding.currentPasswordVisibilityBtn.tag) {
+ PASSWORD_INVISIBLE_BLANK -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_on_24)
+ setTag(PASSWORD_VISIBLE_BLANK)
+ binding.inputCurrentPasswordEt.inputType =
+ TYPE_TEXT_VARIATION_VISIBLE_PASSWORD or TYPE_CLASS_TEXT
+ }
+
+ PASSWORD_INVISIBLE -> {
+ //검은 눈 올 예정
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_on_24)
+ setTag(PASSWORD_VISIBLE)
+ binding.inputCurrentPasswordEt.inputType =
+ TYPE_TEXT_VARIATION_VISIBLE_PASSWORD or TYPE_CLASS_TEXT
+ }
+
+ PASSWORD_VISIBLE_BLANK -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_off_24)
+ setTag(PASSWORD_INVISIBLE_BLANK)
+ binding.inputCurrentPasswordEt.inputType =
+ TYPE_TEXT_VARIATION_PASSWORD or TYPE_CLASS_TEXT
+ }
+
+ PASSWORD_VISIBLE -> {
+ binding.currentPasswordVisibilityBtn.setImageResource(R.drawable.ic_eye_off_black_24)
+ setTag(PASSWORD_INVISIBLE)
+ binding.inputCurrentPasswordEt.inputType =
+ TYPE_TEXT_VARIATION_PASSWORD or TYPE_CLASS_TEXT
+ }
+ }
+ Log.d("visibility et", binding.inputCurrentPasswordEt.tag.toString())
+ Log.d("visibility btn", binding.currentPasswordVisibilityBtn.tag.toString())
+ }
+ }
+
+ private fun setTag(status: String) {
+ binding.inputCurrentPasswordEt.tag = status
+ binding.currentPasswordVisibilityBtn.tag = status
+ }
+
+ private fun removeKeyboard() {
+ val imm: InputMethodManager =
+ getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
+ }
+
+ override fun initObserver() = Unit
+
+ companion object {
+ private const val PASSWORD_INVISIBLE_BLANK = "eye_off_blank"
+ private const val PASSWORD_INVISIBLE = "eye_off"
+ private const val PASSWORD_VISIBLE_BLANK = "eye_on_blank"
+ private const val PASSWORD_VISIBLE = "eye_on"
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageMyInfoActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageMyInfoActivity.kt
new file mode 100644
index 00000000..1e60bd5c
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageMyInfoActivity.kt
@@ -0,0 +1,77 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.content.Intent
+import android.view.inputmethod.InputMethodManager
+import androidx.core.content.ContextCompat
+import com.google.android.material.chip.Chip
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityManageMyInfoBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ManageMyInfoActivity :
+ BaseActivity(R.layout.activity_manage_my_info) {
+ override fun initView() {
+ initViewListener()
+ }
+
+ private fun initViewListener() {
+ binding.manageMyInfoBackBtn.setOnClickListener {
+ this@ManageMyInfoActivity.onBackPressedDispatcher.onBackPressed()
+ }
+
+ binding.root.setOnClickListener {
+ val imm: InputMethodManager =
+ getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
+ }
+
+ binding.inputIndependentCareerEt.setOnClickListener {
+ val bottomSheet = InputIndependentCareerDialogFragment { year, month ->
+ if (year != ZERO_CAREER && month != ZERO_CAREER) {
+ binding.inputIndependentCareerEt.text =
+ getString(R.string.my_independent_career_base_format, year, month)
+ } else if (year != ZERO_CAREER) {
+ binding.inputIndependentCareerEt.text =
+ getString(R.string.my_independent_career_year_format, year)
+ } else if (month != ZERO_CAREER) {
+ binding.inputIndependentCareerEt.text =
+ getString(R.string.my_independent_career_month_format, month)
+ } else {
+ binding.inputIndependentCareerEt.text =
+ getString(R.string.my_independent_career_month_format, ZERO_CAREER)
+ }
+ }
+ bottomSheet.show(supportFragmentManager, bottomSheet.tag)
+ }
+
+ binding.findAddressBtn.setOnClickListener {
+ val intent = Intent(this, MyHometownAddressActivity::class.java)
+ startActivity(intent)
+ }
+
+ binding.mainInterestGroup.setOnClickListener {
+ val bottomSheet = ChooseMainInterestDialogFragment { interests ->
+ binding.mainInterestGroup.removeAllViews()
+ interests.forEach { interest ->
+ val chip = Chip(this)
+ chip.text = interest
+ chip.setTextAppearance(R.style.TextAppearance_App_12sp_700)
+ chip.setTextColor(ContextCompat.getColor(this, R.color.black))
+ chip.setChipBackgroundColorResource(R.color.yellow)
+ chip.setChipStrokeColorResource(R.color.yellow)
+ binding.mainInterestGroup.addView(chip)
+ }
+ }
+ bottomSheet.show(supportFragmentManager, bottomSheet.tag)
+ }
+ }
+
+ override fun initObserver() = Unit
+
+ companion object {
+ private const val ZERO_CAREER = 0
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageUsageActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageUsageActivity.kt
new file mode 100644
index 00000000..6300deab
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/ManageUsageActivity.kt
@@ -0,0 +1,62 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.view.View
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityManageUsageBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import com.umc.ttoklip.presentation.mypage.adapter.BlockUser
+import com.umc.ttoklip.presentation.mypage.adapter.BlockUserAdapter
+import com.umc.ttoklip.presentation.mypage.adapter.Suspension
+import com.umc.ttoklip.presentation.mypage.adapter.SuspensionAdapter
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ManageUsageActivity :
+ BaseActivity(R.layout.activity_manage_usage) {
+ private val suspensionAdapter by lazy {
+ SuspensionAdapter()
+ }
+
+ private val blockAdapter by lazy {
+ BlockUserAdapter()
+ }
+
+ override fun initView() {
+ val dummy = listOf(Suspension("이용 정지 5일", "부적절한 공구 참여로 이용이 정지되었습니다.", "12/12 ~ 12/16"))
+ binding.suspensionRv.adapter = suspensionAdapter
+ binding.suspensionRv.layoutManager = LinearLayoutManager(this)
+ suspensionAdapter.submitList(dummy)
+
+ val dummy2 = listOf(BlockUser(null, "똑리비"))
+ binding.blockUserRv.adapter = blockAdapter
+ binding.blockUserRv.layoutManager = LinearLayoutManager(this)
+ blockAdapter.submitList(dummy2)
+
+ binding.manageUsageBackBtn.setOnClickListener {
+ this.onBackPressedDispatcher.onBackPressed()
+ }
+
+ binding.suspensionBtn.setOnClickListener {
+ if (binding.suspensionRv.visibility == View.GONE) {
+ binding.suspensionRv.visibility = View.VISIBLE
+ binding.suspensionBtn.setImageResource(R.drawable.ic_arrow_up_24)
+ } else {
+ binding.suspensionRv.visibility = View.GONE
+ binding.suspensionBtn.setImageResource(R.drawable.ic_arrow_down_24)
+ }
+ }
+
+ binding.blockUserBtn.setOnClickListener {
+ if (binding.blockUserRv.visibility == View.GONE) {
+ binding.blockUserRv.visibility = View.VISIBLE
+ binding.blockUserBtn.setImageResource(R.drawable.ic_arrow_up_24)
+ } else {
+ binding.blockUserRv.visibility = View.GONE
+ binding.blockUserBtn.setImageResource(R.drawable.ic_arrow_down_24)
+ }
+ }
+ }
+
+ override fun initObserver() = Unit
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHometownAddressActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHometownAddressActivity.kt
new file mode 100644
index 00000000..a8a8c367
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHometownAddressActivity.kt
@@ -0,0 +1,96 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.widget.SeekBar
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityMyHomtownAddressBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class MyHometownAddressActivity :
+ BaseActivity(R.layout.activity_my_homtown_address) {
+ private lateinit var range: String
+ override fun initView() {
+ range = getString(R.string.range_500m)
+ binding.rangeSettingExplainTv.text =
+ getString(R.string.range_setting_format, range)
+ binding.myHometownAddressBackBtn.setOnClickListener {
+ onBackPressedDispatcher.onBackPressed()
+ }
+
+ binding.range500mTv.setOnClickListener {
+ setRange500m()
+ }
+ binding.range1kmTv.setOnClickListener {
+ setRange1km()
+ }
+ binding.range15kmTv.setOnClickListener {
+ setRange15km()
+ }
+
+ binding.rangeBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ if (progress <= RANGE_500M_PROGRESS) {
+ setRange500m()
+ } else if (progress <= RANGE_1KM_PROGRESS) {
+ setRange1km()
+ } else {
+ setRange15km()
+ }
+ }
+
+ override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit
+
+ override fun onStopTrackingTouch(seekBar: SeekBar?) {
+ seekBar?.let {
+ if (it.progress <= RANGE_500M_PROGRESS) {
+ it.progress = RANGE_500M_PROGRESS
+ setRange500m()
+ } else if (it.progress <= RANGE_1KM_PROGRESS) {
+ it.progress = RANGE_1KM_PROGRESS
+ setRange1km()
+ } else {
+ it.progress = RANGE_15kM_PROGRESS
+ setRange15km()
+ }
+ }
+ }
+
+ })
+ }
+
+ private fun setRange15km() {
+ range = getString(R.string.range_1_5km)
+ binding.rangeBar.progress = RANGE_15kM_PROGRESS
+ binding.range500mTv.setTextColor(getColor(R.color.gray40))
+ binding.range1kmTv.setTextColor(getColor(R.color.gray40))
+ binding.range15kmTv.setTextColor(getColor(R.color.black))
+ binding.rangeSettingExplainTv.text = getString(R.string.range_setting_format, range)
+ }
+
+ private fun setRange1km() {
+ range = getString(R.string.range_1km)
+ binding.rangeBar.progress = RANGE_1KM_PROGRESS
+ binding.range500mTv.setTextColor(getColor(R.color.gray40))
+ binding.range1kmTv.setTextColor(getColor(R.color.black))
+ binding.range15kmTv.setTextColor(getColor(R.color.gray40))
+ binding.rangeSettingExplainTv.text = getString(R.string.range_setting_format, range)
+ }
+
+ private fun setRange500m() {
+ range = getString(R.string.range_500m)
+ binding.rangeBar.progress = RANGE_500M_PROGRESS
+ binding.range500mTv.setTextColor(getColor(R.color.black))
+ binding.range1kmTv.setTextColor(getColor(R.color.gray40))
+ binding.range15kmTv.setTextColor(getColor(R.color.gray40))
+ binding.rangeSettingExplainTv.text = getString(R.string.range_setting_format, range)
+ }
+
+ override fun initObserver() = Unit
+
+ companion object {
+ private const val RANGE_500M_PROGRESS = 33
+ private const val RANGE_1KM_PROGRESS = 67
+ private const val RANGE_15kM_PROGRESS = 100
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyPageFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyPageFragment.kt
new file mode 100644
index 00000000..22470d0f
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyPageFragment.kt
@@ -0,0 +1,36 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.content.Intent
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentMyPageBinding
+import com.umc.ttoklip.presentation.base.BaseFragment
+import dagger.hilt.android.AndroidEntryPoint
+
+
+@AndroidEntryPoint
+class MyPageFragment : BaseFragment(R.layout.fragment_my_page) {
+ override fun initObserver() = Unit
+
+ override fun initView() {
+ binding.updateProfileBtn.setOnClickListener {
+ val intent = Intent(requireContext(), ManageMyInfoActivity::class.java)
+ startActivity(intent)
+ }
+
+ binding.announcementBtn.setOnClickListener {
+ val intent = Intent(requireContext(), SetAnnouncementActivity::class.java)
+ startActivity(intent)
+ }
+
+ binding.usageManageBtn.setOnClickListener {
+ val intent = Intent(requireContext(), ManageUsageActivity::class.java)
+ startActivity(intent)
+ }
+
+ binding.manageAccountBtn.setOnClickListener {
+ val intent = Intent(requireContext(), ManageAccountActivity::class.java)
+ startActivity(intent)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/SearchAddressDialogFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/SearchAddressDialogFragment.kt
new file mode 100644
index 00000000..0b5f901a
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/SearchAddressDialogFragment.kt
@@ -0,0 +1,116 @@
+package com.umc.ttoklip.presentation.mypage
+
+import android.net.http.SslError
+import android.os.Message
+import android.webkit.JavascriptInterface
+import android.webkit.JsResult
+import android.webkit.SslErrorHandler
+import android.webkit.WebChromeClient
+import android.webkit.WebResourceRequest
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentSearchAddressBinding
+import com.umc.ttoklip.presentation.base.BaseBottomSheetDialogFragment
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+@AndroidEntryPoint
+class SearchAddressDialogFragment(private val btnClickListener: (String) -> Unit) :
+ BaseBottomSheetDialogFragment(R.layout.fragment_search_address) {
+ override fun initObserver() = Unit
+
+ override fun initView() {
+ with(binding.searchAddressWebView) {
+ settings.apply {
+ javaScriptEnabled = true
+ javaScriptCanOpenWindowsAutomatically = false
+ setSupportMultipleWindows(false)
+ cacheMode = WebSettings.LOAD_NO_CACHE
+ builtInZoomControls = false // 화면 확대 축소 허용여부
+ displayZoomControls = false // 줌 컨트롤 없애기.
+ useWideViewPort = true
+ }
+ apply {
+ addJavascriptInterface(WebViewData(), "")
+ webViewClient = client
+ webChromeClient = chromeClient
+ loadUrl("https://github.com/posite")
+ }
+ }
+ }
+
+ private inner class WebViewData {
+ @JavascriptInterface
+ fun getAddress(zoneCode: String, roadAddress: String, buildingName: String) {
+ CoroutineScope(Dispatchers.Default).launch {
+ withContext(CoroutineScope(Dispatchers.Main).coroutineContext) {
+ btnClickListener(
+ getString(
+ R.string.road_address_fromat,
+ roadAddress,
+ buildingName
+ )
+ )
+ dismiss()
+ }
+ }
+ }
+ }
+
+ private val client: WebViewClient = object : WebViewClient() {
+
+ override fun shouldOverrideUrlLoading(
+ view: WebView?,
+ request: WebResourceRequest?
+ ): Boolean {
+ return false
+ }
+
+ override fun onReceivedSslError(
+ view: WebView?,
+ handler: SslErrorHandler?,
+ error: SslError?
+ ) {
+ handler?.proceed()
+ }
+ }
+
+ private val chromeClient = object : WebChromeClient() {
+
+ override fun onCreateWindow(
+ view: WebView?,
+ isDialog: Boolean,
+ isUserGesture: Boolean,
+ resultMsg: Message?
+ ): Boolean {
+
+
+ val newWebView = WebView(requireContext())
+
+ newWebView.webChromeClient = object : WebChromeClient() {
+ override fun onJsAlert(
+ view: WebView,
+ url: String,
+ message: String,
+ result: JsResult
+ ): Boolean {
+ super.onJsAlert(view, url, message, result)
+ return true
+ }
+
+ override fun onCloseWindow(window: WebView?) {
+
+ }
+ }
+ val transport = resultMsg!!.obj as WebView.WebViewTransport
+ transport.webView = newWebView
+ resultMsg.sendToTarget()
+ return true
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/SetAnnouncementActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/SetAnnouncementActivity.kt
new file mode 100644
index 00000000..9a05005b
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/SetAnnouncementActivity.kt
@@ -0,0 +1,44 @@
+package com.umc.ttoklip.presentation.mypage
+
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivitySetAnnouncementBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+
+import com.umc.ttoklip.presentation.mypage.adapter.Announcement
+import com.umc.ttoklip.presentation.mypage.adapter.AnnouncementAdapter
+import com.umc.ttoklip.presentation.mypage.adapter.AnnouncementContent
+import com.umc.ttoklip.presentation.mypage.adapter.AnnouncementContentDetail
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class SetAnnouncementActivity :
+ BaseActivity(R.layout.activity_set_announcement) {
+ override fun initObserver() = Unit
+
+ private val adapter by lazy {
+ AnnouncementAdapter()
+ }
+
+ override fun initView() {
+ val dummy = listOf(
+ Announcement(
+ "12/12 ~ 12/16 ", "똑리비들을 위한 새로운 버전 업데이트 1.0.1", listOf(
+ AnnouncementContent(
+ "일부 오류를 수정하였어요",
+ listOf(
+ AnnouncementContentDetail("일부 기기에서 댓글 달기를 하면 어플이 비정상적으로 종료되는 오류를 수정하였습니다."),
+ AnnouncementContentDetail("일부 기사를 로딩할 때, 걸리는 로딩 시간을 단축시켰습니다.")
+ )
+ )
+ )
+ )
+ )
+ binding.announcementsRv.adapter = adapter
+ binding.announcementsRv.layoutManager = LinearLayoutManager(this)
+ adapter.submitList(dummy)
+ binding.setAnnouncementBackBtn.setOnClickListener {
+ this.onBackPressedDispatcher.onBackPressed()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Announcement.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Announcement.kt
new file mode 100644
index 00000000..6723de36
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Announcement.kt
@@ -0,0 +1,8 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+data class Announcement(
+ val date: String,
+ val title: String,
+ val announcement: List,
+ var visibility: Boolean = false
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementAdapter.kt
new file mode 100644
index 00000000..d4722aae
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementAdapter.kt
@@ -0,0 +1,71 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ItemAnnouncementsBinding
+
+class AnnouncementAdapter :
+ ListAdapter(diff) {
+ inner class AnnouncementViewHolder(
+ private val binding: ItemAnnouncementsBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: Announcement) {
+ binding.announcementTitleTv.text = data.title
+ val adapter = AnnouncementContentAdapter()
+ binding.announcementContentRv.adapter = adapter
+ adapter.submitList(data.announcement)
+
+ binding.announcementVisibilityBtn.setOnClickListener {
+ if (data.visibility) {
+ binding.announcementContentFrame.visibility = View.GONE
+ binding.announcementVisibilityBtn.setImageResource(R.drawable.ic_arrow_down_24)
+ } else {
+ binding.announcementContentFrame.visibility = View.VISIBLE
+ binding.announcementVisibilityBtn.setImageResource(R.drawable.ic_arrow_up_24)
+ }
+ data.visibility = data.visibility.not()
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnnouncementViewHolder {
+ val binding = ItemAnnouncementsBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ binding.announcementContentRv.layoutManager = LinearLayoutManager(parent.context)
+ return AnnouncementViewHolder(
+ binding
+ )
+ }
+
+ override fun onBindViewHolder(holder: AnnouncementViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val diff = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: Announcement,
+ newItem: Announcement
+ ): Boolean {
+ return oldItem.announcement == newItem.announcement
+ }
+
+ override fun areContentsTheSame(
+ oldItem: Announcement,
+ newItem: Announcement
+ ): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContent.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContent.kt
new file mode 100644
index 00000000..83a69602
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContent.kt
@@ -0,0 +1,6 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+data class AnnouncementContent(
+ val title: String,
+ val contents: List
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentAdapter.kt
new file mode 100644
index 00000000..b24f0b33
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentAdapter.kt
@@ -0,0 +1,61 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemAnnouncementContentBinding
+
+class AnnouncementContentAdapter :
+ ListAdapter(diff) {
+ inner class AnnouncementContentViewHolder(
+ private val binding: ItemAnnouncementContentBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: AnnouncementContent) {
+ binding.announcementContentTitleTv.text = data.title
+ val adapter = AnnouncementContentDetailAdapter()
+ binding.announcementContentDetailRv.adapter = adapter
+ adapter.submitList(data.contents)
+ }
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): AnnouncementContentViewHolder {
+ val binding = ItemAnnouncementContentBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ binding.announcementContentDetailRv.layoutManager = LinearLayoutManager(parent.context)
+ return AnnouncementContentViewHolder(
+ binding
+ )
+ }
+
+ override fun onBindViewHolder(holder: AnnouncementContentViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val diff = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: AnnouncementContent,
+ newItem: AnnouncementContent
+ ): Boolean {
+ return oldItem.title == newItem.title
+ }
+
+ override fun areContentsTheSame(
+ oldItem: AnnouncementContent,
+ newItem: AnnouncementContent
+ ): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetail.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetail.kt
new file mode 100644
index 00000000..9c929027
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetail.kt
@@ -0,0 +1,5 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+data class AnnouncementContentDetail(
+ val content: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetailAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetailAdapter.kt
new file mode 100644
index 00000000..7dc2250e
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/AnnouncementContentDetailAdapter.kt
@@ -0,0 +1,53 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemAnnouncementContentDetailBinding
+
+class AnnouncementContentDetailAdapter :
+ ListAdapter(diff) {
+ inner class DetailViewHolder(
+ private val binding: ItemAnnouncementContentDetailBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: AnnouncementContentDetail) {
+
+ binding.announcementContentDetailTv.text = data.content
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DetailViewHolder {
+ return DetailViewHolder(
+ ItemAnnouncementContentDetailBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: DetailViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val diff = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: AnnouncementContentDetail,
+ newItem: AnnouncementContentDetail
+ ): Boolean {
+ return oldItem.content == newItem.content
+ }
+
+ override fun areContentsTheSame(
+ oldItem: AnnouncementContentDetail,
+ newItem: AnnouncementContentDetail
+ ): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUser.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUser.kt
new file mode 100644
index 00000000..64b0eb26
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUser.kt
@@ -0,0 +1,8 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+val nothing = null
+
+data class BlockUser(
+ val imgUrl: String?,
+ val userId: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUserAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUserAdapter.kt
new file mode 100644
index 00000000..71472817
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/BlockUserAdapter.kt
@@ -0,0 +1,58 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemBlockUserBinding
+
+class BlockUserAdapter : ListAdapter(diff) {
+
+ inner class BlockUserViewHolder(
+ private val binding: ItemBlockUserBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: BlockUser) {
+ data.imgUrl?.let {
+
+ }
+ binding.blockedUserId.text = data.userId
+ binding.unblockBtn.setOnClickListener {
+
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BlockUserViewHolder {
+ return BlockUserViewHolder(
+ ItemBlockUserBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: BlockUserViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val diff = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: BlockUser,
+ newItem: BlockUser
+ ): Boolean {
+ return oldItem.userId == newItem.userId
+ }
+
+ override fun areContentsTheSame(
+ oldItem: BlockUser,
+ newItem: BlockUser
+ ): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Suspension.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Suspension.kt
new file mode 100644
index 00000000..4ed26c44
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/Suspension.kt
@@ -0,0 +1,7 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+data class Suspension(
+ val title: String,
+ val reason: String,
+ val period: String,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/SuspensionAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/SuspensionAdapter.kt
new file mode 100644
index 00000000..a0be5efd
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/adapter/SuspensionAdapter.kt
@@ -0,0 +1,54 @@
+package com.umc.ttoklip.presentation.mypage.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemSuspensionHistoryBinding
+
+class SuspensionAdapter : ListAdapter(diff) {
+
+ inner class SuspensionViewHolder(
+ private val binding: ItemSuspensionHistoryBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: Suspension) {
+ binding.suspensionTitleTv.text = data.title
+ binding.suspensionReasonTv.text = data.reason
+ binding.suspensionPeriodTv.text = data.period
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuspensionViewHolder {
+ return SuspensionViewHolder(
+ ItemSuspensionHistoryBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: SuspensionViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val diff = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: Suspension,
+ newItem: Suspension
+ ): Boolean {
+ return oldItem.period == newItem.period
+ }
+
+ override fun areContentsTheSame(
+ oldItem: Suspension,
+ newItem: Suspension
+ ): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/ItemNewsFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/ItemNewsFragment.kt
new file mode 100644
index 00000000..45189f4c
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/ItemNewsFragment.kt
@@ -0,0 +1,27 @@
+package com.umc.ttoklip.presentation.news
+
+import androidx.fragment.app.viewModels
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentItemNewsBinding
+import com.umc.ttoklip.presentation.base.BaseFragment
+import com.umc.ttoklip.presentation.news.adapter.Dummy
+import com.umc.ttoklip.presentation.news.adapter.NewsRVA
+import com.umc.ttoklip.presentation.news.detail.ArticleActivity
+
+class ItemNewsFragment : BaseFragment(R.layout.fragment_item_news) {
+ private val viewModel: NewsViewModel by viewModels()
+ private val newsRVA by lazy {
+ NewsRVA { startActivity(ArticleActivity.newIntent(requireContext())) }
+ }
+
+ override fun initObserver() {
+
+ }
+
+ override fun initView() {
+ binding.rv.adapter = newsRVA
+ newsRVA.submitList(listOf(
+ Dummy("1"), Dummy("2"), Dummy("3"), Dummy("4"),Dummy("1"), Dummy("2"), Dummy("3"), Dummy("4"),Dummy("1"), Dummy("2"), Dummy("3"), Dummy("4")
+ ))
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/NewsFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsFragment.kt
new file mode 100644
index 00000000..e539d337
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsFragment.kt
@@ -0,0 +1,78 @@
+package com.umc.ttoklip.presentation.news
+
+import androidx.core.view.isGone
+import androidx.core.view.isVisible
+import androidx.fragment.app.viewModels
+import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener
+import com.google.android.material.tabs.TabLayoutMediator
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentNewsBinding
+import com.umc.ttoklip.presentation.MainActivity
+import com.umc.ttoklip.presentation.base.BaseFragment
+import com.umc.ttoklip.presentation.news.adapter.Dummy
+import com.umc.ttoklip.presentation.news.adapter.NewsCardRVA
+import com.umc.ttoklip.presentation.news.adapter.NewsTabAdapter
+import dagger.hilt.android.AndroidEntryPoint
+
+
+@AndroidEntryPoint
+class NewsFragment : BaseFragment(R.layout.fragment_news) {
+
+ private val viewModel: NewsViewModel by viewModels()
+
+ private val vpRVA by lazy {
+ NewsCardRVA()
+ }
+
+ private val vpFA by lazy {
+ NewsTabAdapter(this)
+ }
+ lateinit var bindingV : FragmentNewsBinding
+
+ override fun initObserver() {
+ }
+
+ override fun initView() {
+ binding.vm = viewModel
+ bindingV =binding
+ binding.vp.adapter = vpRVA
+ binding.indicator.attachTo(binding.vp)
+ vpRVA.submitList(
+ listOf(
+ Dummy("1"), Dummy("2"), Dummy("3"), Dummy("4")
+ )
+ )
+ binding.vp2.adapter = vpFA
+ TabLayoutMediator(binding.tabLayout, binding.vp2) { tab, position ->
+ tab.text = tabTitleArray[position]
+ }.attach()
+
+ binding.appBar.addOnOffsetChangedListener(OnOffsetChangedListener { appBarLayout, verticalOffset ->
+ if (Math.abs(verticalOffset) - appBarLayout.totalScrollRange == 0) {
+ viewModel.collapsedAppBar()
+ (requireActivity() as MainActivity).binding.bottomNav.isGone = true
+ } else {
+ viewModel.expandedAppBar()
+ (requireActivity() as MainActivity).binding.bottomNav.isVisible = true
+ }
+ })
+
+ binding.fab.setOnClickListener {
+ binding.appBar.setExpanded(true)
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ (requireActivity() as MainActivity).binding.bottomNav.isVisible = true
+ }
+
+ companion object {
+ val tabTitleArray = arrayOf(
+ "집안일",
+ "레시피",
+ "안전한 생활",
+ "복지·정책",
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModel.kt
new file mode 100644
index 00000000..6e676917
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModel.kt
@@ -0,0 +1,18 @@
+package com.umc.ttoklip.presentation.news
+
+import kotlinx.coroutines.flow.StateFlow
+
+interface NewsViewModel {
+ val isExpanded : StateFlow
+
+
+ fun expandedAppBar()
+ fun collapsedAppBar()
+
+ enum class NewsFilter{
+ HOUSE_WORK,
+ RECIPE,
+ SAFE_LIFE,
+ WELFARE
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModelImpl.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModelImpl.kt
new file mode 100644
index 00000000..11c18cd6
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/NewsViewModelImpl.kt
@@ -0,0 +1,33 @@
+package com.umc.ttoklip.presentation.news
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsViewModelImpl @Inject constructor(
+
+) : ViewModel(), NewsViewModel {
+
+ private val _isExpanded = MutableStateFlow(false)
+ override val isExpanded: StateFlow
+ get() = _isExpanded
+
+ override fun expandedAppBar() {
+ viewModelScope.launch {
+ _isExpanded.emit(true)
+ }
+ }
+
+ override fun collapsedAppBar() {
+ viewModelScope.launch {
+ _isExpanded.emit(false)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/Dummy.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/Dummy.kt
new file mode 100644
index 00000000..808dabe9
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/Dummy.kt
@@ -0,0 +1,5 @@
+package com.umc.ttoklip.presentation.news.adapter
+
+data class Dummy(
+ val name : String
+)
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsCardRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsCardRVA.kt
new file mode 100644
index 00000000..f495e1bc
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsCardRVA.kt
@@ -0,0 +1,49 @@
+package com.umc.ttoklip.presentation.news.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemNewsViewPagerBinding
+
+class NewsCardRVA : ListAdapter(differ) {
+
+ inner class ItemViewHolder(
+ private val binding: ItemNewsViewPagerBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: Dummy) {
+ binding.item = data
+ }
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ItemViewHolder {
+ return ItemViewHolder(
+ ItemNewsViewPagerBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val differ = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: Dummy, newItem: Dummy): Boolean {
+ return oldItem.name == newItem.name
+ }
+
+ override fun areContentsTheSame(oldItem: Dummy, newItem: Dummy): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsRVA.kt
new file mode 100644
index 00000000..4670a545
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsRVA.kt
@@ -0,0 +1,52 @@
+package com.umc.ttoklip.presentation.news.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.umc.ttoklip.databinding.ItemNewsBinding
+
+class NewsRVA(val onClick: () -> Unit) : ListAdapter(differ) {
+
+ inner class ItemViewHolder(
+ private val binding: ItemNewsBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+
+ fun bind(data: Dummy) {
+ binding.item = data
+ binding.itemV.setOnClickListener {
+ onClick()
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ItemViewHolder {
+ return ItemViewHolder(
+ ItemNewsBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
+ }
+
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
+ holder.bind(getItem(position))
+ }
+
+ companion object {
+ val differ = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: Dummy, newItem: Dummy): Boolean {
+ return oldItem.name == newItem.name
+ }
+
+ override fun areContentsTheSame(oldItem: Dummy, newItem: Dummy): Boolean {
+ return oldItem == newItem
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsTabAdapter.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsTabAdapter.kt
new file mode 100644
index 00000000..1732b798
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/adapter/NewsTabAdapter.kt
@@ -0,0 +1,21 @@
+package com.umc.ttoklip.presentation.news.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.umc.ttoklip.presentation.news.ItemNewsFragment
+import com.umc.ttoklip.presentation.news.NewsFragment
+
+class NewsTabAdapter(fragmentActivity: NewsFragment) : FragmentStateAdapter(fragmentActivity) {
+
+ override fun getItemCount(): Int = 4
+
+ override fun createFragment(position: Int): Fragment {
+ return when (position) {
+ 0 -> ItemNewsFragment()
+ 1 -> ItemNewsFragment()
+ 2 -> ItemNewsFragment()
+ 3 -> ItemNewsFragment()
+ else -> ItemNewsFragment()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleActivity.kt
new file mode 100644
index 00000000..dd469ba3
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleActivity.kt
@@ -0,0 +1,27 @@
+package com.umc.ttoklip.presentation.news.detail
+
+import android.content.Context
+import android.content.Intent
+import androidx.activity.viewModels
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivityArticleBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ArticleActivity : BaseActivity(R.layout.activity_article) {
+
+ private val viewModel: ArticleViewModel by viewModels()
+ override fun initObserver() {
+ }
+
+ override fun initView() {
+ binding.vm = viewModel
+ }
+
+ companion object {
+ const val ARTICLE = "article"
+ fun newIntent(context: Context) =
+ Intent(context, ArticleActivity::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModel.kt
new file mode 100644
index 00000000..4944666a
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModel.kt
@@ -0,0 +1,4 @@
+package com.umc.ttoklip.presentation.news.detail
+
+interface ArticleViewModel {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModelImpl.kt b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModelImpl.kt
new file mode 100644
index 00000000..d0e7cea1
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/news/detail/ArticleViewModelImpl.kt
@@ -0,0 +1,11 @@
+package com.umc.ttoklip.presentation.news.detail
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class ArticleViewModelImpl@Inject constructor(
+
+): ViewModel(), ArticleViewModel {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/search/BottomDialogSearchFragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/search/BottomDialogSearchFragment.kt
new file mode 100644
index 00000000..4f40a1a4
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/search/BottomDialogSearchFragment.kt
@@ -0,0 +1,154 @@
+package com.umc.ttoklip.presentation.search
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.view.isGone
+import androidx.core.view.isVisible
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.FragmentBottomDialogSearchBinding
+
+class BottomDialogSearchFragment(private val completeClick: (List) -> Unit) :
+ BottomSheetDialogFragment() {
+
+ lateinit var binding: FragmentBottomDialogSearchBinding
+ val resultList = mutableListOf()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentBottomDialogSearchBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setStyle( // Background -> Transparent.
+ STYLE_NORMAL,
+ R.style.TransparentBottomSheetDialogFragment
+ )
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ binding.sortChipG.isSelectionRequired = true
+ binding.sortChipG.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.sort1 -> {}
+ R.id.sort2 -> {}
+ R.id.sort3 -> {}
+ else -> {}
+ }
+ }
+
+ binding.boardChipG.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.board1 -> {
+ checkedNews()
+ }
+
+ R.id.board2 -> {
+ binding.categoryG.isGone = true
+ }
+
+ R.id.board3 -> {
+ checkedTip()
+ }
+
+ R.id.board4 -> {
+ binding.categoryG.isGone = true
+ }
+
+ R.id.board5 -> {
+ binding.categoryG.isGone = true
+ }
+
+ else -> {
+ binding.categoryG.isGone = true
+ binding.categoryChipG.clearCheck()
+ }
+ }
+ }
+
+ binding.categoryChipG.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.category1 -> {}
+ R.id.category2 -> {}
+ R.id.category3 -> {}
+ R.id.category4 -> {}
+ R.id.category5 -> {}
+ else -> {}
+ }
+ }
+
+ binding.resetBtn.setOnClickListener {
+ binding.sortChipG.check(R.id.sort1)
+ binding.boardChipG.clearCheck()
+ binding.categoryChipG.clearCheck()
+ }
+
+ binding.completeBtn.setOnClickListener {
+ completeClick(getResult())
+ dismiss()
+ }
+ }
+
+ private fun checkedNews() {
+ with(binding) {
+ categoryChipG.clearCheck()
+ categoryG.isVisible = true
+ category1.text = "집안일"
+ category2.text = "레시피"
+ category3.text = "안전한 생활"
+ category4.text = "복지·정책"
+ category5.isGone = true
+ }
+ }
+
+ private fun checkedTip() {
+ with(binding) {
+ categoryChipG.clearCheck()
+ categoryG.isVisible = true
+ category1.text = "집안일"
+ category2.text = "요리"
+ category3.text = "안전한 생활"
+ category4.text = "사기"
+ category5.text = "복지·정책"
+ category5.isVisible = true
+ }
+ }
+
+ private fun getResult() : List{
+ with(binding){
+ val sort = when (sortChipG.checkedChipId ){
+ R.id.sort1 -> 1
+ R.id.sort2 -> 2
+ R.id.sort3 -> 3
+ else -> {0}
+ }
+ val board = when (boardChipG.checkedChipId ){
+ R.id.board1 -> 1
+ R.id.board2 -> 2
+ R.id.board3 -> 3
+ R.id.board4 -> 4
+ R.id.board5 -> 5
+ else -> {0}
+ }
+ val category = when (boardChipG.checkedChipId ){
+ R.id.category1 -> 1
+ R.id.category2 -> 2
+ R.id.category3 -> 3
+ R.id.category4 -> 4
+ R.id.category5 -> 5
+ else -> {0}
+ }
+
+ return listOf(sort, board, category)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/search/SearchActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchActivity.kt
new file mode 100644
index 00000000..5a776a69
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchActivity.kt
@@ -0,0 +1,49 @@
+package com.umc.ttoklip.presentation.search
+
+import android.content.Context
+import android.content.Intent
+import androidx.activity.viewModels
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.umc.ttoklip.R
+import com.umc.ttoklip.databinding.ActivitySearchBinding
+import com.umc.ttoklip.presentation.base.BaseActivity
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.launch
+
+@AndroidEntryPoint
+class SearchActivity : BaseActivity(R.layout.activity_search) {
+
+ private val viewModel: SearchViewModel by viewModels()
+
+ override fun initView() {
+ binding.vm = viewModel
+ binding.backBtn.setOnClickListener {
+ finish()
+ }
+ binding.filterBtn.setOnClickListener {
+
+ }
+ }
+
+ override fun initObserver() {
+ lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ viewModel.showDialog.collect {
+ if (it) {
+ val sheet = BottomDialogSearchFragment { filter ->
+ viewModel.filter(filter[0], filter[1], filter[2])
+ }
+ sheet.show(supportFragmentManager, sheet.tag)
+ }
+ }
+ }
+ }
+ }
+
+ companion object {
+ const val SEARCH_ACTIVITY = "search"
+ fun newIntent(context: Context) = Intent(context, SearchActivity::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModel.kt
new file mode 100644
index 00000000..b9c1a4bd
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModel.kt
@@ -0,0 +1,15 @@
+package com.umc.ttoklip.presentation.search
+
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.StateFlow
+
+interface SearchViewModel {
+
+ val filterSort : StateFlow
+ val filterBoard : StateFlow
+ val filterCategory: StateFlow
+ val showDialog : SharedFlow
+
+ fun clickFilter()
+ fun filter(sort: Int, board: Int, category:Int)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModelImpl.kt b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModelImpl.kt
new file mode 100644
index 00000000..c672da0d
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/presentation/search/SearchViewModelImpl.kt
@@ -0,0 +1,44 @@
+package com.umc.ttoklip.presentation.search
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class SearchViewModelImpl @Inject constructor(): ViewModel(), SearchViewModel {
+
+ private val _showDialog = MutableSharedFlow()
+ private val _filterSort = MutableStateFlow(1)
+ override val filterSort: StateFlow
+ get() = _filterSort
+ private val _filterBoard = MutableStateFlow(0)
+ override val filterBoard: StateFlow
+ get() = _filterBoard
+
+ private val _filterCategory = MutableStateFlow(0)
+ override val filterCategory: StateFlow
+ get() = _filterCategory
+ override val showDialog: SharedFlow
+ get() = _showDialog
+
+ override fun clickFilter() {
+ viewModelScope.launch {
+ _showDialog.emit(true)
+ }
+ }
+
+ override fun filter(sort: Int, board: Int, category:Int) {
+ viewModelScope.launch {
+ _filterSort.value = sort
+ _filterBoard.value =board
+ _filterCategory.value =category
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/umc/ttoklip/util/BindAdapter.kt b/app/src/main/java/com/umc/ttoklip/util/BindAdapter.kt
new file mode 100644
index 00000000..0b51dca3
--- /dev/null
+++ b/app/src/main/java/com/umc/ttoklip/util/BindAdapter.kt
@@ -0,0 +1,27 @@
+package com.umc.ttoklip.util
+
+import android.graphics.Typeface
+import android.widget.TextView
+import androidx.annotation.StyleRes
+import androidx.appcompat.widget.AppCompatTextView
+import androidx.databinding.BindingAdapter
+import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.ViewModel
+import androidx.viewpager.widget.ViewPager
+import com.google.android.material.tabs.TabLayout
+import com.umc.ttoklip.presentation.news.NewsViewModel
+
+
+@BindingAdapter("bindTextViewStyle")
+fun AppCompatTextView.bindTextViewStyle(@StyleRes styleResourceId: Int) {
+ this.setTextAppearance(styleResourceId)
+}
+
+@BindingAdapter("setBold")
+fun AppCompatTextView.setBold(isBold: Boolean) {
+ if (isBold) {
+ this.setTypeface(null, Typeface.BOLD)
+ } else {
+ this.setTypeface(null, Typeface.NORMAL)
+ }
+}
diff --git a/app/src/main/res/color/bg_chip.xml b/app/src/main/res/color/bg_chip.xml
new file mode 100644
index 00000000..46a2aad0
--- /dev/null
+++ b/app/src/main/res/color/bg_chip.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/stroke_chip.xml b/app/src/main/res/color/stroke_chip.xml
new file mode 100644
index 00000000..038ac04a
--- /dev/null
+++ b/app/src/main/res/color/stroke_chip.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/tab_text_color_selector.xml b/app/src/main/res/color/tab_text_color_selector.xml
new file mode 100644
index 00000000..2f4f2457
--- /dev/null
+++ b/app/src/main/res/color/tab_text_color_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/text_chip.xml b/app/src/main/res/color/text_chip.xml
new file mode 100644
index 00000000..9adbd799
--- /dev/null
+++ b/app/src/main/res/color/text_chip.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_add_url_btn.xml b/app/src/main/res/drawable/bg_add_url_btn.xml
new file mode 100644
index 00000000..3809c6d8
--- /dev/null
+++ b/app/src/main/res/drawable/bg_add_url_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_fab.xml b/app/src/main/res/drawable/bg_fab.xml
new file mode 100644
index 00000000..0b776899
--- /dev/null
+++ b/app/src/main/res/drawable/bg_fab.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_tab.xml b/app/src/main/res/drawable/bg_tab.xml
new file mode 100644
index 00000000..2f40ea28
--- /dev/null
+++ b/app/src/main/res/drawable/bg_tab.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_color_selector.xml b/app/src/main/res/drawable/bottom_color_selector.xml
new file mode 100644
index 00000000..b7b802a5
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_color_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/chat_img.png b/app/src/main/res/drawable/chat_img.png
new file mode 100644
index 00000000..8843b2f9
Binary files /dev/null and b/app/src/main/res/drawable/chat_img.png differ
diff --git a/app/src/main/res/drawable/dialog_radius.xml b/app/src/main/res/drawable/dialog_radius.xml
new file mode 100644
index 00000000..cba216fc
--- /dev/null
+++ b/app/src/main/res/drawable/dialog_radius.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/group_buy_img.png b/app/src/main/res/drawable/group_buy_img.png
new file mode 100644
index 00000000..6482f36c
Binary files /dev/null and b/app/src/main/res/drawable/group_buy_img.png differ
diff --git a/app/src/main/res/drawable/help_img.png b/app/src/main/res/drawable/help_img.png
new file mode 100644
index 00000000..0232d90a
Binary files /dev/null and b/app/src/main/res/drawable/help_img.png differ
diff --git a/app/src/main/res/drawable/hometown_range.xml b/app/src/main/res/drawable/hometown_range.xml
new file mode 100644
index 00000000..33ed4e3b
--- /dev/null
+++ b/app/src/main/res/drawable/hometown_range.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add_image_24.xml b/app/src/main/res/drawable/ic_add_image_24.xml
new file mode 100644
index 00000000..231cebcb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_image_24.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_announcement_24.xml b/app/src/main/res/drawable/ic_announcement_24.xml
new file mode 100644
index 00000000..fc8e05cc
--- /dev/null
+++ b/app/src/main/res/drawable/ic_announcement_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_24.xml b/app/src/main/res/drawable/ic_arrow_24.xml
new file mode 100644
index 00000000..5bc1b9c3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_back_24.xml b/app/src/main/res/drawable/ic_arrow_back_24.xml
new file mode 100644
index 00000000..0e822056
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_back_24.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_black_24.xml b/app/src/main/res/drawable/ic_arrow_black_24.xml
new file mode 100644
index 00000000..d6659127
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_black_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml
new file mode 100644
index 00000000..37c5ac59
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_down.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_down_24.xml b/app/src/main/res/drawable/ic_arrow_down_24.xml
new file mode 100644
index 00000000..43e7f947
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_down_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_up_24.xml b/app/src/main/res/drawable/ic_arrow_up_24.xml
new file mode 100644
index 00000000..57683210
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_up_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_bell_off_24.xml b/app/src/main/res/drawable/ic_bell_off_24.xml
new file mode 100644
index 00000000..52fe3705
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bell_off_24.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_bell_on_24.xml b/app/src/main/res/drawable/ic_bell_on_24.xml
new file mode 100644
index 00000000..3fd28566
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bell_on_24.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_bookmark_16.xml b/app/src/main/res/drawable/ic_bookmark_16.xml
new file mode 100644
index 00000000..4a2ece4c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bookmark_16.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_bookmark_off_20.xml b/app/src/main/res/drawable/ic_bookmark_off_20.xml
new file mode 100644
index 00000000..ac620e65
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bookmark_off_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_bookmark_on_20.xml b/app/src/main/res/drawable/ic_bookmark_on_20.xml
new file mode 100644
index 00000000..f7939916
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bookmark_on_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_breakdown_24.xml b/app/src/main/res/drawable/ic_breakdown_24.xml
new file mode 100644
index 00000000..ec21cb82
--- /dev/null
+++ b/app/src/main/res/drawable/ic_breakdown_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_camera_24.xml b/app/src/main/res/drawable/ic_camera_24.xml
new file mode 100644
index 00000000..50679e6c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_camera_line_24.xml b/app/src/main/res/drawable/ic_camera_line_24.xml
new file mode 100644
index 00000000..5722afba
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera_line_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_camera_small_24.xml b/app/src/main/res/drawable/ic_camera_small_24.xml
new file mode 100644
index 00000000..20d8027e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera_small_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_certification_mark_16.xml b/app/src/main/res/drawable/ic_certification_mark_16.xml
new file mode 100644
index 00000000..2c47474b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_certification_mark_16.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_check_off_20.xml b/app/src/main/res/drawable/ic_check_off_20.xml
new file mode 100644
index 00000000..0743276b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_check_off_20.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_check_on_20.xml b/app/src/main/res/drawable/ic_check_on_20.xml
new file mode 100644
index 00000000..0204f32c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_check_on_20.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_checkpre_off_16.xml b/app/src/main/res/drawable/ic_checkpre_off_16.xml
new file mode 100644
index 00000000..97a09f8f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_checkpre_off_16.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_checkpre_on_16.xml b/app/src/main/res/drawable/ic_checkpre_on_16.xml
new file mode 100644
index 00000000..5acc1030
--- /dev/null
+++ b/app/src/main/res/drawable/ic_checkpre_on_16.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_cost_search_16.xml b/app/src/main/res/drawable/ic_cost_search_16.xml
new file mode 100644
index 00000000..164f64e4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_cost_search_16.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml
new file mode 100644
index 00000000..4f182f42
--- /dev/null
+++ b/app/src/main/res/drawable/ic_delete.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_document_24.xml b/app/src/main/res/drawable/ic_document_24.xml
new file mode 100644
index 00000000..38c86899
--- /dev/null
+++ b/app/src/main/res/drawable/ic_document_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_dots_horizontal_24.xml b/app/src/main/res/drawable/ic_dots_horizontal_24.xml
new file mode 100644
index 00000000..ab3c349c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_dots_horizontal_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_dots_vertical_24.xml b/app/src/main/res/drawable/ic_dots_vertical_24.xml
new file mode 100644
index 00000000..66a0c092
--- /dev/null
+++ b/app/src/main/res/drawable/ic_dots_vertical_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml
new file mode 100644
index 00000000..e52e350e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_edit.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_eye_off_24.xml b/app/src/main/res/drawable/ic_eye_off_24.xml
new file mode 100644
index 00000000..3c87b914
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye_off_24.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_eye_off_black_24.xml b/app/src/main/res/drawable/ic_eye_off_black_24.xml
new file mode 100644
index 00000000..cb628b4f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye_off_black_24.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_eye_on_24.xml b/app/src/main/res/drawable/ic_eye_on_24.xml
new file mode 100644
index 00000000..aa0b6862
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye_on_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_front_arrow_16.xml b/app/src/main/res/drawable/ic_front_arrow_16.xml
new file mode 100644
index 00000000..048c51d5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_front_arrow_16.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_gps_24.xml b/app/src/main/res/drawable/ic_gps_24.xml
new file mode 100644
index 00000000..25525869
--- /dev/null
+++ b/app/src/main/res/drawable/ic_gps_24.xml
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_headphone_24.xml b/app/src/main/res/drawable/ic_headphone_24.xml
new file mode 100644
index 00000000..1a94ce22
--- /dev/null
+++ b/app/src/main/res/drawable/ic_headphone_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_heart_off_20.xml b/app/src/main/res/drawable/ic_heart_off_20.xml
new file mode 100644
index 00000000..9dc0cbc0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_heart_off_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_heart_on_20.xml b/app/src/main/res/drawable/ic_heart_on_20.xml
new file mode 100644
index 00000000..ab754324
--- /dev/null
+++ b/app/src/main/res/drawable/ic_heart_on_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_off_48.xml b/app/src/main/res/drawable/ic_home_off_48.xml
new file mode 100644
index 00000000..ecd73ee9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_off_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_on_48.xml b/app/src/main/res/drawable/ic_home_on_48.xml
new file mode 100644
index 00000000..d4e96e19
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_on_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_kakaotalk_46.xml b/app/src/main/res/drawable/ic_kakaotalk_46.xml
new file mode 100644
index 00000000..dd4746d9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_kakaotalk_46.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_link_24.xml b/app/src/main/res/drawable/ic_link_24.xml
new file mode 100644
index 00000000..8d66126a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_link_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_logo_24.xml b/app/src/main/res/drawable/ic_logo_24.xml
new file mode 100644
index 00000000..7a9e621e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_logo_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_logo_big.xml b/app/src/main/res/drawable/ic_logo_big.xml
new file mode 100644
index 00000000..81840b36
--- /dev/null
+++ b/app/src/main/res/drawable/ic_logo_big.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_management_24.xml b/app/src/main/res/drawable/ic_management_24.xml
new file mode 100644
index 00000000..4581cf1c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_management_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_map_marker_24.xml b/app/src/main/res/drawable/ic_map_marker_24.xml
new file mode 100644
index 00000000..39974519
--- /dev/null
+++ b/app/src/main/res/drawable/ic_map_marker_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_message_24.xml b/app/src/main/res/drawable/ic_message_24.xml
new file mode 100644
index 00000000..ab153fbd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_message_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_my_off_48.xml b/app/src/main/res/drawable/ic_my_off_48.xml
new file mode 100644
index 00000000..b7c3d888
--- /dev/null
+++ b/app/src/main/res/drawable/ic_my_off_48.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_my_on_48.xml b/app/src/main/res/drawable/ic_my_on_48.xml
new file mode 100644
index 00000000..61e1f412
--- /dev/null
+++ b/app/src/main/res/drawable/ic_my_on_48.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_naver_46.xml b/app/src/main/res/drawable/ic_naver_46.xml
new file mode 100644
index 00000000..214e5d45
--- /dev/null
+++ b/app/src/main/res/drawable/ic_naver_46.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_news_off_48.xml b/app/src/main/res/drawable/ic_news_off_48.xml
new file mode 100644
index 00000000..8c2dee2c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_news_off_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_news_on_48.xml b/app/src/main/res/drawable/ic_news_on_48.xml
new file mode 100644
index 00000000..d595d5e0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_news_on_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_out_24.xml b/app/src/main/res/drawable/ic_out_24.xml
new file mode 100644
index 00000000..cb3c24c3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_out_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_plus_24.xml b/app/src/main/res/drawable/ic_plus_24.xml
new file mode 100644
index 00000000..1e8fd2bd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_plus_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_radio_check_off_24.xml b/app/src/main/res/drawable/ic_radio_check_off_24.xml
new file mode 100644
index 00000000..239a23e1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_radio_check_off_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_radio_check_on_24.xml b/app/src/main/res/drawable/ic_radio_check_on_24.xml
new file mode 100644
index 00000000..8b652130
--- /dev/null
+++ b/app/src/main/res/drawable/ic_radio_check_on_24.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_reply.xml b/app/src/main/res/drawable/ic_reply.xml
new file mode 100644
index 00000000..a6afbc8f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_reply.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_report.xml b/app/src/main/res/drawable/ic_report.xml
new file mode 100644
index 00000000..224aa8fe
--- /dev/null
+++ b/app/src/main/res/drawable/ic_report.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_search_24.xml b/app/src/main/res/drawable/ic_search_24.xml
new file mode 100644
index 00000000..3ea0e135
--- /dev/null
+++ b/app/src/main/res/drawable/ic_search_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml
new file mode 100644
index 00000000..cb3b5a86
--- /dev/null
+++ b/app/src/main/res/drawable/ic_send.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_set_24.xml b/app/src/main/res/drawable/ic_set_24.xml
new file mode 100644
index 00000000..bf056bef
--- /dev/null
+++ b/app/src/main/res/drawable/ic_set_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_tips_off_48.xml b/app/src/main/res/drawable/ic_tips_off_48.xml
new file mode 100644
index 00000000..4dffa2b7
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tips_off_48.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_tips_on_48.xml b/app/src/main/res/drawable/ic_tips_on_48.xml
new file mode 100644
index 00000000..3e1eb54e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tips_on_48.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_town_off_48.xml b/app/src/main/res/drawable/ic_town_off_48.xml
new file mode 100644
index 00000000..c21008d4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_town_off_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_town_on_48.xml b/app/src/main/res/drawable/ic_town_on_48.xml
new file mode 100644
index 00000000..0b4c375a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_town_on_48.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_ttoklip1_81.xml b/app/src/main/res/drawable/ic_ttoklip1_81.xml
new file mode 100644
index 00000000..16b17ed1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_ttoklip1_81.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_ttoklip2_64.xml b/app/src/main/res/drawable/ic_ttoklip2_64.xml
new file mode 100644
index 00000000..8ea07f7c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_ttoklip2_64.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_up_arrow_32.xml b/app/src/main/res/drawable/ic_up_arrow_32.xml
new file mode 100644
index 00000000..55822ebd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_up_arrow_32.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_write_16.xml b/app/src/main/res/drawable/ic_write_16.xml
new file mode 100644
index 00000000..ef50325a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_write_16.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_write_24.xml b/app/src/main/res/drawable/ic_write_24.xml
new file mode 100644
index 00000000..d4f8fbd0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_write_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/idea_img.png b/app/src/main/res/drawable/idea_img.png
new file mode 100644
index 00000000..c653ba97
Binary files /dev/null and b/app/src/main/res/drawable/idea_img.png differ
diff --git a/app/src/main/res/drawable/item_daily_popular_honey_tip_background.xml b/app/src/main/res/drawable/item_daily_popular_honey_tip_background.xml
new file mode 100644
index 00000000..f88beb8a
--- /dev/null
+++ b/app/src/main/res/drawable/item_daily_popular_honey_tip_background.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/item_daily_popular_honey_tip_external_background.xml b/app/src/main/res/drawable/item_daily_popular_honey_tip_external_background.xml
new file mode 100644
index 00000000..8633a3f4
--- /dev/null
+++ b/app/src/main/res/drawable/item_daily_popular_honey_tip_external_background.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/level_bar_background.xml b/app/src/main/res/drawable/level_bar_background.xml
new file mode 100644
index 00000000..273cbdf6
--- /dev/null
+++ b/app/src/main/res/drawable/level_bar_background.xml
@@ -0,0 +1,26 @@
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/news_img.png b/app/src/main/res/drawable/news_img.png
new file mode 100644
index 00000000..db1538af
Binary files /dev/null and b/app/src/main/res/drawable/news_img.png differ
diff --git a/app/src/main/res/drawable/oval_fill_strok_1.xml b/app/src/main/res/drawable/oval_fill_strok_1.xml
new file mode 100644
index 00000000..69b65967
--- /dev/null
+++ b/app/src/main/res/drawable/oval_fill_strok_1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_10.xml b/app/src/main/res/drawable/rectangle_corner_10.xml
new file mode 100644
index 00000000..b87c975c
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_10.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_100.xml b/app/src/main/res/drawable/rectangle_corner_100.xml
new file mode 100644
index 00000000..8153e837
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_100.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_10_main.xml b/app/src/main/res/drawable/rectangle_corner_10_main.xml
new file mode 100644
index 00000000..30ac30b1
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_10_main.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_10_strok_1.xml b/app/src/main/res/drawable/rectangle_corner_10_strok_1.xml
new file mode 100644
index 00000000..27a04bb3
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_10_strok_1.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_10_strok_1_black.xml b/app/src/main/res/drawable/rectangle_corner_10_strok_1_black.xml
new file mode 100644
index 00000000..12376b7e
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_10_strok_1_black.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_10_strok_1_gray40.xml b/app/src/main/res/drawable/rectangle_corner_10_strok_1_gray40.xml
new file mode 100644
index 00000000..b73ca048
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_10_strok_1_gray40.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_15_strok_1_bottom_nav.xml b/app/src/main/res/drawable/rectangle_corner_15_strok_1_bottom_nav.xml
new file mode 100644
index 00000000..0d200046
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_15_strok_1_bottom_nav.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_16.xml b/app/src/main/res/drawable/rectangle_corner_16.xml
new file mode 100644
index 00000000..c399949b
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_16.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_30.xml b/app/src/main/res/drawable/rectangle_corner_30.xml
new file mode 100644
index 00000000..4089cd77
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_30.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_30_0.xml b/app/src/main/res/drawable/rectangle_corner_30_0.xml
new file mode 100644
index 00000000..a76a437b
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_30_0.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_4.xml b/app/src/main/res/drawable/rectangle_corner_4.xml
new file mode 100644
index 00000000..3269e8dd
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_4.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_bottom_10.xml b/app/src/main/res/drawable/rectangle_corner_bottom_10.xml
new file mode 100644
index 00000000..0db89ed7
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_bottom_10.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_left_10.xml b/app/src/main/res/drawable/rectangle_corner_left_10.xml
new file mode 100644
index 00000000..4215e70a
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_left_10.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_corner_right_10.xml b/app/src/main/res/drawable/rectangle_corner_right_10.xml
new file mode 100644
index 00000000..bc74ff90
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_corner_right_10.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_gradient_yellow.xml b/app/src/main/res/drawable/rectangle_gradient_yellow.xml
new file mode 100644
index 00000000..42eee9fa
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_gradient_yellow.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/rectangle_top_corner_30.xml b/app/src/main/res/drawable/rectangle_top_corner_30.xml
new file mode 100644
index 00000000..ae828784
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_top_corner_30.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/round_input_background.xml b/app/src/main/res/drawable/round_input_background.xml
new file mode 100644
index 00000000..fab9cdfc
--- /dev/null
+++ b/app/src/main/res/drawable/round_input_background.xml
@@ -0,0 +1,19 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/round_profile.xml b/app/src/main/res/drawable/round_profile.xml
new file mode 100644
index 00000000..087a1f54
--- /dev/null
+++ b/app/src/main/res/drawable/round_profile.xml
@@ -0,0 +1,26 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/search_background.png b/app/src/main/res/drawable/search_background.png
new file mode 100644
index 00000000..4f09f729
Binary files /dev/null and b/app/src/main/res/drawable/search_background.png differ
diff --git a/app/src/main/res/drawable/selected_tab_bg.xml b/app/src/main/res/drawable/selected_tab_bg.xml
new file mode 100644
index 00000000..4355eafa
--- /dev/null
+++ b/app/src/main/res/drawable/selected_tab_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/sun_img.png b/app/src/main/res/drawable/sun_img.png
new file mode 100644
index 00000000..c1561b2f
Binary files /dev/null and b/app/src/main/res/drawable/sun_img.png differ
diff --git a/app/src/main/res/drawable/tab_indicator.xml b/app/src/main/res/drawable/tab_indicator.xml
new file mode 100644
index 00000000..3d929c06
--- /dev/null
+++ b/app/src/main/res/drawable/tab_indicator.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tab_selector.xml b/app/src/main/res/drawable/tab_selector.xml
new file mode 100644
index 00000000..69ea1edd
--- /dev/null
+++ b/app/src/main/res/drawable/tab_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/unblock_btn_background.xml b/app/src/main/res/drawable/unblock_btn_background.xml
new file mode 100644
index 00000000..47356822
--- /dev/null
+++ b/app/src/main/res/drawable/unblock_btn_background.xml
@@ -0,0 +1,26 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/unselected_tab_bg.xml b/app/src/main/res/drawable/unselected_tab_bg.xml
new file mode 100644
index 00000000..36aeff43
--- /dev/null
+++ b/app/src/main/res/drawable/unselected_tab_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/yellow_btn_background.xml b/app/src/main/res/drawable/yellow_btn_background.xml
new file mode 100644
index 00000000..8bbc0157
--- /dev/null
+++ b/app/src/main/res/drawable/yellow_btn_background.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/pretendard_bold.ttf b/app/src/main/res/font/pretendard_bold.ttf
new file mode 100644
index 00000000..315026a8
Binary files /dev/null and b/app/src/main/res/font/pretendard_bold.ttf differ
diff --git a/app/src/main/res/font/pretendard_medium.ttf b/app/src/main/res/font/pretendard_medium.ttf
new file mode 100644
index 00000000..eefc6d52
Binary files /dev/null and b/app/src/main/res/font/pretendard_medium.ttf differ
diff --git a/app/src/main/res/font/pretendard_regular.ttf b/app/src/main/res/font/pretendard_regular.ttf
new file mode 100644
index 00000000..6b010bb4
Binary files /dev/null and b/app/src/main/res/font/pretendard_regular.ttf differ
diff --git a/app/src/main/res/font/pretendard_semi_medium.ttf b/app/src/main/res/font/pretendard_semi_medium.ttf
new file mode 100644
index 00000000..32334f93
Binary files /dev/null and b/app/src/main/res/font/pretendard_semi_medium.ttf differ
diff --git a/app/src/main/res/layout/activity_alarm.xml b/app/src/main/res/layout/activity_alarm.xml
new file mode 100644
index 00000000..27d1a4b4
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_article.xml b/app/src/main/res/layout/activity_article.xml
new file mode 100644
index 00000000..e40f8b43
--- /dev/null
+++ b/app/src/main/res/layout/activity_article.xml
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_honey_tip.xml b/app/src/main/res/layout/activity_honey_tip.xml
new file mode 100644
index 00000000..47479c05
--- /dev/null
+++ b/app/src/main/res/layout/activity_honey_tip.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_intro.xml b/app/src/main/res/layout/activity_intro.xml
new file mode 100644
index 00000000..4b25886a
--- /dev/null
+++ b/app/src/main/res/layout/activity_intro.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_location.xml b/app/src/main/res/layout/activity_location.xml
new file mode 100644
index 00000000..40d14d4a
--- /dev/null
+++ b/app/src/main/res/layout/activity_location.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 00000000..e3d74079
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index d5fcb2e2..73595fad 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,15 +4,36 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:background="@color/white"
tools:context=".presentation.MainActivity">
-
+
+
+ app:menu="@menu/main_menu" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage_account.xml b/app/src/main/res/layout/activity_manage_account.xml
new file mode 100644
index 00000000..e276dae9
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_account.xml
@@ -0,0 +1,497 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage_my_info.xml b/app/src/main/res/layout/activity_manage_my_info.xml
new file mode 100644
index 00000000..51c12047
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_my_info.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage_usage.xml b/app/src/main/res/layout/activity_manage_usage.xml
new file mode 100644
index 00000000..a8dd8649
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_usage.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_my_homtown_address.xml b/app/src/main/res/layout/activity_my_homtown_address.xml
new file mode 100644
index 00000000..af5fb0c0
--- /dev/null
+++ b/app/src/main/res/layout/activity_my_homtown_address.xml
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_news_detail.xml b/app/src/main/res/layout/activity_news_detail.xml
new file mode 100644
index 00000000..cc35f5f8
--- /dev/null
+++ b/app/src/main/res/layout/activity_news_detail.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_read.xml b/app/src/main/res/layout/activity_read.xml
new file mode 100644
index 00000000..6738dc1a
--- /dev/null
+++ b/app/src/main/res/layout/activity_read.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml
new file mode 100644
index 00000000..954d92d1
--- /dev/null
+++ b/app/src/main/res/layout/activity_search.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_set_announcement.xml b/app/src/main/res/layout/activity_set_announcement.xml
new file mode 100644
index 00000000..bb7b4f14
--- /dev/null
+++ b/app/src/main/res/layout/activity_set_announcement.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_signup.xml b/app/src/main/res/layout/activity_signup.xml
new file mode 100644
index 00000000..9fbd0eb0
--- /dev/null
+++ b/app/src/main/res/layout/activity_signup.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 00000000..40a1e1d3
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_delete.xml b/app/src/main/res/layout/dialog_delete.xml
new file mode 100644
index 00000000..2d16724e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_delete.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_image.xml b/app/src/main/res/layout/dialog_image.xml
new file mode 100644
index 00000000..5bdde52c
--- /dev/null
+++ b/app/src/main/res/layout/dialog_image.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_recommend_self.xml b/app/src/main/res/layout/dialog_recommend_self.xml
new file mode 100644
index 00000000..b773bd5e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_recommend_self.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_report.xml b/app/src/main/res/layout/dialog_report.xml
new file mode 100644
index 00000000..9d7724dc
--- /dev/null
+++ b/app/src/main/res/layout/dialog_report.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_bottom_dialog_search.xml b/app/src/main/res/layout/fragment_bottom_dialog_search.xml
new file mode 100644
index 00000000..927aae0a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_bottom_dialog_search.xml
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_choose_main_interest.xml b/app/src/main/res/layout/fragment_choose_main_interest.xml
new file mode 100644
index 00000000..eb54a541
--- /dev/null
+++ b/app/src/main/res/layout/fragment_choose_main_interest.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_detail_honey_tip.xml b/app/src/main/res/layout/fragment_detail_honey_tip.xml
new file mode 100644
index 00000000..621c93c5
--- /dev/null
+++ b/app/src/main/res/layout/fragment_detail_honey_tip.xml
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 00000000..b52206c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,445 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_honey_tip.xml b/app/src/main/res/layout/fragment_honey_tip.xml
new file mode 100644
index 00000000..374788a8
--- /dev/null
+++ b/app/src/main/res/layout/fragment_honey_tip.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_honey_tip_list.xml b/app/src/main/res/layout/fragment_honey_tip_list.xml
new file mode 100644
index 00000000..a3bb5228
--- /dev/null
+++ b/app/src/main/res/layout/fragment_honey_tip_list.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_input_independent_career.xml b/app/src/main/res/layout/fragment_input_independent_career.xml
new file mode 100644
index 00000000..385a17be
--- /dev/null
+++ b/app/src/main/res/layout/fragment_input_independent_career.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_item_news.xml b/app/src/main/res/layout/fragment_item_news.xml
new file mode 100644
index 00000000..e9145b28
--- /dev/null
+++ b/app/src/main/res/layout/fragment_item_news.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml
new file mode 100644
index 00000000..78c2e2cc
--- /dev/null
+++ b/app/src/main/res/layout/fragment_my_page.xml
@@ -0,0 +1,526 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_news.xml b/app/src/main/res/layout/fragment_news.xml
new file mode 100644
index 00000000..45cfcd25
--- /dev/null
+++ b/app/src/main/res/layout/fragment_news.xml
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_search_address.xml b/app/src/main/res/layout/fragment_search_address.xml
new file mode 100644
index 00000000..60138c62
--- /dev/null
+++ b/app/src/main/res/layout/fragment_search_address.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_share_honey_tip.xml b/app/src/main/res/layout/fragment_share_honey_tip.xml
new file mode 100644
index 00000000..db7688cf
--- /dev/null
+++ b/app/src/main/res/layout/fragment_share_honey_tip.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_signup1.xml b/app/src/main/res/layout/fragment_signup1.xml
new file mode 100644
index 00000000..cc23fab3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_signup1.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_signup2.xml b/app/src/main/res/layout/fragment_signup2.xml
new file mode 100644
index 00000000..35884f37
--- /dev/null
+++ b/app/src/main/res/layout/fragment_signup2.xml
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_signup3.xml b/app/src/main/res/layout/fragment_signup3.xml
new file mode 100644
index 00000000..4b22ab55
--- /dev/null
+++ b/app/src/main/res/layout/fragment_signup3.xml
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_signup4.xml b/app/src/main/res/layout/fragment_signup4.xml
new file mode 100644
index 00000000..c1d6fbc9
--- /dev/null
+++ b/app/src/main/res/layout/fragment_signup4.xml
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_town.xml b/app/src/main/res/layout/fragment_town.xml
new file mode 100644
index 00000000..03cef906
--- /dev/null
+++ b/app/src/main/res/layout/fragment_town.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_write_honey_tip.xml b/app/src/main/res/layout/fragment_write_honey_tip.xml
new file mode 100644
index 00000000..bec6c270
--- /dev/null
+++ b/app/src/main/res/layout/fragment_write_honey_tip.xml
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_alarm.xml b/app/src/main/res/layout/item_alarm.xml
new file mode 100644
index 00000000..75e5b1eb
--- /dev/null
+++ b/app/src/main/res/layout/item_alarm.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_announcement_content.xml b/app/src/main/res/layout/item_announcement_content.xml
new file mode 100644
index 00000000..88ca0a61
--- /dev/null
+++ b/app/src/main/res/layout/item_announcement_content.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_announcement_content_detail.xml b/app/src/main/res/layout/item_announcement_content_detail.xml
new file mode 100644
index 00000000..7baf32a1
--- /dev/null
+++ b/app/src/main/res/layout/item_announcement_content_detail.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_announcements.xml b/app/src/main/res/layout/item_announcements.xml
new file mode 100644
index 00000000..fbd8e0ff
--- /dev/null
+++ b/app/src/main/res/layout/item_announcements.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_block_user.xml b/app/src/main/res/layout/item_block_user.xml
new file mode 100644
index 00000000..282594cf
--- /dev/null
+++ b/app/src/main/res/layout/item_block_user.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_comment.xml b/app/src/main/res/layout/item_comment.xml
new file mode 100644
index 00000000..68b68a45
--- /dev/null
+++ b/app/src/main/res/layout/item_comment.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_daily_popular_honey_tip.xml b/app/src/main/res/layout/item_daily_popular_honey_tip.xml
new file mode 100644
index 00000000..c1944d6f
--- /dev/null
+++ b/app/src/main/res/layout/item_daily_popular_honey_tip.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml
new file mode 100644
index 00000000..6043205d
--- /dev/null
+++ b/app/src/main/res/layout/item_image.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_intro.xml b/app/src/main/res/layout/item_intro.xml
new file mode 100644
index 00000000..11ff2669
--- /dev/null
+++ b/app/src/main/res/layout/item_intro.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_list_honey_tip.xml b/app/src/main/res/layout/item_list_honey_tip.xml
new file mode 100644
index 00000000..bf187f08
--- /dev/null
+++ b/app/src/main/res/layout/item_list_honey_tip.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_list_question.xml b/app/src/main/res/layout/item_list_question.xml
new file mode 100644
index 00000000..2e36969c
--- /dev/null
+++ b/app/src/main/res/layout/item_list_question.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_news.xml b/app/src/main/res/layout/item_news.xml
new file mode 100644
index 00000000..bb609a6d
--- /dev/null
+++ b/app/src/main/res/layout/item_news.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_news_view_pager.xml b/app/src/main/res/layout/item_news_view_pager.xml
new file mode 100644
index 00000000..28438b3d
--- /dev/null
+++ b/app/src/main/res/layout/item_news_view_pager.xml
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_reply.xml b/app/src/main/res/layout/item_reply.xml
new file mode 100644
index 00000000..2a69f2f3
--- /dev/null
+++ b/app/src/main/res/layout/item_reply.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_suspension_history.xml b/app/src/main/res/layout/item_suspension_history.xml
new file mode 100644
index 00000000..a33d0e48
--- /dev/null
+++ b/app/src/main/res/layout/item_suspension_history.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/spinner_inner_view.xml b/app/src/main/res/layout/spinner_inner_view.xml
new file mode 100644
index 00000000..65655b33
--- /dev/null
+++ b/app/src/main/res/layout/spinner_inner_view.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/spinner_outer_view.xml b/app/src/main/res/layout/spinner_outer_view.xml
new file mode 100644
index 00000000..2dc6a797
--- /dev/null
+++ b/app/src/main/res/layout/spinner_outer_view.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tab_title.xml b/app/src/main/res/layout/tab_title.xml
new file mode 100644
index 00000000..7f2e4336
--- /dev/null
+++ b/app/src/main/res/layout/tab_title.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml
new file mode 100644
index 00000000..a8699cb2
--- /dev/null
+++ b/app/src/main/res/menu/main_menu.xml
@@ -0,0 +1,29 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml
new file mode 100644
index 00000000..99dbc66a
--- /dev/null
+++ b/app/src/main/res/navigation/main_graph.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/news_graph.xml b/app/src/main/res/navigation/news_graph.xml
new file mode 100644
index 00000000..5e647822
--- /dev/null
+++ b/app/src/main/res/navigation/news_graph.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index c8524cd9..3408ab7a 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,5 +1,15 @@
- #FF000000
+ #FF1D1D1D
#FFFFFFFF
+ #FFF9F9F9
+ #FFF0F0F0
+ #FFCACACA
+ #FFAEAEAE
+ #FF7A7A7A
+ #FFFFE600
+ #FFFFF8B4
+ #FF0075FF
+ #FFFE5E00
+ #EFEFEF
\ No newline at end of file
diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml
new file mode 100644
index 00000000..0d2c4cc4
--- /dev/null
+++ b/app/src/main/res/values/dimen.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..571d903e
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,76 @@
+
+
+ ttoklip
+
+
+
+ 마이페이지
+ 나의 레벨
+ 다음 레벨까지
+ 스크랩
+ 내가 작성한 글
+ 거래내역
+ 계정 관리
+ 공지사항
+ 이용 관리
+ 고객센터
+ 알림설정
+ 약관 및 정책
+ 로그아웃
+ 내 프로필 관리
+ 닉네임
+ 중복확인
+ 나의 독립 경력
+ "%d년 %d개월"
+ "%d년"
+ "%d개월"
+ 주소
+ 우리동네 범위설정
+ 주요 관심사
+ 독립 경력 기간
+ 년
+ 월
+ 선택완료
+ 주요 관심사 종류
+ 없음
+ 집안일
+ 요리
+ 안전한 생활
+ 사기
+ 복지 · 정책
+ "%s %s"
+ 이용 제한 내역
+ 차단 사용자 관리
+ 해제
+ 우리동네 주소
+ 현 주소
+ 현재 위치 기준 설정
+ 직접 입력
+ 범위설정
+ 500m
+ 1km
+ 1.5km
+ 우리집 %s 주변으로 동네를 설정합니다.
+ 설정완료
+ 계정 정보 관리
+ 수정완료
+ 이름
+ 생년월일
+ 이메일
+ 인증번호 발송
+ 인증번호가 발송되었습니다.
+ 인증번호 입력
+ 인증번호가 일치하지 않습니다.
+ 인증되었습니다.
+ 현재 비밀번호 확인
+ 현재 비밀번호를 입력해주세요
+ 인증되었습니다.
+ 새 비밀번호
+ 새로운 비밀번호를 입력해주세요
+ 새 비밀번호 확인
+ 새로운 비밀번호를 한번 더 입력해주세요
+ 영문
+ 숫자
+ 특수문자
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml
new file mode 100644
index 00000000..0695002d
--- /dev/null
+++ b/app/src/main/res/values/style.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 00af49fa..53822fc6 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,8 +1,18 @@
-
+
+
+
+
+
diff --git a/settings.gradle b/settings.gradle
index 2790eb2b..84b084e8 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -10,7 +10,8 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
-
+ maven { url "https://jitpack.io" }
+ maven {url"https://naver.jfrog.io/artifactory/maven/"}
}
}
rootProject.name = "ttoklip"