Skip to content

Commit 1db6a7f

Browse files
committed
Merge branch '1.9.54'
2 parents 3e0a008 + 972c4ad commit 1db6a7f

File tree

168 files changed

+6620
-1208
lines changed

Some content is hidden

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

168 files changed

+6620
-1208
lines changed

configs/dependencies.gradle

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ ext {
2828
hiltVersion = "2.48"
2929

3030
// Nunchuk dep versions
31-
nativeSdkVersion = '1.1.78'
32-
prebuildNativeSdkVersion = '1.1.78@aar'
31+
nativeSdkVersion = '1.1.79'
32+
prebuildNativeSdkVersion = '1.1.79@aar'
3333

3434
// Matrix
3535
matrixSdkVersion = '1.5.30'
@@ -39,10 +39,10 @@ ext {
3939

4040
MAJOR_VERSION = 1
4141
MINOR_VERSION = 9
42-
PATCH_VERSION = 53
42+
PATCH_VERSION = 54
4343
TASK_LABEL = "DEV"
4444

45-
VERSION_CODE = 249
45+
VERSION_CODE = 250
4646

4747
androidConfig = [
4848
applicationId : "com.nunchuk.android",

nunchuk-app/src/main/java/com/nunchuk/android/app/nav/NunchukNavigatorImpl.kt

+26-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.nunchuk.android.main.membership.MembershipActivity
4646
import com.nunchuk.android.main.membership.authentication.WalletAuthenticationActivity
4747
import com.nunchuk.android.main.membership.byzantine.groupdashboard.GroupDashboardActivity
4848
import com.nunchuk.android.main.membership.byzantine.primaryowner.PrimaryOwnerActivity
49+
import com.nunchuk.android.main.membership.key.desktop.AddDesktopKeyActivity
4950
import com.nunchuk.android.main.membership.policy.ConfigServerKeyActivity
5051
import com.nunchuk.android.main.rollover.RollOverWalletActivity
5152
import com.nunchuk.android.messages.nav.MessageNavigatorDelegate
@@ -54,6 +55,7 @@ import com.nunchuk.android.model.GroupKeyPolicy
5455
import com.nunchuk.android.model.Inheritance
5556
import com.nunchuk.android.model.KeyPolicy
5657
import com.nunchuk.android.model.MembershipStage
58+
import com.nunchuk.android.model.MembershipStep
5759
import com.nunchuk.android.model.UnspentOutput
5860
import com.nunchuk.android.model.byzantine.GroupWalletType
5961
import com.nunchuk.android.nav.AppNavigator
@@ -62,6 +64,7 @@ import com.nunchuk.android.settings.nav.SettingNavigatorDelegate
6264
import com.nunchuk.android.signer.nav.NfcNavigatorDelegate
6365
import com.nunchuk.android.signer.nav.SignerNavigatorDelegate
6466
import com.nunchuk.android.transaction.nav.TransactionNavigatorDelegate
67+
import com.nunchuk.android.type.SignerTag
6568
import com.nunchuk.android.wallet.components.coin.CoinActivity
6669
import com.nunchuk.android.wallet.nav.WalletNavigatorDelegate
6770
import javax.inject.Inject
@@ -167,6 +170,22 @@ internal class NunchukNavigatorImpl @Inject constructor() : NunchukNavigator,
167170
activityContext.startActivity(it)
168171
}
169172
}
173+
174+
override fun openAddDesktopKey(
175+
activity: Activity,
176+
signerTag: SignerTag,
177+
groupId: String?,
178+
step: MembershipStep,
179+
isAddInheritanceKey: Boolean
180+
) {
181+
AddDesktopKeyActivity.navigate(
182+
activity = activity,
183+
signerTag = signerTag,
184+
groupId = groupId,
185+
step = step,
186+
isAddInheritanceKey = isAddInheritanceKey
187+
)
188+
}
170189
}
171190

