Skip to content

Commit d524d3a

Browse files
authored
Merge pull request #17031 from wordpress-mobile/feature/animation-for-stats-jetpack-banner
Add scroll animation to Jetpack banner on stats
2 parents 7b37737 + 2ac9517 commit d524d3a

File tree

5 files changed

+46
-37
lines changed

5 files changed

+46
-37
lines changed

WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsActivity.kt

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@ import android.content.Intent
55
import android.os.Bundle
66
import android.view.MenuItem
77
import androidx.activity.viewModels
8-
import androidx.core.view.isVisible
98
import dagger.hilt.android.AndroidEntryPoint
109
import org.wordpress.android.WordPress
1110
import org.wordpress.android.databinding.StatsListActivityBinding
1211
import org.wordpress.android.fluxc.model.SiteModel
1312
import org.wordpress.android.push.NotificationType
1413
import org.wordpress.android.push.NotificationsProcessingService.ARG_NOTIFICATION_TYPE
1514
import org.wordpress.android.ui.LocaleAwareActivity
16-
import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment
1715
import org.wordpress.android.ui.stats.StatsTimeframe
1816
import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
1917
import org.wordpress.android.util.JetpackBrandingUtils
20-
import org.wordpress.android.util.JetpackBrandingUtils.Screen.STATS
2118
import javax.inject.Inject
2219

