Skip to content

Commit a9379c2

Browse files
authored
Merge pull request #99 from manito-project/release/v1.2.0
Release/v1.2.0
2 parents 98b351f + 454147b commit a9379c2

File tree

129 files changed

+3160
-1575
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+3160
-1575
lines changed

.gitignore

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,4 @@ fabric.properties
134134

135135
### AndroidStudio Patch ###
136136

137-
!/gradle/wrapper/gradle-wrapper.jar
138-
139-
# Secret string class ex.url
140-
app/src/main/java/org/sopt/santamanitto/SecretString.kt
137+
!/gradle/wrapper/gradle-wrapper.jar

app/build.gradle

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@ android {
1616
applicationId "org.sopt.santamanitto"
1717
minSdkVersion 23
1818
targetSdkVersion 30
19-
versionCode 6
20-
versionName "1.1.2"
19+
versionCode 7
20+
versionName "1.2.0"
2121

2222
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
23+
24+
Properties properties = new Properties()
25+
properties.load(rootProject.file('./local.properties').newDataInputStream())
26+
buildConfigField("String", "BASE_URL", properties['baseUrl'])
27+
buildConfigField("String", "TOS_URL", properties['tosUrl'])
28+
buildConfigField("String", "PRIVACY_POLICY_RUL", properties['privacyPolicyUrl'])
2329
}
2430

