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

restore wallet: remove RecyclerView and use a custom populated layout #422

Merged
merged 3 commits into from
Jan 3, 2020
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
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@

<activity
android:name=".activities.RestoreWalletActivity"
android:windowSoftInputMode="adjustResize"
android:launchMode="singleTask" />

<activity
Expand Down
26 changes: 19 additions & 7 deletions app/src/main/java/com/dcrandroid/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,13 @@ import com.dcrandroid.activities.BaseActivity
import com.dcrandroid.adapter.NavigationTabsAdapter
import com.dcrandroid.data.Constants
import com.dcrandroid.data.Transaction
import com.dcrandroid.dialog.FullScreenBottomSheetDialog
import com.dcrandroid.dialog.ReceiveDialog
import com.dcrandroid.dialog.ResumeAccountDiscovery
import com.dcrandroid.dialog.WiFiSyncDialog
import com.dcrandroid.dialog.*
import com.dcrandroid.dialog.send.SendDialog
import com.dcrandroid.extensions.hide
import com.dcrandroid.extensions.openedWalletsList
import com.dcrandroid.extensions.show
import com.dcrandroid.fragments.MultiWalletTransactions
import com.dcrandroid.fragments.Overview
import com.dcrandroid.fragments.OverviewFragment
import com.dcrandroid.fragments.TransactionsFragment
import com.dcrandroid.fragments.WalletsFragment
import com.dcrandroid.fragments.more.MoreFragment
Expand Down Expand Up @@ -108,10 +105,25 @@ class HomeActivity : BaseActivity(), SyncProgressListener, TxAndBlockNotificatio
}
}

