From d37fa1737b21cd5fed4f35e0efcbc9fa2e799d0d Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 9 May 2019 14:54:43 +0200 Subject: [PATCH 1/4] Subscription window update --- .../android/PokerAnalyticsApplication.kt | 3 +- .../ui/fragment/SubscriptionFragment.kt | 36 ++++++ .../components/ScreenSlidePageFragment.kt | 28 +++++ .../ic_baseline_all_inclusive_24px.xml | 9 ++ .../res/drawable/ic_baseline_email_24px.xml | 9 ++ .../res/drawable/ic_baseline_vpn_key_24px.xml | 9 ++ .../drawable/ic_baseline_wifi_off_24px.xml | 9 ++ .../res/layout/fragment_screen_slide_page.xml | 49 ++++++++ .../main/res/layout/fragment_subscription.xml | 108 +++++++++++------- app/src/main/res/values/strings.xml | 9 ++ app/src/main/res/values/styles.xml | 21 +++- 11 files changed, 243 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ScreenSlidePageFragment.kt create mode 100644 app/src/main/res/drawable/ic_baseline_all_inclusive_24px.xml create mode 100644 app/src/main/res/drawable/ic_baseline_email_24px.xml create mode 100644 app/src/main/res/drawable/ic_baseline_vpn_key_24px.xml create mode 100644 app/src/main/res/drawable/ic_baseline_wifi_off_24px.xml create mode 100644 app/src/main/res/layout/fragment_screen_slide_page.xml diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 77b51db0..d9c7f7fa 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -48,7 +48,6 @@ class PokerAnalyticsApplication : Application() { // Initialize Fabric with the debug-disabled crashlytics. Fabric.with(this, crashlyticsKit) - if (BuildConfig.DEBUG) { // Logs Timber.plant(PokerAnalyticsLogs()) @@ -56,7 +55,7 @@ class PokerAnalyticsApplication : Application() { if (BuildConfig.DEBUG) { Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") -// this.createFakeSessions() + this.createFakeSessions() } Patcher.patchBreaks() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt index 2aa6d4c2..23a3b183 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt @@ -10,6 +10,9 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.content.res.ResourcesCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter import com.android.billingclient.api.BillingClient import com.android.billingclient.api.Purchase import com.android.billingclient.api.SkuDetails @@ -17,6 +20,7 @@ import com.android.billingclient.api.SkuDetailsResponseListener import kotlinx.android.synthetic.main.fragment_subscription.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.fragment.components.ScreenSlidePageFragment import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.IAPProducts @@ -24,6 +28,8 @@ import net.pokeranalytics.android.util.billing.PurchaseDelegate import java.time.Period +data class FeatureDescriptor(var iconResId: Int, var titleResId: Int, var descResId: Int) + class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListener, PurchaseDelegate { private var selectedProduct: SkuDetails? = null @@ -31,7 +37,9 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + this.showLoader(R.string.loading_please_wait) if (!AppGuard.requestProducts(this)) { + this.hideLoader() Toast.makeText(requireContext(), R.string.billingclient_unavailable, Toast.LENGTH_LONG).show() } } @@ -71,6 +79,12 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene this.title.text = upgradeString } + // Pager + + // The pager adapter, which provides the pages to the view pager widget. + val pagerAdapter = ScreenSlidePagerAdapter(requireFragmentManager()) + this.pager.adapter = pagerAdapter + this.purchase.isEnabled = false this.purchase.setOnClickListener { @@ -82,10 +96,32 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene } } + /** + * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in + * sequence. + */ + private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { + + private val dataSource: List = listOf( + FeatureDescriptor(R.drawable.ic_baseline_all_inclusive_24px, R.string.f_unlimited, R.string.f_unlimited_desc), + FeatureDescriptor(R.drawable.ic_baseline_wifi_off_24px, R.string.f_offline, R.string.f_offline_desc), + FeatureDescriptor(R.drawable.ic_baseline_vpn_key_24px, R.string.f_privacy, R.string.f_privacy_desc), + FeatureDescriptor(R.drawable.ic_baseline_email_24px, R.string.f_support, R.string.f_support_desc) + ) + + override fun getCount(): Int = this.dataSource.size + override fun getItem(position: Int): Fragment { + val d = this.dataSource[position] + return ScreenSlidePageFragment(d.iconResId, d.titleResId, d.descResId) + } + + } + // SkuDetailsResponseListener override fun onSkuDetailsResponse(responseCode: Int, skuDetailsList: MutableList?) { if (responseCode == BillingClient.BillingResponse.OK && skuDetailsList != null) { + this.hideLoader() selectedProduct = skuDetailsList.first { it.sku == IAPProducts.PRO.identifier } updateUI() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ScreenSlidePageFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ScreenSlidePageFragment.kt new file mode 100644 index 00000000..326c6a05 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ScreenSlidePageFragment.kt @@ -0,0 +1,28 @@ +package net.pokeranalytics.android.ui.fragment.components + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kotlinx.android.synthetic.main.fragment_screen_slide_page.* +import net.pokeranalytics.android.R + + +class ScreenSlidePageFragment(var iconResId: Int, var titleResId: Int, var descriptionResId: Int) : PokerAnalyticsFragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = inflater.inflate(R.layout.fragment_screen_slide_page, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + this.icon.setImageResource(this.iconResId) + this.title.text = requireContext().getString(this.titleResId) + this.description.text = requireContext().getString(this.descriptionResId) + + } + +} diff --git a/app/src/main/res/drawable/ic_baseline_all_inclusive_24px.xml b/app/src/main/res/drawable/ic_baseline_all_inclusive_24px.xml new file mode 100644 index 00000000..c857b95d --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_all_inclusive_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_email_24px.xml b/app/src/main/res/drawable/ic_baseline_email_24px.xml new file mode 100644 index 00000000..789a0188 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_email_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_vpn_key_24px.xml b/app/src/main/res/drawable/ic_baseline_vpn_key_24px.xml new file mode 100644 index 00000000..39adc2cf --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_vpn_key_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_wifi_off_24px.xml b/app/src/main/res/drawable/ic_baseline_wifi_off_24px.xml new file mode 100644 index 00000000..e857159f --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_wifi_off_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_screen_slide_page.xml b/app/src/main/res/layout/fragment_screen_slide_page.xml new file mode 100644 index 00000000..a7ca0f59 --- /dev/null +++ b/app/src/main/res/layout/fragment_screen_slide_page.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_subscription.xml b/app/src/main/res/layout/fragment_subscription.xml index 956297be..f51e6e9f 100644 --- a/app/src/main/res/layout/fragment_subscription.xml +++ b/app/src/main/res/layout/fragment_subscription.xml @@ -1,64 +1,88 @@ - - + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/title"> - + - + - + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d94aecac..82d05629 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,15 @@ Upgrade to Pro Go Pro free trial + Unlimited + Track all your poker life by adding as many data as you want + Offline first + Poker Analytics is available at all times. You’re currently in charge of backups, but that will change soon! + Private + We do not own servers. We do not know anything about your wins and losses. + Support + We try to answer as quickly as we can, in english or french ! + Loading, please wait… Address Naming suggestions diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c20890d5..99b100ee 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -318,9 +318,26 @@ 1 end @font/roboto_light - 18sp + 16sp + + + + + + - - From 6dfc7709a33e600661003d4493537531cc4afdf0 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 9 May 2019 14:54:59 +0200 Subject: [PATCH 2/4] Fixes BR initial value format --- .../android/ui/fragment/BankrollEditDataFragment.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt index 67947540..1cb9bdf9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt @@ -103,7 +103,11 @@ class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableD } } BankrollRow.INITIAL_VALUE -> { - this.bankroll.initialValue.toCurrency() + var c: Currency? = null + this.bankroll.currency?.code?.let { + c = Currency.getInstance(it) + } + this.bankroll.initialValue.toCurrency(c) } BankrollRow.RATE -> { val rate = this.bankroll.currency?.rate ?: 1.0 From bc88fee2b4567c6b9e4181977a3d4a2f70e2a451 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 9 May 2019 16:13:48 +0200 Subject: [PATCH 3/4] Add page indicator to the features pager --- .../ui/fragment/SubscriptionFragment.kt | 49 +++++++++++++++++-- .../res/layout/fragment_screen_slide_page.xml | 5 +- .../main/res/layout/fragment_subscription.xml | 36 +++++++------- 3 files changed, 65 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt index 23a3b183..18c5b471 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.ui.fragment +import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.Bundle import android.text.SpannableStringBuilder @@ -8,17 +9,22 @@ import android.text.style.TypefaceSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.Toast import androidx.core.content.res.ResourcesCompat +import androidx.core.view.children +import androidx.core.view.setMargins import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter +import androidx.viewpager.widget.ViewPager import com.android.billingclient.api.BillingClient import com.android.billingclient.api.Purchase import com.android.billingclient.api.SkuDetails import com.android.billingclient.api.SkuDetailsResponseListener import kotlinx.android.synthetic.main.fragment_subscription.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.ScreenSlidePageFragment import net.pokeranalytics.android.util.Preferences @@ -27,10 +33,7 @@ import net.pokeranalytics.android.util.billing.IAPProducts import net.pokeranalytics.android.util.billing.PurchaseDelegate import java.time.Period - -data class FeatureDescriptor(var iconResId: Int, var titleResId: Int, var descResId: Int) - -class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListener, PurchaseDelegate { +class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListener, PurchaseDelegate, ViewPager.OnPageChangeListener { private var selectedProduct: SkuDetails? = null @@ -84,6 +87,7 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene // The pager adapter, which provides the pages to the view pager widget. val pagerAdapter = ScreenSlidePagerAdapter(requireFragmentManager()) this.pager.adapter = pagerAdapter + this.pager.addOnPageChangeListener(this) this.purchase.isEnabled = false this.purchase.setOnClickListener { @@ -94,6 +98,18 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene throw IllegalStateException("Attempt to initiate purchase while no product has been chosen") } } + + val count = this.pager.adapter?.count ?: 0 + for (i in 1..count) { + val view = View(requireContext()) + view.background = requireContext().getDrawable(R.drawable.circle_green) + val layoutParam = LinearLayout.LayoutParams(20.px, 20.px) + layoutParam.setMargins(8.px) + this.pageIndicator.addView(view, layoutParam) + } + + this.changeColorOfIndicator(0) + } /** @@ -102,6 +118,8 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene */ private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { + private inner class FeatureDescriptor(var iconResId: Int, var titleResId: Int, var descResId: Int) + private val dataSource: List = listOf( FeatureDescriptor(R.drawable.ic_baseline_all_inclusive_24px, R.string.f_unlimited, R.string.f_unlimited_desc), FeatureDescriptor(R.drawable.ic_baseline_wifi_off_24px, R.string.f_offline, R.string.f_offline_desc), @@ -160,4 +178,27 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene this.activity?.finish() } + // OnPageChangeListener + + override fun onPageScrollStateChanged(state: Int) {} + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + override fun onPageSelected(position: Int) { + this.changeColorOfIndicator(position) + } + + private fun changeColorOfIndicator(position: Int) { + this.pageIndicator.children.forEachIndexed { index, view -> + val drawable = view.background + when (drawable) { + is GradientDrawable -> { + val color = if (position == index) R.color.white else R.color.quantum_grey + drawable.setColor(requireContext().getColor(color)) + } else -> {} + } + + } + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_screen_slide_page.xml b/app/src/main/res/layout/fragment_screen_slide_page.xml index a7ca0f59..d0aec965 100644 --- a/app/src/main/res/layout/fragment_screen_slide_page.xml +++ b/app/src/main/res/layout/fragment_screen_slide_page.xml @@ -27,11 +27,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:src="@drawable/ic_baseline_all_inclusive_24px" - android:layout_marginTop="8dp" android:layout_width="48dp" android:layout_height="48dp" /> diff --git a/app/src/main/res/layout/fragment_subscription.xml b/app/src/main/res/layout/fragment_subscription.xml index f51e6e9f..3603c7b5 100644 --- a/app/src/main/res/layout/fragment_subscription.xml +++ b/app/src/main/res/layout/fragment_subscription.xml @@ -1,5 +1,5 @@ - + app:autoSizeTextType="uniform" /> + android:layout_height="match_parent"> + + - - - - - + app:layout_constraintEnd_toEndOf="parent"/> - \ No newline at end of file + \ No newline at end of file From 779504a11fddf24687b4cb49e2446d99ecc745b6 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 9 May 2019 16:33:33 +0200 Subject: [PATCH 4/4] Removes warning --- .../pokeranalytics/android/ui/fragment/SubscriptionFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt index 18c5b471..ec2d6cce 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt @@ -160,7 +160,7 @@ class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListene freeTrialDays = p.days } val formattedFreeTrial = - "${freeTrialDays} " + requireContext().getString(R.string.days) + " " + requireContext().getString(R.string.free_trial) + "$freeTrialDays " + requireContext().getString(R.string.days) + " " + requireContext().getString(R.string.free_trial) this.freetrial.text = formattedFreeTrial }