Skip to content

Commit

Permalink
Merge branch 'PP-403-skonto-screen' into PP-480-skonto-backend-implem…
Browse files Browse the repository at this point in the history
…entation

# Conflicts:
#	bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/Configuration.kt
#	bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragment.kt
  • Loading branch information
ndubkov-distcotech committed Jul 17, 2024
2 parents 011fa90 + 90cf6ab commit fea1e3c
Show file tree
Hide file tree
Showing 12 changed files with 539 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ class ConfigurationActivity : AppCompatActivity() {
binding.switchReviewScreenCustomBottomNavbar.isChecked =
configuration.isReviewScreenCustomBottomNavBarEnabled

binding.switchSkontoCustomBottomNavbar.isChecked =
configuration.isSkontoCustomNavBarEnabled

// 12 enable image picker screens custom bottom navigation bar -> was implemented on iOS, not needed for Android

// 13 enable onboarding screens at first launch
Expand Down Expand Up @@ -369,6 +372,14 @@ class ConfigurationActivity : AppCompatActivity() {
)
}

binding.switchSkontoCustomBottomNavbar.setOnCheckedChangeListener { _, isChecked ->
configurationViewModel.setConfiguration(
configurationViewModel.configurationFlow.value.copy(
isSkontoCustomNavBarEnabled = isChecked
)
)
}

// 12 enable image picker screens custom bottom navigation bar -> was implemented on iOS, not needed for Android

// 13 enable onboarding screens at first launch
Expand Down Expand Up @@ -421,6 +432,7 @@ class ConfigurationActivity : AppCompatActivity() {
)
)
}

