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..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 @@ -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,30 +9,40 @@ 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 import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.IAPProducts import net.pokeranalytics.android.util.billing.PurchaseDelegate import java.time.Period - -class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListener, PurchaseDelegate { +class SubscriptionFragment : PokerAnalyticsFragment(), SkuDetailsResponseListener, PurchaseDelegate, ViewPager.OnPageChangeListener { private var selectedProduct: SkuDetails? = null 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 +82,13 @@ 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.pager.addOnPageChangeListener(this) + this.purchase.isEnabled = false this.purchase.setOnClickListener { @@ -80,12 +98,48 @@ 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) + + } + + /** + * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in + * sequence. + */ + 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), + 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() } @@ -106,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 } @@ -124,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/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/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index d6f9085a..fc1735fe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -97,7 +97,11 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } } 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 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..d0aec965 --- /dev/null +++ b/app/src/main/res/layout/fragment_screen_slide_page.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_subscription.xml b/app/src/main/res/layout/fragment_subscription.xml index 956297be..3603c7b5 100644 --- a/app/src/main/res/layout/fragment_subscription.xml +++ b/app/src/main/res/layout/fragment_subscription.xml @@ -1,64 +1,86 @@ - + app:autoSizeTextType="uniform" /> - + android:layout_height="match_parent"> - + - + - + + + + + + + - \ No newline at end of file + \ 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 a2c7222b..566249eb 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 + + + + + + - -