Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat/auto-backup #77

Merged
merged 8 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 133 additions & 5 deletions frontend/app/src/main/java/com/example/speechbuddy/AuthActivity.kt
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
package com.example.speechbuddy

import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.MotionEvent
import android.view.inputmethod.InputMethodManager
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.lifecycle.lifecycleScope
import com.example.speechbuddy.compose.SpeechBuddyAuth
import com.example.speechbuddy.ui.SpeechBuddyTheme
import com.example.speechbuddy.viewmodel.DisplaySettingsViewModel
import com.example.speechbuddy.utils.ResponseCode
import com.example.speechbuddy.viewmodel.LoginViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import java.time.LocalDate

@AndroidEntryPoint
class AuthActivity : BaseActivity() {

private val loginViewModel: LoginViewModel by viewModels()
private val displaySettingsViewModel: DisplaySettingsViewModel by viewModels()

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

subscribeObservers()
Expand All @@ -29,25 +35,78 @@ class AuthActivity : BaseActivity() {
settingsRepository = settingsRepository,
initialDarkMode = getInitialDarkMode()
) {
SpeechBuddyAuth()
SpeechBuddyAuth(isBackup = false)
}
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun subscribeObservers() {
sessionManager.isAuthorized.observe(this) { isAuthorized ->
if (isAuthorized) navHomeActivity()
if (isAuthorized &&
sessionManager.userId.value != GUEST &&
sessionManager.isLogin.value != true &&
getAutoBackup() &&
getLastBackupDate() != LocalDate.now().toString()
) {
autoBackup()
} else if (isAuthorized){
navHomeActivity()
}
}
}

companion object {
const val GUEST = -1
}

@RequiresApi(Build.VERSION_CODES.O)
private fun autoBackup() {
setContent {
SpeechBuddyTheme(
settingsRepository = settingsRepository,
initialDarkMode = getInitialDarkMode()
) {
SpeechBuddyAuth(isBackup = true)
}
}
displayBackup()
}

private fun navHomeActivity() {
val intent = Intent(this, HomeActivity::class.java)
startActivity(intent)
finish()
}

private fun getInitialDarkMode(): Boolean {
return displaySettingsViewModel.getDarkMode()
var darkMode = false
lifecycleScope.launch {
settingsRepository.getDarkMode().collect {
darkMode = it.data?: false
}
}
return darkMode
}

private fun getAutoBackup(): Boolean {
var autoBackup = true
lifecycleScope.launch {
settingsRepository.getAutoBackup().collect {
autoBackup = it.data?: true
}
}
return autoBackup
}

private fun getLastBackupDate(): String {
var lastBackupDate = ""
lifecycleScope.launch {
settingsRepository.getLastBackupDate().collect {
lastBackupDate = it.data?: ""
}
}
return lastBackupDate
}

private fun checkPreviousAuthUser() {
Expand All @@ -67,4 +126,73 @@ class AuthActivity : BaseActivity() {
return super.dispatchTouchEvent(event)
}

@RequiresApi(Build.VERSION_CODES.O)
private fun displayBackup() {
lifecycleScope.launch {
settingsRepository.displayBackup().collect { result ->
when (result.code()) {
ResponseCode.SUCCESS.value -> { symbolListBackup() }

ResponseCode.NO_INTERNET_CONNECTION.value -> {
sessionManager.setIsLogin(false)
navHomeActivity()
}
}
}
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun symbolListBackup() {
lifecycleScope.launch {
settingsRepository.symbolListBackup().collect { result ->
when (result.code()) {
ResponseCode.SUCCESS.value -> { favoriteSymbolBackup() }

ResponseCode.NO_INTERNET_CONNECTION.value -> {
sessionManager.setIsLogin(false)
navHomeActivity()
}
}

}
}

}

@RequiresApi(Build.VERSION_CODES.O)
private fun favoriteSymbolBackup() {
lifecycleScope.launch {
settingsRepository.favoriteSymbolBackup().collect { result ->
when (result.code()) {
ResponseCode.SUCCESS.value -> { weightTableBackup() }

ResponseCode.NO_INTERNET_CONNECTION.value -> {
sessionManager.setIsLogin(false)
navHomeActivity()
}
}
}
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun weightTableBackup() {
lifecycleScope.launch {
settingsRepository.weightTableBackup().collect { result ->
when (result.code()) {
ResponseCode.SUCCESS.value -> {
sessionManager.setIsLogin(false)
navHomeActivity()
}

ResponseCode.NO_INTERNET_CONNECTION.value -> {
sessionManager.setIsLogin(false)
navHomeActivity()
}
}
}
}
}

}
22 changes: 16 additions & 6 deletions frontend/app/src/main/java/com/example/speechbuddy/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,16 @@ import android.os.Bundle
import android.view.MotionEvent
import android.view.inputmethod.InputMethodManager
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.lifecycle.lifecycleScope
import com.example.speechbuddy.compose.SpeechBuddyHome
import com.example.speechbuddy.ui.SpeechBuddyTheme
import com.example.speechbuddy.viewmodel.DisplaySettingsViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch

@AndroidEntryPoint
class HomeActivity : BaseActivity() {

private val displaySettingsViewModel: DisplaySettingsViewModel by viewModels()

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {

Expand Down Expand Up @@ -48,11 +46,23 @@ class HomeActivity : BaseActivity() {
}

private fun getInitialPage(): Boolean {
return displaySettingsViewModel.getInitialPage()
var initialPage = false
lifecycleScope.launch {
settingsRepository.getInitialPage().collect {
initialPage = it.data?: false
}
}
return initialPage
}

private fun getInitialDarkMode(): Boolean {
return displaySettingsViewModel.getDarkMode()
var darkMode = false
lifecycleScope.launch {
settingsRepository.getDarkMode().collect {
darkMode = it.data?: false
}
}
return darkMode
}

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,28 @@ import com.example.speechbuddy.compose.resetpassword.ResetPasswordScreen
import com.example.speechbuddy.compose.signup.SignupScreen

@Composable
fun SpeechBuddyAuth() {
fun SpeechBuddyAuth(
isBackup: Boolean
) {
val navController = rememberNavController()
SpeechBuddyAuthNavHost(
navController = navController
navController = navController,
isBackup = isBackup
)
}

@Composable
fun SpeechBuddyAuthNavHost(
navController: NavHostController
navController: NavHostController,
isBackup: Boolean
) {
NavHost(navController = navController, startDestination = "landing") {
composable("landing") {
LandingScreen(
onLoginClick = {
navController.navigate("login")
}
},
isBackup = isBackup
)
}
composable("login") {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,39 @@
package com.example.speechbuddy.compose.landing

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.hilt.navigation.compose.hiltViewModel
import com.example.speechbuddy.R
import com.example.speechbuddy.compose.utils.ButtonUi
import com.example.speechbuddy.ui.SpeechBuddyTheme
import com.example.speechbuddy.viewmodel.LoginViewModel

@Composable
fun LandingScreen(
modifier: Modifier = Modifier,
onLoginClick: () -> Unit,
viewModel: LoginViewModel = hiltViewModel()
viewModel: LoginViewModel = hiltViewModel(),
isBackup: Boolean
) {
Surface(
modifier = modifier.fillMaxSize(),
Expand All @@ -46,15 +52,55 @@ fun LandingScreen(
modifier = Modifier.padding(horizontal = 24.dp, vertical = 64.dp),
contentAlignment = Alignment.BottomCenter
) {
Column(
verticalArrangement = Arrangement.spacedBy(14.dp)
if (!isBackup) {
Column(
verticalArrangement = Arrangement.spacedBy(14.dp)
) {
ButtonUi(
text = stringResource(id = R.string.start_guest_mode),
onClick = { viewModel.enterGuestMode() }
)
ButtonUi(text = stringResource(id = R.string.do_login), onClick = onLoginClick)
}
}
}
}

if (isBackup) {
Dialog(
onDismissRequest = {}
) {
Box(
modifier = Modifier
.wrapContentSize()
.background(MaterialTheme.colorScheme.surface)
.padding(24.dp)
) {
ButtonUi(
text = stringResource(id = R.string.start_guest_mode),
onClick = { viewModel.enterGuestMode() }
)
ButtonUi(text = stringResource(id = R.string.do_login), onClick = onLoginClick)
Column(
modifier = Modifier
.wrapContentSize()
) {
Text(
text = stringResource(id = R.string.auto_backup_title),
style = MaterialTheme.typography.headlineSmall
)
Spacer(modifier = Modifier.height(24.dp))
Row(
modifier = Modifier
.wrapContentSize(),
verticalAlignment = Alignment.CenterVertically
) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
Text(
text = stringResource(id = R.string.auto_backup_info),
modifier = Modifier.padding(start = 20.dp)
)
}
}
}
}
}

}
Loading