172191
interface AppNavigatorDelegate : AppNavigator {
@@ -185,15 +204,20 @@ interface AppNavigatorDelegate : AppNavigator {
185204
groupId: String?,
186205
isPersonalWallet: Boolean,
187206
walletType: GroupWalletType?,
207+
isClearTop: Boolean
188208
) {
189209
val intent = MembershipActivity.buildIntent(
190210
activity = activityContext,
191211
groupStep = groupStep,
192212
walletId = walletId,
193213
groupId = groupId,
194214
isPersonalWallet = isPersonalWallet,
195-
walletType = walletType
196-
)
215+
walletType = walletType,
216+
).apply {
217+
if (isClearTop) {
218+
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
219+
}
220+
}
197221
activityContext.startActivity(intent)
198222
}
199223

nunchuk-auth/src/main/java/com/nunchuk/android/auth/components/changepass/ChangePasswordActivity.kt

+79-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import android.text.style.ClickableSpan
2929
import android.text.style.ForegroundColorSpan
3030
import android.text.style.StyleSpan
3131
import android.view.View
32+
import android.widget.TextView
3233
import androidx.activity.viewModels
34+
import androidx.core.content.ContextCompat
3335
import androidx.core.text.buildSpannedString
3436
import androidx.core.text.inSpans
3537
import androidx.core.view.isVisible
@@ -46,12 +48,14 @@ import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.NewPas
4648
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.OldPasswordRequiredEvent
4749
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.OldPasswordValidEvent
4850
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.ShowEmailSentEvent
51+
import com.nunchuk.android.auth.components.changepass.ChangePasswordViewModel.Companion.SPECIAL_CHARACTERS
4952
import com.nunchuk.android.auth.databinding.ActivityChangePasswordBinding
5053
import com.nunchuk.android.core.account.SignInType
5154
import com.nunchuk.android.core.base.BaseActivity
5255
import com.nunchuk.android.core.manager.NcToastManager
5356
import com.nunchuk.android.core.util.orUnknownError
5457
import com.nunchuk.android.widget.NCToastMessage
58+
import com.nunchuk.android.widget.util.addTextChangedCallback
5559
import com.nunchuk.android.widget.util.setTransparentStatusBar
5660
import dagger.hilt.android.AndroidEntryPoint
5761
import kotlinx.coroutines.delay
@@ -105,11 +109,6 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
105109
NCToastMessage(this).showMessage(getString(R.string.nc_resend_request_submitted))
106110
showCountdownTimer(it.email)
107111
}
108-
109-
ChangePasswordEvent.NewPasswordLengthErrorEvent -> binding.newPassword.setError(getString(R.string.nc_text_password_length_error))
110-
ChangePasswordEvent.NewPasswordNumberErrorEvent -> binding.newPassword.setError(getString(R.string.nc_text_password_number_error))
111-
ChangePasswordEvent.NewPasswordSpecialCharErrorEvent -> binding.newPassword.setError(getString(R.string.nc_text_password_special_char_error))
112-
ChangePasswordEvent.NewPasswordUpperCaseErrorEvent -> binding.newPassword.setError(getString(R.string.nc_text_password_upper_case_error))
113112
}
114113
}
115114
}
@@ -145,7 +144,12 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
145144
}s)"
146145
)
147146
val startIndex = indexOf(email)
148-
setSpan(StyleSpan(BOLD), startIndex, startIndex + email.length, SPAN_INCLUSIVE_EXCLUSIVE)
147+
setSpan(
148+
StyleSpan(BOLD),
149+
startIndex,
150+
startIndex + email.length,
151+
SPAN_INCLUSIVE_EXCLUSIVE
152+
)
149153
setSpan(
150154
ForegroundColorSpan(getColor(R.color.nc_primary_color)),
151155
startIndex,
@@ -177,7 +181,12 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
177181
}
178182
append(" ")
179183
val startIndex = indexOf(email)
180-
setSpan(StyleSpan(BOLD), startIndex, startIndex + email.length, SPAN_INCLUSIVE_EXCLUSIVE)
184+
setSpan(
185+
StyleSpan(BOLD),
186+
startIndex,
187+
startIndex + email.length,
188+
SPAN_INCLUSIVE_EXCLUSIVE
189+
)
181190
setSpan(
182191
ForegroundColorSpan(getColor(R.color.nc_primary_color)),
183192
startIndex,
@@ -193,6 +202,13 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
193202
binding.newPassword.makeMaskedInput()
194203
binding.confirmPassword.makeMaskedInput()
195204
binding.changePassword.setOnClickListener { onChangePasswordClicked() }
205+
binding.newPassword.addTextChangedCallback {
206+
validateNewPassword(it)
207+
}
208+
binding.newPassword.getEditTextView().setOnFocusChangeListener { v, hasFocus ->
209+
binding.passwordErrorGroup.isVisible =
210+
hasFocus || binding.newPassword.getEditText().isNotEmpty()
211+
}
196212
}
197213