// 19 enable multi page in custom onboarding pages
binding.switchCustomOnboardingMultiPage.setOnCheckedChangeListener { _, isChecked ->
configurationViewModel.setConfiguration(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import net.gini.android.bank.sdk.exampleapp.ui.adapters.CustomOnButtonLoadingInd
import net.gini.android.bank.sdk.exampleapp.ui.adapters.CustomOnboardingIllustrationAdapter
import net.gini.android.bank.sdk.exampleapp.ui.adapters.CustomOnboardingNavigationBarBottomAdapter
import net.gini.android.bank.sdk.exampleapp.ui.adapters.CustomReviewNavigationBarBottomAdapter
import net.gini.android.bank.sdk.exampleapp.ui.adapters.CustomSkontoNavigationBarBottomAdapter
import net.gini.android.bank.sdk.exampleapp.ui.data.Configuration
import net.gini.android.capture.GiniCaptureDebug
import net.gini.android.capture.help.HelpItem
Expand Down Expand Up @@ -275,6 +276,12 @@ class ConfigurationViewModel @Inject constructor(
CustomDigitalInvoiceHelpNavigationBarBottomAdapter()
}

if (configuration.isSkontoCustomNavBarEnabled) {
GiniBank.skontoNavigationBarBottomAdapter = CustomSkontoNavigationBarBottomAdapter()
} else {
GiniBank.skontoNavigationBarBottomAdapter = null
}

// 35 Digital invoice onboarding bottom navigation bar
if (configuration.isDigitalInvoiceOnboardingBottomNavigationBarEnabled) {
GiniBank.digitalInvoiceOnboardingNavigationBarBottomAdapter =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package net.gini.android.bank.sdk.exampleapp.ui.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import net.gini.android.bank.sdk.capture.skonto.SkontoNavigationBarBottomAdapter
import net.gini.android.bank.sdk.exampleapp.databinding.CustomSkontoNavigationBarBinding

class CustomSkontoNavigationBarBottomAdapter : SkontoNavigationBarBottomAdapter {

private var binding: CustomSkontoNavigationBarBinding? = null

override fun setOnHelpClickListener(onClick: () -> Unit) {
binding?.gbsHelpBtn?.setOnClickListener { onClick() }
}

override fun setOnBackClickListener(onClick: () -> Unit) {
binding?.gbsBackBtn?.setOnClickListener { onClick() }
}

override fun setOnProceedClickListener(onClick: () -> Unit) {
binding?.gbsPay?.setOnClickListener { onClick() }
}

override fun setProceedButtonEnabled(enabled: Boolean) {
binding?.gbsPay?.isEnabled = enabled
}

override fun setTotalPriceText(text: String) {
binding?.priceTotal?.text = text
}

override fun setDiscountLabelText(text: String) {
binding?.discountInfo?.text = text
}

override fun onCreateView(container: ViewGroup): View {
binding = CustomSkontoNavigationBarBinding.inflate(
LayoutInflater.from(container.context),
container,
false
)
return binding!!.root
}

override fun setDiscountLabelVisible(visible: Boolean) {
binding?.discountInfo?.isVisible = visible
}

override fun onDestroy() {
binding = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,12 @@ data class Configuration(
// 37 Debug mode
val isDebugModeEnabled: Boolean = true,

// 38 Is Allow Screenshots
val isAllowScreenshotsEnabled: Boolean = true,

// 39 Skonto Custom bottom navigation
val isSkontoCustomNavBarEnabled: Boolean = false,

) : Parcelable {

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,13 +208,27 @@
android:text="@string/review_screen_custom_bottom_navbar_switch_label" />

<TextView
android:id="@+id/tv_reviewScreenCustomBottomNavbarDescription"
style="@style/TextAppearance.MaterialComponents.Caption"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/custom_bottom_navbar_switch_description" />


<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_skontoCustomBottomNavbar"
style="@style/SwitchConfigurationStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/gc_medium_12"
android:text="@string/skonto_screen_custom_bottom_navbar_switch_label" />

<TextView
android:id="@+id/tv_reviewScreenCustomBottomNavbarDescription"
style="@style/TextAppearance.MaterialComponents.Caption"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/custom_bottom_navbar_switch_description" />


<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_onboardingScreensAtFirstRun"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/gbs_bottom_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorError"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">

<TextView
android:id="@+id/total_label"
style="@style/GiniCaptureTheme.Typography.Body1"
android:layout_width="wrap_content"
android:layout_marginTop="@dimen/gc_medium"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/gc_large_24"
android:text="@string/gbs_skonto_section_footer_title"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/price_total"
style="@style/GiniCaptureTheme.Typography.Headline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/gc_large_24"
android:layout_marginTop="@dimen/gc_small"
app:layout_constraintStart_toStartOf="@id/total_label"
app:layout_constraintTop_toBottomOf="@id/total_label"
tools:text="€242.99" />

<TextView
android:id="@+id/discount_info"
style="@style/GiniCaptureTheme.Typography.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/gc_medium"
android:layout_marginTop="@dimen/gc_small"
app:layout_constraintBottom_toBottomOf="@+id/price_total"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/price_total"
app:layout_constraintTop_toBottomOf="@id/total_label"
tools:text="3% discount" />

<com.google.android.material.button.MaterialButton
android:id="@+id/gbs_pay"
style="@style/GiniCaptureTheme.Widget.Button.UnelevatedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/gc_large_24"
android:layout_marginEnd="@dimen/gc_large"
android:layout_marginStart="@dimen/gc_large"
android:layout_marginBottom="@dimen/gc_large_24"
android:text="@string/gbs_skonto_section_footer_continue_button_text"
app:cornerRadius="@dimen/gc_small"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/gbs_help_btn"
app:layout_constraintStart_toEndOf="@+id/gbs_placeholder"
app:layout_constraintTop_toBottomOf="@+id/price_total" />

<ImageButton
android:id="@+id/gbs_help_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/gc_medium"
android:padding="@dimen/gc_medium"
app:tint="?attr/colorOnBackground"
android:contentDescription="@string/gbs_digital_invoice_help_info"
android:background="@android:color/transparent"
app:layout_constraintBottom_toBottomOf="@+id/gbs_pay"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/gbs_pay"
app:srcCompat="@drawable/gbs_menu_question_circle_info" />

<ImageButton
android:id="@+id/gbs_back_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:contentDescription="@string/gbs_digital_invoice_help_info"
android:padding="@dimen/gc_medium"
app:layout_constraintBottom_toBottomOf="@+id/gbs_pay"
app:layout_constraintEnd_toStartOf="@+id/gbs_pay"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/gbs_pay"
app:srcCompat="@drawable/gc_action_bar_back"
app:tint="?attr/colorOnBackground" />

<Space
android:id="@+id/gbs_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/gc_large_48"
app:layout_constraintBottom_toBottomOf="@+id/gbs_pay"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/gbs_pay" />

</androidx.constraintlayout.widget.ConstraintLayout>
1 change: 1 addition & 0 deletions bank-sdk/example-app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
<string name="custom_bottom_navbar_switch_description">The custom bottom navigation bar is shown if \'Bottom navigation bar\' is also enabled.</string>
<string name="camera_screen_custom_bottom_navbar_switch_label">Camera screen custom bottom navigation bar</string>
<string name="review_screen_custom_bottom_navbar_switch_label">Review screen custom bottom navigation bar</string>
<string name="skonto_screen_custom_bottom_navbar_switch_label">Skonto screen custom bottom navigation bar</string>
<string name="onboarding_screens_at_every_launch_switch_label">Onboarding screens at every launch</string>
<string name="onboarding_screens_at_first_launch_switch_label">Onboarding screens at first launch</string>
<string name="onboarding_screens_at_every_launch_switch_description">Overwrites \'Onboarding screens at first launch\'.</string>
Expand Down
52 changes: 37 additions & 15 deletions bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/GiniBank.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import net.gini.android.bank.sdk.capture.digitalinvoice.view.DefaultDigitalInvoi
import net.gini.android.bank.sdk.capture.digitalinvoice.view.DefaultDigitalInvoiceOnboardingNavigationBarBottomAdapter
import net.gini.android.bank.sdk.capture.digitalinvoice.view.DigitalInvoiceNavigationBarBottomAdapter
import net.gini.android.bank.sdk.capture.digitalinvoice.view.DigitalInvoiceOnboardingNavigationBarBottomAdapter
import net.gini.android.bank.sdk.capture.skonto.SkontoNavigationBarBottomAdapter
import net.gini.android.bank.sdk.error.AmountParsingException
import net.gini.android.bank.sdk.pay.getBusinessIntent
import net.gini.android.bank.sdk.pay.getRequestId
Expand Down Expand Up @@ -101,6 +102,18 @@ object GiniBank {
}
get() = digitalInvoiceNavigationBarBottomAdapterInstance.viewAdapter


internal var skontoNavigationBarBottomAdapterInstance: InjectedViewAdapterInstance<SkontoNavigationBarBottomAdapter>? =
null

var skontoNavigationBarBottomAdapter: SkontoNavigationBarBottomAdapter?
set(value) {
skontoNavigationBarBottomAdapterInstance =
value?.let { InjectedViewAdapterInstance(it) }
}
get() = skontoNavigationBarBottomAdapterInstance?.viewAdapter


internal fun getCaptureConfiguration() = captureConfiguration

/**
Expand Down Expand Up @@ -316,18 +329,26 @@ object GiniBank {
): CancellationToken {
giniCapture.let { capture ->
check(capture != null) { "Capture feature is not configured. Call setCaptureConfiguration before starting the flow." }
return capture.createDocumentForImportedFiles(intent, context, object : AsyncCallback<Document, ImportedFileValidationException> {
override fun onSuccess(result: Document) {
resultLauncher.launch(CaptureImportInput.Forward(result))
}

override fun onError(exception: ImportedFileValidationException?) {
resultLauncher.launch(CaptureImportInput.Error(exception?.validationError, exception?.message))
}
return capture.createDocumentForImportedFiles(
intent,
context,
object : AsyncCallback<Document, ImportedFileValidationException> {
override fun onSuccess(result: Document) {
resultLauncher.launch(CaptureImportInput.Forward(result))
}

override fun onError(exception: ImportedFileValidationException?) {
resultLauncher.launch(
CaptureImportInput.Error(
exception?.validationError,
exception?.message
)
)
}

override fun onCancelled() {
}
})
override fun onCancelled() {
}
})
}
}

Expand Down Expand Up @@ -413,17 +434,18 @@ object GiniBank {
/**
* The document was processed successfully.
*/
data class Success(val document: Document?): CreateDocumentFromImportedFileResult()
data class Success(val document: Document?) : CreateDocumentFromImportedFileResult()

/**
* Document processing returned an error.
*/
data class Error(val error: ImportedFileValidationException?): CreateDocumentFromImportedFileResult()
data class Error(val error: ImportedFileValidationException?) :
CreateDocumentFromImportedFileResult()

/**
* Document processing was cancelled.
*/
object Cancelled: CreateDocumentFromImportedFileResult()
object Cancelled : CreateDocumentFromImportedFileResult()
}

/**
Expand All @@ -442,7 +464,7 @@ object GiniBank {
return giniCapture?.createDocumentForImportedFiles(
intent,
context,
object: AsyncCallback<Document, ImportedFileValidationException> {
object : AsyncCallback<Document, ImportedFileValidationException> {
override fun onSuccess(result: Document?) {
callback(CreateDocumentFromImportedFileResult.Success(result))
}
Expand Down
Loading

0 comments on commit fea1e3c

Please sign in to comment.