11package net.squanchy.schedule.tracksfilter
22
3+ import android.content.Context
4+ import android.content.Intent
35import android.os.Bundle
46import android.support.v7.app.AppCompatActivity
57import android.view.View
@@ -21,7 +23,7 @@ import net.squanchy.R
2123import net.squanchy.schedule.domain.view.Track
2224import net.squanchy.service.repository.TracksRepository
2325import net.squanchy.support.view.setAdapterIfNone
24- import java.util.concurrent.atomic.AtomicBoolean
26+ import net.squanchy.support.widget.OriginCoordinates
2527import kotlin.math.hypot
2628
2729class ScheduleTracksFilterActivity : AppCompatActivity () {
@@ -35,20 +37,22 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
3537 private var subscription: Disposable ? = null
3638 private var checkableTracks: List <CheckableTrack > = emptyList()
3739
38- private val needsAppearAnimation: AtomicBoolean = AtomicBoolean (true )
40+ private var needsAppearAnimation = true
41+ private var appearAnimationOrigin: OriginCoordinates ? = null
3942
4043 override fun onCreate (savedInstanceState : Bundle ? ) {
4144 super .onCreate(savedInstanceState)
4245
4346 setContentView(R .layout.activity_track_filters)
4447
4548 savedInstanceState?.apply {
46- val restoredNeedsAppearAnimation = getBoolean(EXTRA_NEEDS_APPEAR_ANIMATION , true )
47- needsAppearAnimation.set(restoredNeedsAppearAnimation )
49+ needsAppearAnimation = getBoolean(EXTRA_NEEDS_APPEAR_ANIMATION , true )
50+ appearAnimationOrigin = getParcelable( EXTRA_APPEAR_ANIMATION_ORIGIN )
4851 }
4952
50- backgroundDim.setOnClickListener { animateDisappearance() }
51- closeButton.setOnClickListener { animateDisappearance() }
53+ appearAnimationOrigin = appearAnimationOrigin ? : intent.getParcelableExtra(EXTRA_APPEAR_ANIMATION_ORIGIN )
54+
55+ backgroundDim.setOnClickListener { closeFilters() }
5256
5357 val component = tracksFilterComponent(this )
5458 tracksRepository = component.tracksRepository()
@@ -68,14 +72,18 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
6872 trackFiltersList.itemAnimator = null
6973 }
7074
71- private fun Set<Track>.addOrRemove (track : Track , selected : Boolean ): Set <Track > =
72- if (selected) this + track else this - track
75+ private fun closeFilters () {
76+ if (appearAnimationOrigin == null ) {
77+ finish()
78+ } else {
79+ animateDisappearance(appearAnimationOrigin!! )
80+ }
81+ }
7382
74- private fun animateDisappearance () {
83+ private fun animateDisappearance (origin : OriginCoordinates ) {
7584 backgroundDim.isEnabled = false
7685
77- val centerX = closeButton.x + closeButton.width / 2
78- val centerY = closeButton.y + closeButton.height / 2
86+ val (centerX, centerY) = origin
7987
8088 ViewAnimationUtils .createCircularReveal(
8189 filtersRoot,
@@ -93,12 +101,16 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
93101 }.start()
94102 }
95103
104+ private fun Set<Track>.addOrRemove (track : Track , selected : Boolean ): Set <Track > =
105+ if (selected) this + track else this - track
106+
96107 override fun onStart () {
97108 super .onStart()
98109
99- if (needsAppearAnimation.getAndSet(false )) {
110+ if (needsAppearAnimation && appearAnimationOrigin != null ) {
111+ needsAppearAnimation = false
100112 prepareAppearAnimation()
101- filtersRoot.postOnAnimation { animateAppearing() }
113+ filtersRoot.postOnAnimation { animateAppearing(appearAnimationOrigin !! ) }
102114 }
103115
104116 subscription = Observable .combineLatest(tracksRepository.tracks(), tracksFilter.selectedTracks, combineIntoCheckableTracks())
@@ -113,10 +125,32 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
113125 }
114126 }
115127
128+ private fun prepareAppearAnimation () {
129+ appearInterpolator = AnimationUtils .loadInterpolator(this , android.R .interpolator.linear_out_slow_in)
130+ filtersRoot.visibility = View .VISIBLE
131+
132+ val titleDeltaY = resources.getDimension(R .dimen.track_filters_title_appear_delta_y)
133+ dialogTitle.apply {
134+ translationY = - titleDeltaY
135+ alpha = 0F
136+ }
137+
138+ val subtitleDeltaY = resources.getDimension(R .dimen.track_filters_subtitle_appear_delta_y)
139+ dialogSubtitle.apply {
140+ translationY = - subtitleDeltaY
141+ alpha = 0F
142+ }
143+
144+ val tracksDeltaY = resources.getDimension(R .dimen.track_filters_tracks_appear_delta_y)
145+ trackFiltersList.apply {
146+ translationY = - tracksDeltaY
147+ alpha = 0F
148+ }
149+ }
150+
116151 @Suppress(" MagicNumber" ) // Just animation code… needs a few magic numbers
117- private fun animateAppearing () {
118- val centerX = closeButton.x + closeButton.width / 2
119- val centerY = closeButton.y + closeButton.height / 2
152+ private fun animateAppearing (origin : OriginCoordinates ) {
153+ val (centerX, centerY) = origin
120154
121155 ViewAnimationUtils .createCircularReveal(
122156 filtersRoot,
@@ -146,29 +180,6 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
146180 .setStartDelay(delay)
147181 .start()
148182
149- private fun prepareAppearAnimation () {
150- appearInterpolator = AnimationUtils .loadInterpolator(this , android.R .interpolator.linear_out_slow_in)
151- filtersRoot.visibility = View .VISIBLE
152-
153- val titleDeltaY = resources.getDimension(R .dimen.track_filters_title_appear_delta_y)
154- dialogTitle.apply {
155- translationY = - titleDeltaY
156- alpha = 0F
157- }
158-
159- val subtitleDeltaY = resources.getDimension(R .dimen.track_filters_subtitle_appear_delta_y)
160- dialogSubtitle.apply {
161- translationY = - subtitleDeltaY
162- alpha = 0F
163- }
164-
165- val tracksDeltaY = resources.getDimension(R .dimen.track_filters_tracks_appear_delta_y)
166- trackFiltersList.apply {
167- translationY = - tracksDeltaY
168- alpha = 0F
169- }
170- }
171-
172183 private fun combineIntoCheckableTracks (): BiFunction <List <Track >, Set<Track>, List<CheckableTrack>> {
173184 return BiFunction { tracks, selectedTracks ->
174185 tracks.map { track -> CheckableTrack (track, selectedTracks.contains(track)) }
@@ -177,7 +188,8 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
177188
178189 override fun onSaveInstanceState (outState : Bundle ? ) {
179190 super .onSaveInstanceState(outState)
180- outState?.putBoolean(EXTRA_NEEDS_APPEAR_ANIMATION , needsAppearAnimation.get())
191+ outState?.putBoolean(EXTRA_NEEDS_APPEAR_ANIMATION , needsAppearAnimation)
192+ outState?.putParcelable(EXTRA_APPEAR_ANIMATION_ORIGIN , appearAnimationOrigin)
181193 }
182194
183195 override fun onStop () {
@@ -187,5 +199,12 @@ class ScheduleTracksFilterActivity : AppCompatActivity() {
187199
188200 companion object {
189201 private const val EXTRA_NEEDS_APPEAR_ANIMATION = " ScheduleTracksFilterActivity.EXTRA_NEEDS_APPEAR_ANIMATION"
202+ private const val EXTRA_APPEAR_ANIMATION_ORIGIN = " ScheduleTracksFilterActivity.EXTRA_APPEAR_ANIMATION_ORIGIN"
203+
204+ fun createIntent (context : Context , originCoordinates : OriginCoordinates ? ): Intent {
205+ return Intent (context, ScheduleTracksFilterActivity ::class .java).apply {
206+ putExtra(EXTRA_APPEAR_ANIMATION_ORIGIN , originCoordinates)
207+ }
208+ }
190209 }
191210}
0 commit comments