198214
private fun showChangePasswordError(errorMessage: String) {
@@ -208,6 +224,62 @@ class ChangePasswordActivity : BaseActivity<ActivityChangePasswordBinding>() {
208224
)
209225
}
210226

227+
private fun validateNewPassword(newPassword: String) {
228+
if (newPassword.isEmpty()) {
229+
listOf(
230+
binding.tvAtLeastOneNumber,
231+
binding.tvAtLeastOneUpperCase,
232+
binding.tvAtLeastOneSpecialChar,
233+
binding.tvAtLeast8Characters
234+
).forEach {
235+
it.setTextColor(ContextCompat.getColor(this, R.color.nc_primary_color))
236+
it.setCompoundDrawablesRelativeWithIntrinsicBounds(
237+
R.drawable.ic_dot,
238+
0,
239+
0,
240+
0
241+
)
242+
}
243+
} else {
244+
applyPasswordAttribute(
245+
binding.tvAtLeastOneNumber,
246+
newPassword.any { it.isDigit() }
247+
)
248+
applyPasswordAttribute(
249+
binding.tvAtLeastOneUpperCase,
250+
newPassword.any { it.isUpperCase() }
251+
)
252+
applyPasswordAttribute(
253+
binding.tvAtLeastOneSpecialChar,
254+
newPassword.any { it in SPECIAL_CHARACTERS }
255+
)
256+
applyPasswordAttribute(
257+
binding.tvAtLeast8Characters,
258+
newPassword.length >= 8
259+
)
260+
}
261+
}
262+
263+
private fun applyPasswordAttribute(tv: TextView, isPass: Boolean) {
264+
if (isPass) {
265+
tv.setTextColor(ContextCompat.getColor(this, R.color.nc_slime_dark))
266+
tv.setCompoundDrawablesRelativeWithIntrinsicBounds(
267+
R.drawable.ic_check_green,
268+
0,
269+
0,
270+
0
271+
)
272+
} else {
273+
tv.setTextColor(ContextCompat.getColor(this, R.color.nc_orange_color))
274+
tv.setCompoundDrawablesRelativeWithIntrinsicBounds(
275+
R.drawable.ic_info_red,
276+
0,
277+
0,
278+
0
279+
)
280+
}
281+
}
282+
211283
companion object {
212284

213285
private const val IS_NEW_ACCOUNT = "is_new_account"

nunchuk-auth/src/main/java/com/nunchuk/android/auth/components/changepass/ChangePasswordEvent.kt

-4
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,4 @@ internal sealed class ChangePasswordEvent {
3232
data object LoadingEvent : ChangePasswordEvent()
3333
data class ChangePasswordSuccessError(val errorMessage: String?) : ChangePasswordEvent()
3434
data class ResendPasswordSuccessEvent(val email: String) : ChangePasswordEvent()
35-
data object NewPasswordLengthErrorEvent : ChangePasswordEvent()
36-
data object NewPasswordSpecialCharErrorEvent : ChangePasswordEvent()
37-
data object NewPasswordUpperCaseErrorEvent : ChangePasswordEvent()
38-
data object NewPasswordNumberErrorEvent : ChangePasswordEvent()
3935
}

nunchuk-auth/src/main/java/com/nunchuk/android/auth/components/changepass/ChangePasswordViewModel.kt

-12
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.Confir
2727
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.ConfirmPasswordRequiredEvent
2828
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.ConfirmPasswordValidEvent
2929
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.LoadingEvent
30-
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.NewPasswordValidEvent
3130
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.OldPasswordRequiredEvent
3231
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.OldPasswordValidEvent
3332
import com.nunchuk.android.auth.components.changepass.ChangePasswordEvent.ShowEmailSentEvent
@@ -67,7 +66,6 @@ internal class ChangePasswordViewModel @Inject constructor(
6766
fun handleChangePassword(oldPassword: String, newPassword: String, confirmPassword: String) {
6867
viewModelScope.launch {
6968
if (validateOldPassword(oldPassword)
70-
&& validateNewPassword(newPassword)
7169
&& validateConfirmPassword(confirmPassword)
7270
&& validateConfirmPasswordMatched(newPassword, confirmPassword)
7371
) {
@@ -111,16 +109,6 @@ internal class ChangePasswordViewModel @Inject constructor(
111109
else -> doAfterValidate { setEvent(OldPasswordValidEvent) }
112110
}
113111

114-
private fun validateNewPassword(newPassword: String): Boolean {
115-
return when {
116-
newPassword.length < 8 -> doAfterValidate(false) { setEvent(ChangePasswordEvent.NewPasswordLengthErrorEvent) }
117-
newPassword.none { it.isDigit() } -> doAfterValidate(false) { setEvent(ChangePasswordEvent.NewPasswordNumberErrorEvent) }
118-
newPassword.none { it.isUpperCase() } -> doAfterValidate(false) { setEvent(ChangePasswordEvent.NewPasswordUpperCaseErrorEvent) }
119-
newPassword.none { it in SPECIAL_CHARACTERS } -> doAfterValidate(false) { setEvent(ChangePasswordEvent.NewPasswordSpecialCharErrorEvent) }
120-
else -> doAfterValidate { setEvent(NewPasswordValidEvent) }
121-
}
122-
}
123-
124112
private fun validateConfirmPassword(confirmPassword: String) = when {
125113
confirmPassword.isEmpty() -> doAfterValidate(false) { setEvent(ConfirmPasswordRequiredEvent) }
126114
else -> doAfterValidate { setEvent(ConfirmPasswordValidEvent) }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="12dp"
3+
android:height="12dp"
4+
android:viewportWidth="12"
5+
android:viewportHeight="12">
6+
<path
7+
android:pathData="M8.273,4.477C8.325,4.529 8.367,4.591 8.395,4.66C8.424,4.728 8.438,4.801 8.438,4.875C8.438,4.95 8.424,5.023 8.395,5.091C8.367,5.16 8.325,5.222 8.273,5.274L5.648,7.899C5.596,7.951 5.534,7.993 5.465,8.021C5.397,8.05 5.324,8.064 5.25,8.064C5.175,8.064 5.102,8.05 5.034,8.021C4.965,7.993 4.903,7.951 4.851,7.899L3.726,6.774C3.674,6.722 3.632,6.659 3.604,6.591C3.576,6.523 3.561,6.449 3.561,6.375C3.561,6.301 3.576,6.228 3.604,6.16C3.632,6.091 3.674,6.029 3.726,5.977C3.778,5.925 3.841,5.883 3.909,5.855C3.977,5.827 4.051,5.812 4.125,5.812C4.199,5.812 4.272,5.827 4.34,5.855C4.409,5.883 4.471,5.925 4.523,5.977L5.25,6.703L7.477,4.476C7.529,4.423 7.591,4.382 7.66,4.354C7.728,4.326 7.801,4.311 7.875,4.311C7.949,4.311 8.022,4.326 8.091,4.355C8.159,4.383 8.221,4.425 8.273,4.477ZM11.063,6C11.063,7.001 10.766,7.98 10.209,8.813C9.653,9.645 8.862,10.294 7.937,10.677C7.012,11.06 5.994,11.161 5.012,10.965C4.03,10.77 3.128,10.288 2.42,9.58C1.712,8.872 1.23,7.97 1.035,6.988C0.839,6.006 0.94,4.988 1.323,4.063C1.706,3.138 2.355,2.347 3.187,1.791C4.02,1.234 4.999,0.938 6,0.938C7.342,0.939 8.629,1.473 9.578,2.422C10.527,3.371 11.061,4.658 11.063,6ZM9.938,6C9.938,5.221 9.707,4.46 9.274,3.812C8.841,3.165 8.226,2.66 7.507,2.362C6.787,2.064 5.996,1.986 5.232,2.138C4.468,2.29 3.766,2.665 3.216,3.216C2.665,3.766 2.29,4.468 2.138,5.232C1.986,5.996 2.064,6.787 2.362,7.507C2.66,8.226 3.165,8.841 3.812,9.274C4.46,9.707 5.221,9.938 6,9.938C7.044,9.936 8.045,9.521 8.783,8.783C9.521,8.045 9.936,7.044 9.938,6Z"
8+
android:fillColor="#1C652D"/>
9+
</vector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="12dp"
3+
android:height="12dp"
4+
android:viewportWidth="12"
5+
android:viewportHeight="12">
6+
<path
7+
android:pathData="M9.25,6C9.25,6.643 9.059,7.271 8.702,7.806C8.345,8.34 7.838,8.757 7.244,9.003C6.65,9.249 5.996,9.313 5.366,9.188C4.736,9.062 4.156,8.753 3.702,8.298C3.247,7.844 2.938,7.264 2.812,6.634C2.687,6.004 2.751,5.35 2.997,4.756C3.243,4.162 3.66,3.655 4.194,3.298C4.729,2.941 5.357,2.75 6,2.75C6.862,2.751 7.688,3.094 8.297,3.703C8.906,4.312 9.249,5.138 9.25,6Z"
8+
android:fillColor="#031F2B"/>
9+
</vector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="12dp"
3+
android:height="12dp"
4+
android:viewportWidth="12"
5+
android:viewportHeight="12">
6+
<path
7+
android:pathData="M5.063,3.938C5.063,3.789 5.106,3.644 5.189,3.521C5.271,3.397 5.388,3.301 5.525,3.245C5.663,3.188 5.813,3.173 5.959,3.202C6.104,3.231 6.238,3.302 6.343,3.407C6.448,3.512 6.519,3.646 6.548,3.791C6.577,3.937 6.562,4.087 6.505,4.225C6.449,4.362 6.353,4.479 6.229,4.561C6.106,4.644 5.961,4.688 5.813,4.688C5.614,4.688 5.423,4.608 5.282,4.468C5.142,4.327 5.063,4.136 5.063,3.938ZM11.063,6C11.063,7.001 10.766,7.98 10.209,8.813C9.653,9.645 8.862,10.294 7.937,10.677C7.012,11.06 5.994,11.161 5.012,10.965C4.03,10.77 3.128,10.288 2.42,9.58C1.712,8.872 1.23,7.97 1.035,6.988C0.839,6.006 0.94,4.988 1.323,4.063C1.706,3.138 2.355,2.347 3.187,1.791C4.02,1.234 4.999,0.938 6,0.938C7.342,0.939 8.629,1.473 9.578,2.422C10.527,3.371 11.061,4.658 11.063,6ZM9.938,6C9.938,5.221 9.707,4.46 9.274,3.812C8.841,3.165 8.226,2.66 7.507,2.362C6.787,2.064 5.996,1.986 5.232,2.138C4.468,2.29 3.766,2.665 3.216,3.216C2.665,3.766 2.29,4.468 2.138,5.232C1.986,5.996 2.064,6.787 2.362,7.507C2.66,8.226 3.165,8.841 3.812,9.274C4.46,9.707 5.221,9.938 6,9.938C7.044,9.936 8.045,9.521 8.783,8.783C9.521,8.045 9.936,7.044 9.938,6ZM6.563,7.719V6.188C6.563,5.939 6.464,5.7 6.288,5.525C6.112,5.349 5.874,5.25 5.625,5.25C5.492,5.25 5.364,5.297 5.262,5.382C5.16,5.468 5.092,5.586 5.07,5.717C5.047,5.848 5.072,5.983 5.139,6.098C5.207,6.212 5.312,6.299 5.438,6.343V7.875C5.438,8.124 5.536,8.362 5.712,8.538C5.888,8.714 6.126,8.813 6.375,8.813C6.508,8.813 6.636,8.766 6.738,8.68C6.84,8.595 6.908,8.476 6.93,8.345C6.953,8.214 6.928,8.08 6.861,7.965C6.793,7.85 6.688,7.763 6.563,7.719Z"
8+
android:fillColor="#CF4018"/>
9+
</vector>

0 commit comments

Comments
 (0)