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 @@ - + + + + +