Implemented selecting TAN method

This commit is contained in:
dankito 2020-09-28 21:13:15 +02:00
parent 1e812e4b8d
commit b3d92d4e64
13 changed files with 185 additions and 6 deletions

View File

@ -0,0 +1,27 @@
package net.dankito.banking.ui.android.adapter
import android.content.Context
import android.view.View
import androidx.annotation.StringRes
import com.mikepenz.fastadapter.items.AbstractItem
import net.dankito.banking.ui.android.R
import net.dankito.banking.ui.android.adapter.viewholder.CheckableValueViewHolder
open class CheckableValueAdapterItem(open val isChecked: Boolean, open val text: String) : AbstractItem<CheckableValueViewHolder>() {
constructor(isChecked: Boolean, context: Context, @StringRes textStringResourceId: Int) : this(isChecked, context.getString(textStringResourceId))
override val type: Int
get() = R.id.checkable_value_item_id
override val layoutRes: Int
get() = R.layout.list_item_checkable_value
override fun getViewHolder(v: View): CheckableValueViewHolder {
return CheckableValueViewHolder(v)
}
}

View File

@ -78,4 +78,9 @@ open class FastAdapterRecyclerView<Item : GenericItem>(
itemDropped?.invoke(oldPosition, itemAdapter.getAdapterItem(oldPosition), newPosition, itemAdapter.getAdapterItem(newPosition))
}
open fun setItems(items: List<Item>) {
itemAdapter.set(items)
}
}

View File

@ -0,0 +1,7 @@
package net.dankito.banking.ui.android.adapter
import net.dankito.banking.ui.model.tan.TanMethod
open class TanMethodAdapterItem(open val tanMethod: TanMethod, isSelectedTanMethod: Boolean)
: CheckableValueAdapterItem(isSelectedTanMethod, tanMethod.displayName)

View File

@ -0,0 +1,30 @@
package net.dankito.banking.ui.android.adapter.viewholder
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.mikepenz.fastadapter.FastAdapter
import net.dankito.banking.ui.android.R
import net.dankito.banking.ui.android.adapter.CheckableValueAdapterItem
open class CheckableValueViewHolder(view: View) : FastAdapter.ViewHolder<CheckableValueAdapterItem>(view) {
protected var imgCheckmark: ImageView = view.findViewById(R.id.imgCheckmark)
protected var txtValue: TextView = view.findViewById(R.id.txtValue)
override fun bindView(item: CheckableValueAdapterItem, payloads: List<Any>) {
imgCheckmark.visibility = if (item.isChecked) View.VISIBLE else View.INVISIBLE
txtValue.text = item.text
}
override fun unbindView(item: CheckableValueAdapterItem) {
imgCheckmark.setImageURI(null)
txtValue.text = null
}
}

View File

