Skip to content

Commit

Permalink
Merge pull request #52 from TeamOwori/feat/#49-스토리-파트-UI-구현
Browse files Browse the repository at this point in the history
Feat/#49 스토리 파트 UI 구현
  • Loading branch information
bamin0422 authored Jun 26, 2024
2 parents 5cede3b + 73f31d7 commit cc127a5
Show file tree
Hide file tree
Showing 244 changed files with 10,025 additions and 31 deletions.
7 changes: 7 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,12 @@ dependencies {

implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.serialization.json)

implementation(libs.okhttp.logging)
implementation(libs.retrofit)
implementation(libs.retrofit.kotlin.serialization)
implementation(libs.retrofit.converter.gson)
implementation(libs.retrofit.converter.scalars)

implementation(libs.coroutines.core)
implementation(libs.fragment.ktx)
Expand All @@ -91,6 +94,10 @@ dependencies {
implementation(libs.play.service.auth)
implementation(libs.dagger.hilt)
kapt(libs.dagger.hilt.compiler)
implementation(libs.coil)
implementation(libs.kakao.login)
implementation(libs.ted.image.picker)
implementation(libs.swipe.refresh.layout)
}

kapt {
Expand Down
10 changes: 9 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,12 @@

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-renamesourcefileattribute SourceFile

-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter

# https://github.com/square/okhttp/pull/6792
-dontwarn org.bouncycastle.jsse.**
-dontwarn org.conscrypt.*
-dontwarn org.openjsse.**
58 changes: 58 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />

<application
android:name=".core.OworiApplication"
android:allowBackup="true"
Expand All @@ -25,6 +31,58 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".presenter.main.MainActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity android:name=".presenter.emotion.EmotionActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity android:name=".presenter.main.home.notice.NoticeActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity android:name=".presenter.main.home.mypage.MyPageActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity android:name=".presenter.main.home.settings.SettingsActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity android:name=".presenter.main.home.familyname.FamilyNameActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|adjustUnspecified"/>

<activity android:name=".presenter.main.story.post.PostActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|adjustUnspecified"/>

<activity android:name=".presenter.main.story.search.SearchActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|adjustUnspecified"/>

<activity android:name=".presenter.main.story.detail.DetailActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|adjustUnspecified"/>

<activity
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:host="oauth"
android:scheme="@string/kakao_key" />
</intent-filter>
</activity>
</application>

</manifest>
7 changes: 7 additions & 0 deletions app/src/main/java/com/owori/android/core/AppConfig.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.owori.android.core


object AppConfig {
const val TAG_DEBUG = "TAG_DEBUG"

}
5 changes: 5 additions & 0 deletions app/src/main/java/com/owori/android/core/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ abstract class BaseActivity<B : ViewDataBinding, V : BaseViewModel>(@LayoutRes p
abstract fun initView()
protected abstract fun initObserver()
protected open fun navigate(navigation: Navigation) {}

protected open fun setStatusBarColor(color: Int) {
window.statusBarColor = color
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutId)
Expand Down
61 changes: 61 additions & 0 deletions app/src/main/java/com/owori/android/core/BaseDialogFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.owori.android.core

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 android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import androidx.fragment.app.DialogFragment
import com.owori.android.databinding.DialogBaseBinding

class BaseDialogFragment(
private val title: String,
private val contents: String,
private val positiveButtonText: String? = null,
private val cancelButtonText: String? = null,
private val onClickPositiveButton: () -> Unit = {}
) : DialogFragment() {
private var _binding: DialogBaseBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = DialogBaseBinding.inflate(inflater, container, false)
val view = binding.root
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

with(binding) {
titleTextview.text = title
contentsTextview.text = contents

positiveButtonText?.let { positiveText.text = it }
cancelButtonText?.let { cancelText.text = it }

cancelButton.setOnClickListener {
dialog?.dismiss()
}

positiveButton.setOnClickListener {
onClickPositiveButton()
dialog?.dismiss()
}
}

return view
}

override fun onResume() {
super.onResume()
this@BaseDialogFragment.dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT)
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
4 changes: 4 additions & 0 deletions app/src/main/java/com/owori/android/core/BaseFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ abstract class BaseFragment<B : ViewDataBinding, V : BaseViewModel>(@LayoutRes p

protected open fun navigate(navigation: Navigation) {}

protected open fun setStatusBarColor(color: Int) {
requireActivity().window.statusBarColor = color
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/com/owori/android/core/BaseViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ open class BaseViewModel : ViewModel() {
protected val _navigation = SingleLiveEvent<Navigation>()
val navigation: LiveData<Navigation> = _navigation

protected val _cancelButtonClicked: SingleLiveEvent<Unit> = SingleLiveEvent()
val cancelButtonClicked: LiveData<Unit> = _cancelButtonClicked

fun onClickCancelButton() {
_cancelButtonClicked.call()
}

companion object {
private const val TAG = "BaseViewModel"
}
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/com/owori/android/core/Constants.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.owori.android.core

object Constants {
const val OWORI_DATE_FORMAT = "yyyy-MM-dd"
const val OWORI_DOTTED_DATE_FORMAT = "yyyy.MM.dd"
}
15 changes: 15 additions & 0 deletions app/src/main/java/com/owori/android/core/DateFormat.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.owori.android.core

import java.text.SimpleDateFormat
import java.util.Date


object DateFormatter {
private const val DATE_FORMAT_DASH: String = "yyyy-MM-dd"
fun toDashDateFormat(timestamp: Long): String {
val date = Date(timestamp)
val dateFormat = SimpleDateFormat(DATE_FORMAT_DASH)

return dateFormat.format(date)
}
}
37 changes: 35 additions & 2 deletions app/src/main/java/com/owori/android/core/OworiApplication.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,44 @@
package com.owori.android.core

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.owori.android.R
import com.owori.android.module.NetworkConnectionChecker
import com.kakao.sdk.common.KakaoSdk
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class OworiApplication: Application() {
class OworiApplication : Application(), DefaultLifecycleObserver {
override fun onCreate() {
super.onCreate()
super<Application>.onCreate()
context = applicationContext
networkConnectionChecker = NetworkConnectionChecker(context)
KakaoSdk.init(this, getString(R.string.kakao_login_key))
}

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()
}
}
56 changes: 56 additions & 0 deletions app/src/main/java/com/owori/android/core/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.owori.android.core.di

import com.owori.android.R
import com.owori.android.core.OworiApplication
import com.owori.android.data.api.auth.AuthApi
import com.owori.android.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

/*
* Created by JJJoonngg
*/

@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(OworiApplication.getString(R.string.base_url))
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
}

@Provides
@Singleton
fun provideAuthApi(retrofit: Retrofit): AuthApi {
return retrofit.buildService()
}

private inline fun <reified T> Retrofit.buildService(): T {
return this.create(T::class.java)
}
}
22 changes: 22 additions & 0 deletions app/src/main/java/com/owori/android/data/api/auth/AuthApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.owori.android.data.api.auth

import com.owori.android.data.model.SignUpRequest
import com.owori.android.data.model.SignUpResponse
import com.owori.android.module.DataResult
import retrofit2.http.Body
import retrofit2.http.POST

/*
* Created by JJJoonngg
*/

interface AuthApi {
@POST("/members/kakao")
fun kakaoLogin(@Body data: SignUpRequest) : DataResult<SignUpResponse>

@POST("/members/google")
fun googleLogin(@Body data: SignUpRequest) : DataResult<SignUpResponse>

@POST("/members/apple")
fun appleLogin(@Body data: SignUpRequest) : DataResult<SignUpResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.owori.android.data.model

enum class AuthProvider {
GOOGLE, KAKAO, APPLE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.owori.android.data.model

import com.google.gson.annotations.SerializedName

data class SignUpRequest(
val token: String,
@SerializedName("auth_provider")
val authProvider: AuthProvider
)
Loading

0 comments on commit cc127a5

Please sign in to comment.