val bottomSheetDismissed = DialogInterface.OnDismissListener {
private val bottomSheetDismissed = DialogInterface.OnDismissListener {
currentBottomSheet = null
}

override fun onBackPressed() {
if (currentFragment is OverviewFragment) {
InfoDialog(this)
.setDialogTitle(getString(R.string.exit_app_prompt_title))
.setMessage(getString(R.string.exit_app_prompt_message))
.setPositiveButton(getString(R.string.yes), DialogInterface.OnClickListener { _, _ ->
finish()
})
.setNegativeButton(getString(R.string.no), null)
.show()
} else {
switchFragment(OverviewFragment.FRAGMENT_POSITION)
}
}

override fun onDestroy() {
super.onDestroy()

Expand Down Expand Up @@ -199,7 +211,7 @@ class HomeActivity : BaseActivity(), SyncProgressListener, TxAndBlockNotificatio
fun switchFragment(position: Int) {

currentFragment = when (position) {
0 -> Overview()
0 -> OverviewFragment()
1 -> {
if (multiWallet!!.openedWalletsCount() > 1) {
MultiWalletTransactions()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,52 +8,102 @@ package com.dcrandroid.activities

import android.content.Intent
import android.os.Bundle
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.NestedScrollView
import androidx.recyclerview.widget.LinearLayoutManager
import com.dcrandroid.R
import com.dcrandroid.adapter.RestoreWalletAdapter
import com.dcrandroid.adapter.SuggestionsTextAdapter
import com.dcrandroid.data.Constants
import com.dcrandroid.fragments.PasswordPinDialogFragment
import com.dcrandroid.util.SnackBar
import com.dcrandroid.util.WalletData
import com.dcrandroid.view.SeedEditTextLayout
import com.dcrandroid.view.util.SeedEditTextHelper
import dcrlibwallet.Dcrlibwallet
import dcrlibwallet.MultiWallet
import kotlinx.android.synthetic.main.activity_restore_wallet.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

// TODO: Hide restore button while keyboard is visible
class RestoreWalletActivity : BaseActivity(), PasswordPinDialogFragment.PasswordPinListener {
const val SEED_COUNT = 33

class RestoreWalletActivity : AppCompatActivity(), PasswordPinDialogFragment.PasswordPinListener {

private val multiWallet: MultiWallet?
get() = WalletData.multiWallet

var allSeedWords = ArrayList<String>()
lateinit var adapter: RestoreWalletAdapter
val seedInputHelperList = ArrayList<SeedEditTextHelper>()

val allSeedIsValid: Boolean
get() {
for (helper in seedInputHelperList) {
if (!validateSeed(helper.getSeed())) {
return false
}
}

return true
}

private val enteredSeeds: String
get() {
val seeds = ArrayList<String>()
seedInputHelperList.forEach { seeds.add(it.getSeed()) }

return seeds.joinToString(" ")
}

private val validateSeed: (seed: String) -> Boolean = {
allSeedWords.indexOf(it) > 0
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_restore_wallet)

nested_scroll_view.setOnScrollChangeListener { _: NestedScrollView?, _: Int, scrollY: Int, _: Int, _: Int ->
app_bar.elevation = when {
scrollY > 0 -> resources.getDimension(R.dimen.app_bar_elevation)
else -> 0f
loadSeedSuggestions()
val suggestionsAdapter = SuggestionsTextAdapter(this, R.layout.dropdown_item_1, allSeedWords)

for (i in 0 until SEED_COUNT) {
val layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val seedEditText = SeedEditTextLayout(this)
seedEditText.layoutParams = layoutParams

seed_input_list.addView(seedEditText)

val seedInputHelper = SeedEditTextHelper(seedEditText, suggestionsAdapter, i)

seedInputHelper.validateSeed = validateSeed

seedInputHelper.seedChanged = {
btn_restore.isEnabled = allSeedIsValid
Unit
}
}

val layoutManager = LinearLayoutManager(this@RestoreWalletActivity)
recycler_view_seeds.layoutManager = layoutManager
seedInputHelper.moveToNextRow = { currentItem ->
val nextRow = currentItem + 1
if (nextRow < SEED_COUNT) {
val scrollY = seedInputHelperList[nextRow].requestFocus()
nested_scroll_view.scrollTo(0, scrollY)

adapter = RestoreWalletAdapter(this@RestoreWalletActivity, allSeedWords)
recycler_view_seeds.adapter = adapter
}
}

adapter.seedChanged = { _, allValid ->
btn_restore.isEnabled = allValid
Unit
seedInputHelperList.add(seedInputHelper)
}

loadSeedSuggestions()
nested_scroll_view.setOnScrollChangeListener { _: NestedScrollView?, _: Int, scrollY: Int, _: Int, _: Int ->
app_bar.elevation = when {
scrollY > 0 -> resources.getDimension(R.dimen.app_bar_elevation)
else -> 0f
}
}

btn_restore.setOnClickListener {
val seed = adapter.enteredSeeds.joinToString(" ")
val seedValid = Dcrlibwallet.verifySeed(seed)
val seedValid = Dcrlibwallet.verifySeed(enteredSeeds)

if (!seedValid) {
SnackBar.showError(this, R.string.invalid_restore_seed)
Expand All @@ -71,9 +121,8 @@ class RestoreWalletActivity : BaseActivity(), PasswordPinDialogFragment.Password
allSeedWords.addAll(seedWords)
}

override fun onEnterPasswordOrPin(spendingKey: String, passphraseType: Int) {
val seed = adapter.enteredSeeds.joinToString(" ") // already verified when restore button was tapped
createWallet(spendingKey, passphraseType, seed)
override fun onEnterPasswordOrPin(newPassphrase: String, passphraseType: Int) {
createWallet(newPassphrase, passphraseType, enteredSeeds)
}

private fun createWallet(spendingKey: String, spendingPassType: Int, seed: String) = GlobalScope.launch(Dispatchers.IO) {
Expand Down
14 changes: 5 additions & 9 deletions app/src/main/java/com/dcrandroid/activities/SaveSeedActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,13 @@ class SaveSeedActivity : BaseActivity() {
setContentView(R.layout.save_seed_page)

try {
val vto = scroll_view_seeds.viewTreeObserver
if (vto.isAlive) {
vto.addOnScrollChangedListener {
app_bar.elevation = if (scroll_view_seeds.scrollY != 0) {
resources.getDimension(R.dimen.app_bar_elevation)
} else {
0f
}
scroll_view_seeds.setOnScrollChangeListener { _, _, scrollY, _, _ ->
app_bar.elevation = if (scrollY != 0) {
resources.getDimension(R.dimen.app_bar_elevation)
} else {
0f
}
}

} catch (e: Exception) {
e.printStackTrace()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,16 @@ class SeedBackupSuccess : BaseActivity() {
setContentView(R.layout.seed_verification_success)
}

fun backToWallets(v: View) {
fun backToWallets(v: View?) {
val walletID = intent.getLongExtra(Constants.WALLET_ID, -1)
val data = Intent()
data.putExtra(Constants.WALLET_ID, walletID)
setResult(Activity.RESULT_OK, data)
finish()
}

override fun onBackPressed() {
backToWallets(null)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ class VerifySeedInstruction : BaseActivity() {
go_back.setOnClickListener {
finish()
}

scroll_view.setOnScrollChangeListener { _, _, scrollY, _, _ ->
app_bar.elevation = if (scrollY > 0) {
resources.getDimension(R.dimen.app_bar_elevation)
} else {
0f
}
}
}

fun verifyChecks(v: View) {
Expand Down
140 changes: 0 additions & 140 deletions app/src/main/java/com/dcrandroid/adapter/RestoreWalletAdapter.kt

This file was deleted.

Loading