2531
android {
@@ -69,6 +75,10 @@ android {
6975

7076
dataBinding { enabled = true }
7177

78+
viewBinding {
79+
enabled = true
80+
}
81+
7282
compileOptions {
7383
sourceCompatibility JavaVersion.VERSION_1_8
7484
targetCompatibility JavaVersion.VERSION_1_8
Lines changed: 82 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package org.sopt.santamanitto
22

33
import android.content.Intent
4+
import android.net.Uri
45
import android.os.Bundle
56
import android.os.Handler
67
import android.os.Looper
8+
import androidx.activity.viewModels
79
import androidx.appcompat.app.AppCompatActivity
810
import androidx.databinding.DataBindingUtil.*
911
import dagger.hilt.android.AndroidEntryPoint
1012
import org.sopt.santamanitto.databinding.ActivitySplashBinding
13+
import org.sopt.santamanitto.dialog.RoundDialogBuilder
1114
import org.sopt.santamanitto.main.MainActivity
15+
import org.sopt.santamanitto.update.version.Version
1216
import org.sopt.santamanitto.user.signin.SignInActivity
13-
import org.sopt.santamanitto.user.data.LoginUser
14-
import org.sopt.santamanitto.user.data.source.UserDataSource
15-
import javax.inject.Inject
16-
import javax.inject.Named
1717

1818
@AndroidEntryPoint
1919
class SplashActivity : AppCompatActivity() {
@@ -22,34 +22,96 @@ class SplashActivity : AppCompatActivity() {
2222
private const val SPLASH_DELAY = 1000L
2323
}
2424

25-
@Inject
26-
@Named("cached")
27-
lateinit var userCachedDataSource: UserDataSource
25+
private val splashViewModel: SplashViewModel by viewModels()
2826

29-
@Inject
30-
@Named("serialNumber")
31-
lateinit var serialNumber: String
27+
private var isDelayDone = false
3228

3329
override fun onCreate(savedInstanceState: Bundle?) {
3430
super.onCreate(savedInstanceState)
3531
setContentView<ActivitySplashBinding>(this, R.layout.activity_splash)
3632

33+
splashViewModel.run {
34+
latestVersion.observe(this@SplashActivity) { latestVersion ->
35+
if (latestVersion == null) {
36+
return@observe
37+
}
38+
if (latestVersion.compare(BuildConfig.VERSION_NAME, Version.MAJOR) > 0) {
39+
showUpdateDialog()
40+
} else {
41+
tryLogin()
42+
}
43+
}
44+
45+
versionCheckFail.observe(this@SplashActivity) {
46+
if (it) {
47+
// 버전 체크에 실패하더라도 로그인 시도는 해본다. (API 안정성이 보장되지 않음)
48+
tryLogin()
49+
}
50+
}
51+
52+
loginSuccess.observe(this@SplashActivity) {
53+
startNextActivity()
54+
}
55+
56+
checkUpdate()
57+
}
58+
}
59+
60+
private fun showUpdateDialog() {
61+
RoundDialogBuilder()
62+
.setContentText(getString(R.string.update_dialog_content))
63+
.addHorizontalButton(getString(R.string.update_dialog_exit)) {
64+
finish()
65+
}
66+
.addHorizontalButton(getString(R.string.update_dialog_update)) {
67+
goToStore()
68+
}
69+
.enableCancel(false)
70+
.build()
71+
.show(supportFragmentManager, "update")
72+
}
73+
74+
private fun goToStore() {
75+
val intent = Intent(Intent.ACTION_VIEW).apply {
76+
data = Uri.parse(
77+
"https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}")
78+
setPackage("com.android.vending")
79+
}
80+
startActivity(intent)
81+
finish()
82+
}
83+
84+
private fun tryLogin() {
3785
Handler(Looper.getMainLooper()).postDelayed({
86+
isDelayDone = true
3887
startNextActivity()
3988
}, SPLASH_DELAY)
89+
90+
splashViewModel.login()
4091
}
4192

4293
private fun startNextActivity() {
43-
userCachedDataSource.login(serialNumber, object: UserDataSource.LoginCallback {
44-
override fun onLoginSuccess(loginUser: LoginUser) {
45-
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
46-
finish()
47-
}
48-
49-
override fun onLoginFailed() {
50-
startActivity(Intent(this@SplashActivity, SignInActivity::class.java))
51-
finish()
94+
val loginState = splashViewModel.loginSuccess.value
95+
if (isDelayDone && loginState != SplashViewModel.LoginState.WAITING) {
96+
when (loginState) {
97+
SplashViewModel.LoginState.SUCCESS -> {
98+
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
99+
finish()
100+
}
101+
SplashViewModel.LoginState.FAIL -> {
102+
startActivity(Intent(this@SplashActivity, SignInActivity::class.java))
103+
finish()
104+
}
105+
else -> {
106+
RoundDialogBuilder()
107+
.setContentText("네트워크 연결 상태가 좋지 않아!\n확인 후 다시 시도해줘!", false)
108+
.addHorizontalButton("확인") {
109+
finish()
110+
}
111+
.build()
112+
.show(supportFragmentManager, "error")
113+
}
52114
}
53-
})
115+
}
54116
}
55117
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.sopt.santamanitto
2+
3+
import androidx.hilt.lifecycle.ViewModelInject
4+
import androidx.lifecycle.LiveData
5+
import androidx.lifecycle.MutableLiveData
6+
import androidx.lifecycle.ViewModel
7+
import org.sopt.santamanitto.update.version.Version
8+
import org.sopt.santamanitto.update.version.VersionChecker
9+
import org.sopt.santamanitto.user.data.LoginUserResponse
10+
import org.sopt.santamanitto.user.data.controller.UserController
11+
import org.sopt.santamanitto.user.data.source.UserMetadataSource
12+
import javax.inject.Named
13+
14+
class SplashViewModel @ViewModelInject constructor(
15+
private val userController: UserController,
16+
private val userMetadataSource: UserMetadataSource,
17+
private val versionChecker: VersionChecker,
18+
@Named("serialNumber") private val serialNumber: String
19+
) : ViewModel() {
20+
21+
private val _latestVersion = MutableLiveData<Version?>(null)
22+
val latestVersion: LiveData<Version?>
23+
get() = _latestVersion
24+
25+
private val _versionCheckFail = MutableLiveData(false)
26+
val versionCheckFail: LiveData<Boolean>
27+
get() = _versionCheckFail
28+
29+
30+
private val _loginSuccess = MutableLiveData(LoginState.WAITING)
31+
val loginSuccess: LiveData<LoginState>
32+
get() = _loginSuccess
33+
34+
fun checkUpdate() {
35+
versionChecker.getLatestVersion(object: VersionChecker.GetLatestVersionCallback {
36+
override fun onLoadLatestVersion(version: String) {
37+
_latestVersion.value = Version.create(version)
38+
}
39+
40+
override fun onFailure(networkError: Boolean) {
41+
_versionCheckFail.value = true
42+
}
43+
})
44+
}
45+
46+
fun login() {
47+
userController.login(serialNumber, object : UserController.LoginCallback {
48+
override fun onLoginSuccess(loginUserResponse: LoginUserResponse) {
49+
userMetadataSource.run {
50+
loginUserResponse.let {
51+
setUserName(it.userName)
52+
setAccessToken(it.accessToken)
53+
setUserId(it.id)
54+
}
55+
}
56+
_loginSuccess.value = LoginState.SUCCESS
57+
}
58+
59+
override fun onLoginFailed(isError: Boolean) {
60+
_loginSuccess.value = if (isError) {
61+
LoginState.ERROR
62+
} else {
63+
LoginState.FAIL
64+
}
65+
}
66+
})
67+
}
68+
69+
enum class LoginState {
70+
SUCCESS, FAIL, WAITING, ERROR
71+
}
72+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.sopt.santamanitto.base
2+
3+
import android.os.Bundle
4+
import android.view.*
5+
import androidx.annotation.LayoutRes
6+
import androidx.databinding.DataBindingUtil
7+
import androidx.databinding.ViewDataBinding
8+
import androidx.fragment.app.Fragment
9+
10+
open class BaseFragment<B : ViewDataBinding>(
11+
@LayoutRes private val layoutRes: Int,
12+
private val adjustPan: Boolean
13+
) : Fragment() {
14+
protected lateinit var binding: B
15+
16+
override fun onCreateView(
17+
inflater: LayoutInflater,
18+
container: ViewGroup?,
19+
savedInstanceState: Bundle?
20+
): View {
21+
binding = DataBindingUtil.inflate(inflater, layoutRes, container, false)
22+
binding.lifecycleOwner = viewLifecycleOwner
23+
return binding.root
24+
}
25+
26+
override fun onStart() {
27+
super.onStart()
28+
val window = requireActivity().window
29+
30+
if (adjustPan) {
31+
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
32+
} else {
33+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
34+
window.setDecorFitsSystemWindows(false)
35+
binding.root.setOnApplyWindowInsetsListener { _, insets ->
36+
val imeHeight = insets.getInsets(WindowInsets.Type.ime()).bottom
37+
binding.root.setPadding(0, 0, 0, imeHeight)
38+
insets
39+
}
40+
} else {
41+
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
42+
}
43+
}
44+
}
45+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.sopt.santamanitto.dialog.exit
2+
3+
import android.content.Context
4+
import androidx.fragment.app.DialogFragment
5+
import org.sopt.santamanitto.R
6+
import org.sopt.santamanitto.dialog.RoundDialogBuilder
7+
8+
object ExitDialogCreator {
9+
fun create(
10+
context: Context, roomName: String, isHost: Boolean, listener: (() -> Unit)
11+
): DialogFragment {
12+
val message = if (isHost) {
13+
context.getString(R.string.exit_dialog_host)
14+
} else {
15+
String.format(context.getString(R.string.exit_dialog_guest), roomName)
16+
}
17+
return RoundDialogBuilder()
18+
.setContentText(message)
19+
.addHorizontalButton(context.getString(R.string.dialog_cancel))
20+
.addHorizontalButton(context.getString(R.string.dialog_confirm)) {
21+
listener()
22+
}
23+
.build()
24+
}
25+
26+
}

app/src/main/java/org/sopt/santamanitto/main/AdapterModule.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ import dagger.Module
44
import dagger.Provides
55
import dagger.hilt.InstallIn
66
import dagger.hilt.android.components.FragmentComponent
7-
import org.sopt.santamanitto.room.data.source.RoomDataSource
87
import org.sopt.santamanitto.room.network.RoomRequest
9-
import org.sopt.santamanitto.user.data.source.UserDataSource
10-
import javax.inject.Named
8+
import org.sopt.santamanitto.user.data.controller.UserAuthController
9+
import org.sopt.santamanitto.user.data.source.UserMetadataSource
1110

1211
@InstallIn(FragmentComponent::class)
1312
@Module
1413
class AdapterModule {
1514
@Provides
1615
fun provideJoinedRoomAdapter(
17-
@Named("cached") cachedUserDataSource: UserDataSource,
16+
userAuthController: UserAuthController,
17+
userMetadataSource: UserMetadataSource,
1818
roomRequest: RoomRequest
19-
): JoinedRoomsAdapter = JoinedRoomsAdapter(cachedUserDataSource, roomRequest)
19+
): MyManittoListAdapter = MyManittoListAdapter(userAuthController, userMetadataSource, roomRequest)
2020
}

0 commit comments

Comments
 (0)