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

implement account filter operation on privacy setup #765

Merged
merged 7 commits into from May 28, 2021
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4,188 changes: 2,094 additions & 2,094 deletions Decred Wallet.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1240"
LastUpgradeVersion = "1250"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1240"
LastUpgradeVersion = "1250"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Expand Up @@ -17,11 +17,7 @@ import Dcrlibwallet
@IBInspectable var accountSelectorPrompt: String?
@IBInspectable var localizeAccountSelectorPrompt: Bool = true

var selectedWallet: DcrlibwalletWallet? {
didSet {
self.walletNameLabel.text = self.selectedWallet?.name ?? LocalizedStrings.noWalletSelected
}
}
var accountFilterFn: Wallet.AccountFilter?

var selectedAccount: DcrlibwalletAccount? {
didSet {
Expand All @@ -32,11 +28,7 @@ import Dcrlibwallet
}
}

var showWatchOnlyWallet = true
var showMixedAccount = true
var showUnMixedAccount = true

var onAccountSelectionChanged: ((_ selectedWallet: DcrlibwalletWallet, _ selectedAccount: DcrlibwalletAccount) -> Void)?
var onAccountSelectionChanged: ((_ selectedAccount: DcrlibwalletAccount) -> Void)?

override init(frame: CGRect) {
super.init(frame: frame)
Expand Down Expand Up @@ -78,30 +70,43 @@ import Dcrlibwallet

AccountSelectorDialog.show(sender: topVC,
title: accountSelectorDialogTitle,
selectedWallet: self.selectedWallet,
selectedAccount: self.selectedAccount, showWatchOnlyWallet: showWatchOnlyWallet,
showUnMixedAccount: showUnMixedAccount,
showMixedAccount: showMixedAccount,
selectedAccount: self.selectedAccount,
accountFilterFn: self.accountFilterFn,
callback: self.updateSelectedAccount)
}