2320
@AndroidEntryPoint
@@ -29,22 +26,7 @@ class StatsActivity : LocaleAwareActivity() {
2926
override fun onCreate(savedInstanceState: Bundle?) {
3027
super.onCreate(savedInstanceState)
3128

32-
with(StatsListActivityBinding.inflate(layoutInflater)) {
33-
setContentView(root)
34-
if (jetpackBrandingUtils.shouldShowJetpackBranding()) {
35-
jetpackBanner.root.isVisible = true
36-
jetpackBrandingUtils.setNavigationBarColorForBanner(window)
37-
38-
if (jetpackBrandingUtils.shouldShowJetpackPoweredBottomSheet()) {
39-
jetpackBanner.root.setOnClickListener {
40-
jetpackBrandingUtils.trackBannerTapped(STATS)
41-
JetpackPoweredBottomSheetFragment
42-
.newInstance()
43-
.show(supportFragmentManager, JetpackPoweredBottomSheetFragment.TAG)
44-
}
45-
}
46-
}
47-
}
29+
setContentView(StatsListActivityBinding.inflate(layoutInflater).root)
4830
}
4931

5032
override fun onOptionsItemSelected(item: MenuItem): Boolean {

WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity
88
import androidx.fragment.app.Fragment
99
import androidx.fragment.app.FragmentActivity
1010
import androidx.fragment.app.activityViewModels
11+
import androidx.recyclerview.widget.RecyclerView
1112
import androidx.viewpager2.adapter.FragmentStateAdapter
1213
import androidx.viewpager2.widget.MarginPageTransformer
1314
import com.google.android.material.snackbar.Snackbar
@@ -40,6 +41,8 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.UpdateAler
4041
import org.wordpress.android.ui.stats.refresh.lists.sections.insights.UpdateAlertDialogFragment.Companion.UPDATE_ALERT_DIALOG_TAG
4142
import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider.SiteUpdateResult
4243
import org.wordpress.android.ui.utils.UiHelpers
44+
import org.wordpress.android.util.JetpackBrandingUtils
45+
import org.wordpress.android.util.JetpackBrandingUtils.Screen.STATS
4346
import org.wordpress.android.util.WPSwipeToRefreshHelper
4447
import org.wordpress.android.util.helpers.SwipeToRefreshHelper
4548
import org.wordpress.android.viewmodel.observeEvent
@@ -51,12 +54,15 @@ private val statsSections = listOf(INSIGHTS, DAYS, WEEKS, MONTHS, YEARS)
5154
@AndroidEntryPoint
5255
class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializedListener {
5356
@Inject lateinit var uiHelpers: UiHelpers
57+
@Inject lateinit var jetpackBrandingUtils: JetpackBrandingUtils
5458
private val viewModel: StatsViewModel by activityViewModels()
5559
private lateinit var swipeToRefreshHelper: SwipeToRefreshHelper
5660
private lateinit var selectedTabListener: SelectedTabListener
5761

5862
private var restorePreviousSearch = false
5963

64+
private var binding: StatsFragmentBinding? = null
65+
6066
override fun onCreate(savedInstanceState: Bundle?) {
6167
super.onCreate(savedInstanceState)
6268
setHasOptionsMenu(true)
@@ -67,6 +73,7 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
6773

6874
val nonNullActivity = requireActivity()
6975
with(StatsFragmentBinding.bind(view)) {
76+
binding = this
7077
with(nonNullActivity as AppCompatActivity) {
7178
setSupportActionBar(toolbar)
7279
supportActionBar?.let {
@@ -75,7 +82,7 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
7582
}
7683
}
7784
initializeViewModels(nonNullActivity, savedInstanceState == null, savedInstanceState)
78-
initializeViews(nonNullActivity)
85+
initializeViews()
7986
}
8087
}
8188

@@ -85,8 +92,8 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
8592
super.onSaveInstanceState(outState)
8693
}
8794

88-
private fun StatsFragmentBinding.initializeViews(activity: FragmentActivity) {
89-
val adapter = StatsPagerAdapter(activity)
95+
private fun StatsFragmentBinding.initializeViews() {
96+
val adapter = StatsPagerAdapter(this@StatsFragment)
9097
statsPager.adapter = adapter
9198
statsPager.setPageTransformer(
9299
MarginPageTransformer(resources.getDimensionPixelSize(R.dimen.margin_extra_large))
@@ -253,18 +260,42 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
253260

254261
override fun onScrollableViewInitialized(containerId: Int) {
255262
StatsFragmentBinding.bind(requireView()).appBarLayout.liftOnScrollTargetViewId = containerId
263+
initJetpackBanner(containerId)
264+
}
265+
266+
private fun initJetpackBanner(scrollableContainerId: Int) {
267+
if (jetpackBrandingUtils.shouldShowJetpackBranding()) {
268+
binding?.root?.post {
269+
val jetpackBannerView = binding?.jetpackBanner?.root ?: return@post
270+
val scrollableView = binding?.root?.findViewById<View>(scrollableContainerId) as? RecyclerView
271+
?: return@post
272+
273+
jetpackBrandingUtils.showJetpackBannerIfScrolledToTop(jetpackBannerView, scrollableView)
274+
activity?.window?.let { jetpackBrandingUtils.setNavigationBarColorForBanner(it) }
275+
jetpackBrandingUtils.initJetpackBannerAnimation(jetpackBannerView, scrollableView)
276+
277+
if (jetpackBrandingUtils.shouldShowJetpackPoweredBottomSheet()) {
278+
binding?.jetpackBanner?.root?.setOnClickListener {
279+
jetpackBrandingUtils.trackBannerTapped(STATS)
280+
JetpackPoweredBottomSheetFragment
281+
.newInstance()
282+
.show(childFragmentManager, JetpackPoweredBottomSheetFragment.TAG)
283+
}
284+
}
285+
}
286+
}
256287
}
257288
}
258289

259-
class StatsPagerAdapter(val activity: FragmentActivity) : FragmentStateAdapter(activity) {
290+
class StatsPagerAdapter(private val parent: Fragment) : FragmentStateAdapter(parent) {
260291
override fun getItemCount(): Int = statsSections.size
261292

262293
override fun createFragment(position: Int): Fragment {
263294
return StatsListFragment.newInstance(statsSections[position])
264295
}
265296

266297
fun getTabTitle(position: Int): CharSequence {
267-
return activity.getString(statsSections[position].titleRes)
298+
return parent.context?.getString(statsSections[position].titleRes).orEmpty()
268299
}
269300
}
270301

WordPress/src/main/java/org/wordpress/android/util/JetpackBrandingUtils.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.view.View
55
import android.view.View.OnScrollChangeListener
66
import android.view.Window
77
import androidx.core.view.isVisible
8-
import androidx.recyclerview.widget.LinearLayoutManager
98
import androidx.recyclerview.widget.RecyclerView
109
import org.wordpress.android.R
1110
import org.wordpress.android.analytics.AnalyticsTracker.Stat
@@ -34,8 +33,7 @@ class JetpackBrandingUtils @Inject constructor(
3433
fun showJetpackBannerIfScrolledToTop(banner: View, scrollableView: RecyclerView) {
3534
banner.isVisible = true
3635

37-
val layoutManager = scrollableView.layoutManager as LinearLayoutManager
38-
val isEmpty = layoutManager.itemCount == 0
36+
val isEmpty = scrollableView.layoutManager?.itemCount == 0
3937
val scrollOffset = scrollableView.computeVerticalScrollOffset()
4038

4139
banner.translationY = if (scrollOffset == 0 || isEmpty) {

WordPress/src/main/res/layout/stats_fragment.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626

2727
</org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
2828

29+
<include
30+
android:id="@+id/jetpack_banner"
31+
layout="@layout/jetpack_banner" />
32+
2933
<com.google.android.material.appbar.AppBarLayout
3034
android:id="@+id/app_bar_layout"
3135
android:layout_width="match_parent"
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
android:id="@+id/coordinator"
44
android:layout_width="match_parent"
5-
android:layout_height="match_parent"
6-
android:orientation="vertical">
5+
android:layout_height="match_parent">
76

87
<androidx.fragment.app.FragmentContainerView
98
android:id="@+id/fragment_container"
109
android:name="org.wordpress.android.ui.stats.refresh.StatsFragment"
1110
android:layout_width="match_parent"
12-
android:layout_height="0dp"
13-
android:layout_weight="1" />
14-
15-
<include
16-
android:id="@+id/jetpack_banner"
17-
layout="@layout/jetpack_banner" />
18-
</LinearLayout>
11+
android:layout_height="match_parent" />
12+
</FrameLayout>

0 commit comments

Comments
 (0)