Skip to content

Commit

Permalink
Merge pull request #320 from PermanentOrg/feature/VSP-1476
Browse files Browse the repository at this point in the history
2FA Verification - Disabled Status.
  • Loading branch information
flaviahandrea-vsp authored Dec 17, 2024
2 parents 0363401 + b3d4544 commit 9661374
Show file tree
Hide file tree
Showing 22 changed files with 279 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.permanent.permanent.network

import org.permanent.permanent.network.models.TwoFAVO

interface ITwoFAListener {
fun onSuccess(twoFAVO: TwoFAVO?)
fun onFailed(error: String?)
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import org.permanent.permanent.network.models.ResponseVO
import org.permanent.permanent.network.models.Shareby_urlVO
import org.permanent.permanent.network.models.SimpleRequestContainer
import org.permanent.permanent.network.models.StorageGift
import org.permanent.permanent.network.models.TwoFAVO
import org.permanent.permanent.network.models.UploadDestination
import org.permanent.permanent.ui.PREFS_NAME
import org.permanent.permanent.ui.PreferencesHelper
Expand Down Expand Up @@ -764,7 +765,7 @@ class NetworkClient(private var okHttpClient: OkHttpClient?, context: Context) {

fun addRemoveTags(tags: Tags): Call<ResponseVO> = stelaAccountService.addRemoveTags(tags)

// fun getTwoFAMethod(): Call<ResponseVO> = stelaAccountService.getTwoFAMethod()
fun getTwoFAMethod(): Call<List<TwoFAVO>> = stelaAccountService.getTwoFAMethod()

fun getPaymentIntent(
accountId: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ package org.permanent.permanent.network

import org.permanent.permanent.models.Tags
import org.permanent.permanent.network.models.ResponseVO
import org.permanent.permanent.network.models.TwoFAVO
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.PUT

interface StelaAccountService {

@PUT("api/v2/account/tags")
fun addRemoveTags(@Body tags: Tags): Call<ResponseVO>

// @GET("api/v2/idpuser")
// fun getTwoFAMethod(): Call<ResponseVO>
@GET("api/v2/idpuser")
fun getTwoFAMethod(): Call<List<TwoFAVO>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ class ResponseVO {
fun getLocationVO(): LocnVO? = getData()?.get(0)?.LocnVO

fun getTagVO(): TagVO? = getData()?.get(0)?.TagVO

fun getProfileItemVO(): Profile_itemVO? {
return getData()?.get(0)?.Profile_itemVO
}

fun getPromoVO(): PromoVO? {
return getData()?.get(0)?.PromoVO
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.permanent.permanent.network.models

class TwoFAVO {
var methodId: String? = null
var method: String? = null
var value: String? = null // email or phone nr
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package org.permanent.permanent.repositories

import org.permanent.permanent.models.Tags
import org.permanent.permanent.network.IResponseListener
import org.permanent.permanent.network.ITwoFAListener

interface StelaAccountRepository {

fun addRemoveTags(tags: Tags, listener: IResponseListener)

// fun getTwoFAMethod(listener: IResponseListener)
fun getTwoFAMethod(listener: ITwoFAListener)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import android.content.Context
import org.permanent.permanent.R
import org.permanent.permanent.models.Tags
import org.permanent.permanent.network.IResponseListener
import org.permanent.permanent.network.ITwoFAListener
import org.permanent.permanent.network.NetworkClient
import org.permanent.permanent.network.models.ResponseVO
import org.permanent.permanent.network.models.TwoFAVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
Expand All @@ -17,52 +19,52 @@ class StelaAccountRepositoryImpl(context: Context) : StelaAccountRepository {

NetworkClient.instance().addRemoveTags(tags).enqueue(object : Callback<ResponseVO> {

override fun onResponse(call: Call<ResponseVO>, response: Response<ResponseVO>) {
if (response.isSuccessful) {
val newLegacyContact = response.body()
if (newLegacyContact != null) {
listener.onSuccess("")
} else {
listener.onFailed(appContext.getString(R.string.generic_error))
}
override fun onResponse(call: Call<ResponseVO>, response: Response<ResponseVO>) {
if (response.isSuccessful) {
val newLegacyContact = response.body()
if (newLegacyContact != null) {
listener.onSuccess("")
} else {
try {
listener.onFailed(response.errorBody().toString())
} catch (e: Exception) {
listener.onFailed(e.message)
}
listener.onFailed(appContext.getString(R.string.generic_error))
}
} else {
try {
listener.onFailed(response.errorBody().toString())
} catch (e: Exception) {
listener.onFailed(e.message)
}
}
}

override fun onFailure(call: Call<ResponseVO>, t: Throwable) {
listener.onFailed(t.message)
}
})
override fun onFailure(call: Call<ResponseVO>, t: Throwable) {
listener.onFailed(t.message)
}
})
}

// override fun getTwoFAMethod(listener: IResponseListener) {
// NetworkClient.instance().getTwoFAMethod().enqueue(object : Callback<ResponseVO> {
//
// override fun onResponse(call: Call<ResponseVO>, response: Response<ResponseVO>) {
// if (response.isSuccessful) {
// val responseBody = response.body()
// if (responseBody != null) {
// listener.onSuccess("")
// } else {
// listener.onFailed(appContext.getString(R.string.generic_error))
// }
// } else {
// try {
// listener.onFailed(response.errorBody().toString())
// } catch (e: Exception) {
// listener.onFailed(e.message)
// }
// }
// }
//
// override fun onFailure(call: Call<ResponseVO>, t: Throwable) {
// listener.onFailed(t.message)
// }
// })
// }
override fun getTwoFAMethod(listener: ITwoFAListener) {
NetworkClient.instance().getTwoFAMethod().enqueue(object : Callback<List<TwoFAVO>> {

override fun onResponse(call: Call<List<TwoFAVO>>, response: Response<List<TwoFAVO>>) {
if (response.isSuccessful) {
val twoFAVOList = response.body()
if (twoFAVOList != null) {
listener.onSuccess(if (twoFAVOList.isEmpty()) null else twoFAVOList[0])
} else {
listener.onFailed(appContext.getString(R.string.generic_error))
}
} else {
try {
listener.onFailed(response.errorBody().toString())
} catch (e: Exception) {
listener.onFailed(e.message)
}
}
}

override fun onFailure(call: Call<List<TwoFAVO>>, t: Throwable) {
listener.onFailed(t.message)
}
})
}
}
12 changes: 12 additions & 0 deletions app/src/main/java/org/permanent/permanent/ui/PreferencesHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const val PREFS_NAME = "permanent_preferences"
const val IS_USER_LOGGED_IN = "is_user_logged_in"
const val IS_BIOMETRICS_LOG_IN = "is_biometrics_log_in"
const val IS_LIST_VIEW_MODE = "is_list_view_mode"
const val IS_TWO_FA_ENABLED = "is_two_fa_enabled"
const val SHOW_ARCHIVES_SCREEN = "should_show_archives_screen"
const val SHOW_REDEEM_CODE_SCREEN = "should_redeem_code_screen"
const val PROMO_CODE = "promo_code"
Expand Down Expand Up @@ -409,4 +410,15 @@ class PreferencesHelper(private val sharedPreferences: SharedPreferences) {
val windowWidthSizeString = sharedPreferences.getString(WINDOW_WIDTH_SIZE_CLASS, "")
return !windowWidthSizeString.equals(WindowWidthSizeClass.COMPACT.toString())
}

fun setIsTwoFAEnabled(isEnabled: Boolean) {
with(sharedPreferences.edit()) {
putBoolean(IS_TWO_FA_ENABLED, isEnabled)
apply()
}
}

fun isTwoFAEnabled(): Boolean {
return sharedPreferences.getBoolean(IS_TWO_FA_ENABLED, false)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class MainActivity : PermanentBaseActivity(), Toolbar.OnMenuItemClickListener {
binding.toolbar.menu?.findItem(R.id.moreItem)?.isVisible = true
}

R.id.legacyLoadingFragment, R.id.storageMenuFragment, R.id.addStorageFragment, R.id.giftStorageFragment, R.id.redeemCodeFragment, R.id.loginAndSecurityFragment, R.id.changePasswordFragment -> {
R.id.legacyLoadingFragment, R.id.storageMenuFragment, R.id.addStorageFragment, R.id.giftStorageFragment, R.id.redeemCodeFragment, R.id.loginAndSecurityFragment, R.id.changePasswordFragment, R.id.twoStepVerificationFragment -> {
binding.toolbar.menu?.findItem(R.id.settingsItem)?.isVisible = false
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.permanent.permanent.ui.settings

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.material3.MaterialTheme
import androidx.compose.ui.platform.ComposeView
import org.permanent.permanent.ui.PermanentBaseFragment
import org.permanent.permanent.ui.settings.compose.TwoStepVerificationScreen

class TwoStepVerificationFragment : PermanentBaseFragment() {

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
MaterialTheme {
TwoStepVerificationScreen { //TODO: onAddTwoStepBtn
}
}
}
}
}

override fun connectViewModelEvents() {
}

override fun disconnectViewModelEvents() {
}

override fun onResume() {
super.onResume()
connectViewModelEvents()
}

override fun onPause() {
super.onPause()
disconnectViewModelEvents()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ fun LoginAndSecurityMenu(
onTwoStepVerificationClick: () -> Unit
) {
val isFingerprintEnabled by viewModel.isBiometricsEnabled.collectAsState()
val isTwoFAEnabled by viewModel.isTwoFAEnabled.collectAsState()

Box(
modifier = Modifier
Expand All @@ -48,7 +49,8 @@ fun LoginAndSecurityMenu(
iconResource = painterResource(id = R.drawable.ic_lock_primary),
title = stringResource(R.string.two_step_verification),
subtitle = stringResource(R.string.two_step_verification_description),
showOffLabel = true,
showOffLabel = !isTwoFAEnabled,
showOnLabel = isTwoFAEnabled,
showArrow = true,
) { onTwoStepVerificationClick() }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ fun SettingsMenuScreen(
val spaceUsedBytes by viewModel.getSpaceUsed().observeAsState(initial = 0L)
val spaceUsedPercentage by viewModel.getSpaceUsedPercentage().observeAsState(initial = 0)

val isTwoFAEnabled by viewModel.isTwoFAEnabled().observeAsState(initial = false)

Column(
modifier = Modifier
.fillMaxSize()
Expand Down Expand Up @@ -127,7 +129,7 @@ fun SettingsMenuScreen(
SettingsMenuItem(
painterResource(id = R.drawable.ic_security_primary),
stringResource(R.string.login_and_security),
showWarning = true,
showWarning = !isTwoFAEnabled,
) { onLoginAndSecurityClick() }

SettingsMenuItem(
Expand Down
Loading

0 comments on commit 9661374

Please sign in to comment.