func updateSelectedAccount(_ selectedWalletId: Int, _ selectedAccount: DcrlibwalletAccount) {
guard let selectedWallet = WalletLoader.shared.multiWallet.wallet(withID: selectedWalletId) else { return }
func updateSelectedAccount(_ selectedAccount: DcrlibwalletAccount) {
guard let selectedWallet = WalletLoader.shared.multiWallet.wallet(withID: selectedAccount.walletID) else { return }

self.selectedWallet = selectedWallet
self.selectedAccount = selectedAccount
self.walletNameLabel.text = selectedWallet.name

self.onAccountSelectionChanged?(selectedWallet, selectedAccount)
self.onAccountSelectionChanged?(selectedAccount)
}

func selectFirstWalletAccount() {
guard let firstWallet = WalletLoader.shared.wallets.first,
let firstWalletAccount = firstWallet.accounts.filter({ $0.totalBalance > 0 || $0.name != "imported" }).first
else { return }
func selectFirstValidWalletAccount() {

if self.selectedAccount != nil &&
self.accountFilterFn != nil &&
self.accountFilterFn!(self.selectedAccount!) {
// already selected account is valid
return
}

let fullCoinWallet = WalletLoader.shared.wallets
for wallet in fullCoinWallet {
let wal = Wallet.init(wallet, accountsFilterFn: self.accountFilterFn)

// watch only wallets will have all accounts filtered out.
if wal.accounts.count > 0 {
self.selectedAccount = wal.accounts[0]
self.walletNameLabel.text = wal.name
self.onAccountSelectionChanged?(self.selectedAccount!)
return
}
}


self.selectedWallet = firstWallet
self.selectedAccount = firstWalletAccount

self.onAccountSelectionChanged?(firstWallet, firstWalletAccount)
}
}
18 changes: 9 additions & 9 deletions Decred Wallet/DcrlibwalletTypes/Wallet.swift
Expand Up @@ -18,9 +18,12 @@ class Wallet: NSObject {
private(set) var displayAccounts: Bool = false
private(set) var isAccountMixerActive: Bool = false

private var accountsFilterFn: ((DcrlibwalletAccount) -> Bool)?
typealias AccountFilter = (DcrlibwalletAccount) -> Bool
private var accountsFilterFn: AccountFilter = {_ in
return true //all accounts are shown by default
}

init(_ wallet: DcrlibwalletWallet, accountsFilterFn: ((DcrlibwalletAccount) -> Bool)? = nil) {
init(_ wallet: DcrlibwalletWallet, accountsFilterFn: AccountFilter? = nil) {
self.id = wallet.id_
self.name = wallet.name
self.balance = "\((Decimal(wallet.totalWalletBalance) as NSDecimalNumber).round(8)) DCR"
Expand All @@ -29,9 +32,9 @@ class Wallet: NSObject {
self.displayAccounts = false
self.isAccountMixerActive = wallet.isAccountMixerActive()

self.accountsFilterFn = accountsFilterFn
if accountsFilterFn != nil {
self.accounts = self.accounts.filter(accountsFilterFn!)
self.accountsFilterFn = accountsFilterFn!
self.accounts = self.accounts.filter(self.accountsFilterFn)
}
}

Expand All @@ -43,10 +46,7 @@ class Wallet: NSObject {
guard let wallet = WalletLoader.shared.multiWallet.wallet(withID: self.id) else {
return
}

self.accounts = wallet.accounts
if self.accountsFilterFn != nil {
self.accounts = self.accounts.filter(self.accountsFilterFn!)
}

self.accounts = wallet.accounts.filter(self.accountsFilterFn)
}
}
10 changes: 10 additions & 0 deletions Decred Wallet/Extensions/Dcrlibwallet.swift
Expand Up @@ -84,6 +84,16 @@ extension DcrlibwalletAccount {
return false
}

var isMixerMixedAccount: Bool {
let wallet = WalletLoader.shared.multiWallet!.wallet(withID: self.walletID)!
return wallet.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerMixedAccount, defaultValue: -1) == number
}

var isMixerUnmixedAccount: Bool {
let wallet = WalletLoader.shared.multiWallet!.wallet(withID: self.walletID)!
return wallet.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerUnmixedAccount, defaultValue: -1) == number
}

var dcrTotalBalance: Double {
return DcrlibwalletAmountCoin(self.totalBalance)
}
Expand Down
Expand Up @@ -9,7 +9,7 @@
import UIKit
import Dcrlibwallet

typealias AccountSelectorDialogCallback = (_ selectedWalletId: Int, _ selectedAccount: DcrlibwalletAccount) -> Void
typealias AccountSelectorDialogCallback = (_ selectedAccount: DcrlibwalletAccount) -> Void

class AccountSelectorDialog: UIViewController {
@IBOutlet weak var headerContainerView: UIView!
Expand All @@ -20,32 +20,23 @@ class AccountSelectorDialog: UIViewController {
private var callback: AccountSelectorDialogCallback!

var wallets = [Wallet]()
var selectedWallet: DcrlibwalletWallet?
var selectedAccount: DcrlibwalletAccount?
var showWatchOnly = true
var showUnMixedAccount = true
var showMixedAccount = true
private var accountFilterFn: Wallet.AccountFilter?

let accountCellRowHeight: CGFloat = 74
let walletHeaderSectionHeight: CGFloat = 36

static func show(sender vc: UIViewController,
title: String,
selectedWallet: DcrlibwalletWallet?,
selectedAccount: DcrlibwalletAccount?,
showWatchOnlyWallet: Bool,
showUnMixedAccount: Bool,
showMixedAccount: Bool,
accountFilterFn: Wallet.AccountFilter?,
callback: @escaping AccountSelectorDialogCallback) {

let dialog = AccountSelectorDialog.instantiate(from: .CustomDialogs)
dialog.dialogTitle = title
dialog.callback = callback
dialog.selectedWallet = selectedWallet
dialog.selectedAccount = selectedAccount
dialog.showWatchOnly = showWatchOnlyWallet
dialog.showUnMixedAccount = showUnMixedAccount
dialog.showMixedAccount = showMixedAccount
dialog.accountFilterFn = accountFilterFn
dialog.modalPresentationStyle = .pageSheet
vc.present(dialog, animated: true, completion: nil)
}
Expand All @@ -70,22 +61,19 @@ class AccountSelectorDialog: UIViewController {
- self.headerContainerView.frame.size.height
- (UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0)

var accountsFilterFn: (DcrlibwalletAccount) -> Bool = { $0.totalBalance > 0 || $0.name != "imported" }
if !showUnMixedAccount {
accountsFilterFn = { $0.totalBalance > 0 || $0.name != "imported" && $0.number != self.selectedWallet?.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerUnmixedAccount, defaultValue: -1)}
}

if !showMixedAccount {
accountsFilterFn = { $0.totalBalance > 0 || $0.name != "imported" && $0.number != self.selectedWallet?.readInt32ConfigValue(forKey: DcrlibwalletAccountMixerMixedAccount, defaultValue: -1)}
}

let fullCoinWallet = WalletLoader.shared.wallets.filter { !$0.isWatchingOnlyWallet()}
if showWatchOnly {
self.wallets = WalletLoader.shared.wallets.map({ Wallet.init($0, accountsFilterFn: accountsFilterFn) })
} else {
self.wallets = fullCoinWallet.map({ Wallet.init($0, accountsFilterFn: accountsFilterFn) })
self.setupWalletDisplay()
}

func setupWalletDisplay() {
self.wallets.removeAll()
let fullCoinWallet = WalletLoader.shared.wallets
// filter out wallets & accounts
for wallet in fullCoinWallet {
let wal = Wallet.init(wallet, accountsFilterFn: self.accountFilterFn)
if wal.accounts.count > 0 {
self.wallets.append(wal)
}
}
self.walletsTableView.reloadData()

self.walletsTableView.reloadData()
}
Expand Down Expand Up @@ -132,17 +120,16 @@ extension AccountSelectorDialog: UITableViewDataSource, UITableViewDelegate {
let wallet = self.wallets[indexPath.section]
let account = wallet.accounts[indexPath.row]
accountViewCell.account = account
accountViewCell.checkmarkImageView.isHidden = wallet.name != self.selectedWallet?.name || account.name != self.selectedAccount?.name
accountViewCell.checkmarkImageView.isHidden = account.walletID != self.selectedAccount!.walletID || account.number != self.selectedAccount!.number
return accountViewCell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedWallet = self.wallets[indexPath.section]
let selectedAccount = selectedWallet.accounts[indexPath.row]

// invoke callback asynchronously to avoid delaying modal view dismissal.
DispatchQueue.main.async {
self.callback(selectedWallet.id, selectedAccount)
self.callback(selectedAccount)
}

self.dismissView()
Expand Down
1 change: 1 addition & 0 deletions Decred Wallet/Features/Privacy/Privacy.storyboard
Expand Up @@ -1272,6 +1272,7 @@
<outlet property="unMixedAccountView" destination="piF-wJ-hQd" id="366-kG-hiI"/>
<outlet property="unMixedHeight" destination="hCh-c7-Ay2" id="9iH-qR-qhi"/>
<outlet property="unmixedAccountViewCont" destination="op5-gv-ZUw" id="p9v-zz-WOH"/>
<outlet property="walletNameLabel" destination="Wov-X4-mJT" id="aop-BB-YTt"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="WOV-Dh-Q8c" userLabel="First Responder" sceneMemberID="firstResponder"/>
Expand Down
Expand Up @@ -11,7 +11,7 @@ import Dcrlibwallet

class PrivacyManualSetupViewController: UIViewController {

var wallet: DcrlibwalletWallet!
@IBOutlet weak var walletNameLabel: UILabel!
@IBOutlet weak var mixedAccountView: WalletAccountView!
@IBOutlet weak var unMixedAccountView: WalletAccountView!
@IBOutlet weak var unmixedAccountViewCont: RoundedView!
Expand All @@ -22,6 +22,8 @@ class PrivacyManualSetupViewController: UIViewController {

@IBOutlet weak var manualSetupWaningLabel: UILabel!

var wallet: DcrlibwalletWallet!

override func viewDidLoad() {
super.viewDidLoad()
self.setupViews()
Expand Down Expand Up @@ -50,12 +52,12 @@ class PrivacyManualSetupViewController: UIViewController {
}

func setupViews() {
self.mixedAccountView.accountBalanceLabel.isHidden = true
self.unMixedAccountView.accountBalanceLabel.isHidden = true

self.mixedAccountView.showWatchOnlyWallet = false
self.unMixedAccountView.showWatchOnlyWallet = false
self.walletNameLabel.text = wallet.name

self.mixedAccountView.accountBalanceLabel.isHidden = true
self.unMixedAccountView.accountBalanceLabel.isHidden = true

self.unMixedAccountView.walletNameLabel.isHidden = true
self.mixedAccountView.walletNameLabel.isHidden = true

Expand All @@ -82,11 +84,22 @@ class PrivacyManualSetupViewController: UIViewController {
self.mixedHeight.constant = 90
self.mixedAccountView.layoutSubviews()

self.mixedAccountView.selectFirstWalletAccount()
self.unMixedAccountView.selectFirstWalletAccount()
let accountFilterFn: Wallet.AccountFilter = {account in
// remove other wallet accounts and imported account
if account.walletID != self.wallet.id_ || account.number == Int32.max {
return false
}
return true
}

self.mixedAccountView.accountFilterFn = accountFilterFn
self.unMixedAccountView.accountFilterFn = accountFilterFn

self.mixedAccountView.selectFirstValidWalletAccount()
self.unMixedAccountView.selectFirstValidWalletAccount()

self.mixedAccountView.onAccountSelectionChanged = { _, newSourceAccount in}
self.unMixedAccountView.onAccountSelectionChanged = { _, newSourceAccount in}
self.mixedAccountView.onAccountSelectionChanged = { newSourceAccount in}
self.unMixedAccountView.onAccountSelectionChanged = { newSourceAccount in}
}

func AuthMixerAccount() {
Expand Down
19 changes: 12 additions & 7 deletions Decred Wallet/Features/Receive/ReceiveViewController.swift
Expand Up @@ -36,9 +36,15 @@ class ReceiveViewController: UIViewController {
self.addressQRCodeImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.copyAddress)))
self.walletAddressLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.copyAddress)))

self.selectedAccountView.showMixedAccount = false
self.selectedAccountView.accountFilterFn = {account in
if account.number == Int32.max || account.isMixerMixedAccount {
return false
}

return true
}
self.selectedAccountView.onAccountSelectionChanged = self.updateSelectedAccount
self.selectedAccountView.selectFirstWalletAccount()
self.selectedAccountView.selectFirstValidWalletAccount()
// register for new transactions notifications
try? WalletLoader.shared.multiWallet.add(self, uniqueIdentifier: "\(self)")
}
Expand All @@ -50,18 +56,17 @@ class ReceiveViewController: UIViewController {
}
}

func updateSelectedAccount(_ selectedWallet: DcrlibwalletWallet, _ selectedAccount: DcrlibwalletAccount) {
self.selectedWallet = selectedWallet
func updateSelectedAccount(_ selectedAccount: DcrlibwalletAccount) {
self.selectedWallet = WalletLoader.shared.multiWallet.wallet(withID: selectedAccount.walletID)!
self.selectedAccount = selectedAccount

self.shareButtonContainerView.isHidden = false
self.addressQRCodeContainerView.isHidden = false
self.moreMenuButton.isEnabled = true
self.tapToCopyContainerView.isHidden = false
self.walletAddressLabel.isHidden = false
self.separatorView.isHidden = false

self.displayAddressAndQRCode(receiveAddress: selectedWallet.currentRecieveAddress(for: selectedAccount.number))
self.displayAddressAndQRCode(receiveAddress: selectedWallet!.currentRecieveAddress(for: selectedAccount.number))
}

private func displayAddressAndQRCode(receiveAddress: String) {
Expand Down Expand Up @@ -155,7 +160,7 @@ extension ReceiveViewController: DcrlibwalletTxAndBlockNotificationListenerProto

func onTransaction(_ transaction: String?) {
DispatchQueue.main.async {
self.selectedAccountView.selectFirstWalletAccount()
self.selectedAccountView.selectFirstValidWalletAccount()
}
}

Expand Down