@ -11,9 +11,11 @@ import kotlinx.android.synthetic.main.dialog_bank_settings.view.toolbar
import net.dankito.banking.ui.android.R
import net.dankito.banking.ui.android.adapter.DraggableBankAccountAdapterItem
import net.dankito.banking.ui.android.adapter.FastAdapterRecyclerView
import net.dankito.banking.ui.android.adapter.TanMethodAdapterItem
import net.dankito.banking.ui.android.alerts.AskDeleteAccountAlert
import net.dankito.banking.ui.model.TypedBankAccount
import net.dankito.banking.ui.model.TypedBankData
import net.dankito.banking.ui.model.tan.TanMethod
open class BankSettingsDialog : SettingsDialogBase() {
@ -25,6 +27,8 @@ open class BankSettingsDialog : SettingsDialogBase() {
protected lateinit var bank: TypedBankData
protected var selectedTanMethod: TanMethod? = null
protected lateinit var bankAccountsAdapter: FastAdapterRecyclerView<DraggableBankAccountAdapterItem>
protected var banksChangedListener = { _: List<TypedBankData> ->
@ -35,6 +39,7 @@ open class BankSettingsDialog : SettingsDialogBase() {
fun show(bank: TypedBankData, activity: AppCompatActivity) {
this.bank = bank
this.selectedTanMethod = bank.selectedTanMethod
show(activity, DialogTag)
}
@ -60,16 +65,23 @@ open class BankSettingsDialog : SettingsDialogBase() {
edtxtUserName.text = bank.userName
edtxtPassword.text = bank.password
val items = createBankAccountsAdapterItems()
bankAccountsAdapter = FastAdapterRecyclerView(rootView.rcyBankAccounts, items, true)
bankAccountsAdapter.onClickListener = { navigationToBankAccountSettingsDialog(it.account) }
bankAccountsAdapter.itemDropped = { oldPosition, oldItem, newPosition, newItem -> reorderedBankAccounts(oldPosition, oldItem.account, newPosition, newItem.account) }
val tanMethodItems = createTanMethodItems()
val tanMethodsAdapter = FastAdapterRecyclerView(rootView.rcyTanMethods, tanMethodItems)
tanMethodsAdapter.onClickListener = {
selectedTanMethod = it.tanMethod
tanMethodsAdapter.setItems(createTanMethodItems())
}
lvlBankCode.value = bank.bankCode
lvlBic.value = bank.bic
lvlCustomerName.value = bank.customerName
lvlFinTsServerAddress.value = bank.finTsServerAddress
val items = createBankAccountsAdapterItems()
bankAccountsAdapter = FastAdapterRecyclerView(rootView.rcyBankAccounts, items, true)
bankAccountsAdapter.onClickListener = { navigationToBankAccountSettingsDialog(it.account) }
bankAccountsAdapter.itemDropped = { oldPosition, oldItem, newPosition, newItem -> reorderedBankAccounts(oldPosition, oldItem.account, newPosition, newItem.account) }
btnDeleteAccount.setOnClickListener { askUserToDeleteAccount() }
}
}
@ -82,6 +94,11 @@ open class BankSettingsDialog : SettingsDialogBase() {
}
protected open fun createTanMethodItems(): List<TanMethodAdapterItem> {
return bank.supportedTanMethods.map { TanMethodAdapterItem(it, it == selectedTanMethod) }
}
protected open fun createBankAccountsAdapterItems(): List<DraggableBankAccountAdapterItem> {
return bank.accountsSorted.map { DraggableBankAccountAdapterItem(it) }
}
@ -108,12 +125,15 @@ open class BankSettingsDialog : SettingsDialogBase() {
get() = didChange(edtxtBankName, bank.displayName)
|| didChange(edtxtUserName, bank.userName)
|| didChange(edtxtPassword, bank.password)
|| bank.selectedTanMethod != selectedTanMethod
override fun saveChanges() {
bank.userSetDisplayName = edtxtBankName.text
bank.userName = edtxtUserName.text
bank.password = edtxtPassword.text
bank.selectedTanMethod = selectedTanMethod
presenter.bankUpdated(bank)
}

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

View File

@ -93,6 +93,29 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/form_section_extra_margin_top"
>
<net.dankito.banking.ui.android.views.FormSectionTitle
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dialog_bank_settings_tan_method_section_title"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcyTanMethods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/form_section_extra_margin_top"
>
<net.dankito.banking.ui.android.views.FormSectionTitle

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/list_item_checkable_value_height"
android:padding="@dimen/list_item_checkable_value_padding"
>
<ImageView
android:id="@+id/imgCheckmark"
android:layout_width="@dimen/list_item_checkable_value_icon_size"
android:layout_height="@dimen/list_item_checkable_value_icon_size"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="@dimen/list_item_checkable_value_icon_margin_right"
android:layout_marginEnd="@dimen/list_item_checkable_value_icon_margin_right"
android:layout_alignParentBottom="true"
app:srcCompat="@drawable/ic_baseline_check_24"
android:visibility="invisible"
/>
<TextView
android:id="@+id/txtValue"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_toRightOf="@+id/imgCheckmark"
android:layout_toEndOf="@+id/imgCheckmark"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:textAlignment="gravity"
style="@style/TextAppearance.AppCompat.Medium"
android:textSize="@dimen/list_item_checkable_value_text_size"
android:textColor="@color/formLabelledValueValueTextColor"
android:singleLine="true"
android:ellipsize="end"
/>
</RelativeLayout>

View File

@ -110,6 +110,7 @@
<string name="dialog_bank_settings_bank_name">Name</string>
<string name="dialog_bank_settings_tan_method_section_title">TAN Verfahren</string>
<string name="dialog_bank_settings_bank_data_section_title">Bankdaten</string>
<string name="dialog_bank_settings_delete_account">Konto löschen</string>

View File

@ -166,6 +166,16 @@
<dimen name="list_item_draggable_bank_account_padding">2dp</dimen>
<dimen name="list_item_draggable_bank_account_account_name_text_size">16sp</dimen>
<!-- = 4 x list_item_checkable_value_height -->
<dimen name="dialog_bank_accounts_settings_list_account_features_height">120dp</dimen>
<!-- when changing list_item_checkable_value_height, also change dialog_bank_accounts_settings_list_account_features_height -->
<dimen name="list_item_checkable_value_height">30dp</dimen>
<dimen name="list_item_checkable_value_padding">2dp</dimen>
<dimen name="list_item_checkable_value_icon_size">24dp</dimen>
<dimen name="list_item_checkable_value_icon_margin_right">8dp</dimen>
<dimen name="list_item_checkable_value_text_size">16sp</dimen>
<dimen name="dialog_send_message_log_padding">4dp</dimen>
<dimen name="dialog_send_message_log_message_log_label_bottom_margin">8dp</dimen>
<dimen name="dialog_send_message_log_buttons_width">120dp</dimen>

View File

@ -8,4 +8,6 @@
<item name="draggable_bank_account_item_id" type="id" />
<item name="checkable_value_item_id" type="id" />
</resources>

View File

@ -84,7 +84,7 @@
<string name="view_flicker_code_frequency">Frequency:</string>
<string name="dialog_enter_tan_select_tan_method">TAN procedure</string>
<string name="dialog_enter_tan_select_tan_method">TAN method</string>
<string name="dialog_enter_tan_select_tan_medium">TAN medium</string>
<string name="dialog_enter_tan_tan_description_label">Hint from your bank:</string>
<string name="dialog_enter_tan_enter_tan">Enter TAN:</string>
@ -110,6 +110,7 @@
<string name="dialog_bank_settings_bank_name">Name</string>
<string name="dialog_bank_settings_tan_method_section_title">TAN method</string>
<string name="dialog_bank_settings_bank_data_section_title">Bank data</string>
<string name="dialog_bank_settings_delete_account">Delete account</string>

View File

@ -185,7 +185,7 @@ Unfortunately, Bankmeister cannot know whether a bank charges for real-time tran
"Supports" = "Supports";
"Supports Retrieving Balance" = "Retrieve balance";
"Supports Retrieving Account Transactions" = "Retrieve transactions";
"Supports Transferring Money" = "Transfer money";
"Supports Transferring Money" = "Money transfer";
"Supports Real-time transfer" = "Real-time transfer";