From ddc950a26660536d1ec95fa83bfdbdcb6af36359 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Thu, 28 Nov 2019 18:53:53 +0530 Subject: [PATCH 01/10] Topic play animation --- .../app/topic/play/StorySummaryAdapter.kt | 86 ++++++++++++++++--- .../res/layout/topic_play_story_summary.xml | 3 +- 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index ffd7a2d3183..19d05504a1d 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -1,7 +1,11 @@ package org.oppia.app.topic.play import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.Transformation +import android.widget.LinearLayout import androidx.recyclerview.widget.RecyclerView import org.oppia.app.databinding.TopicPlayStorySummaryBinding import org.oppia.app.databinding.TopicPlayTitleBinding @@ -12,6 +16,7 @@ import org.oppia.app.model.ChapterSummary private const val VIEW_TYPE_TITLE_TEXT = 1 private const val VIEW_TYPE_STORY_ITEM = 2 +private const val ANIMATION_DURATION: Long = 400 /** Adapter to bind StorySummary to [RecyclerView] inside [TopicPlayFragment]. */ class StorySummaryAdapter( @@ -86,11 +91,20 @@ class StorySummaryAdapter( inner class StorySummaryViewHolder(private val binding: TopicPlayStorySummaryBinding) : RecyclerView.ViewHolder(binding.root) { internal fun bind(storySummaryViewModel: StorySummaryViewModel, position: Int) { - var isChapterListVisible = false - if (currentExpandedChapterListIndex != null) { - isChapterListVisible = currentExpandedChapterListIndex!! == position + if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex==position) { + binding.isListExpanded = true + + if (currentExpandedChapterListIndex == position) { + binding.chapterListDropDownIcon.animate().rotation(180F).setDuration(400).start() + expand(binding.chapterListContainer) + } else { + binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() + collapse(binding.chapterListContainer) + } + } + else { + binding.isListExpanded = false } - binding.isListExpanded = isChapterListVisible binding.viewModel = storySummaryViewModel val chapterSummaries = storySummaryViewModel.storySummary.chapterList @@ -111,7 +125,6 @@ class StorySummaryAdapter( binding.chapterRecyclerView.adapter = ChapterSummaryAdapter(chapterList, chapterSummarySelector) binding.root.setOnClickListener { - val previousIndex: Int? = currentExpandedChapterListIndex currentExpandedChapterListIndex = if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { null @@ -119,17 +132,68 @@ class StorySummaryAdapter( position } expandedChapterListIndexListener.onExpandListIconClicked(currentExpandedChapterListIndex) - if (previousIndex != null && currentExpandedChapterListIndex != null && previousIndex == currentExpandedChapterListIndex) { - notifyItemChanged(currentExpandedChapterListIndex!!) + + binding.isListExpanded = currentExpandedChapterListIndex == position + + if (currentExpandedChapterListIndex == position) { + binding.chapterListDropDownIcon.animate().rotation(180F).setDuration(400).start() + expand(binding.chapterListContainer) } else { - if (previousIndex != null) { - notifyItemChanged(previousIndex) + binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() + collapse(binding.chapterListContainer) + } + } + } + + private fun expand(chapterListContainer: View) { + chapterListContainer.clearAnimation() + val matchParentMeasureSpec = + View.MeasureSpec.makeMeasureSpec((chapterListContainer.parent as View).width, View.MeasureSpec.EXACTLY) + val wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + chapterListContainer.measure(matchParentMeasureSpec, wrapContentMeasureSpec) + val targetHeight = chapterListContainer.measuredHeight + + // Older versions of android (pre API 21) cancel animations for views with a height of 0. + chapterListContainer.layoutParams.height = 1 + chapterListContainer.visibility = View.VISIBLE + val expandAnimation = object : Animation() { + override fun applyTransformation(interpolatedTime: Float, t: Transformation) { + if (interpolatedTime == 1f) { + chapterListContainer.layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT + } else { + chapterListContainer.layoutParams.height = (targetHeight * interpolatedTime).toInt() } - if (currentExpandedChapterListIndex != null) { - notifyItemChanged(currentExpandedChapterListIndex!!) + chapterListContainer.requestLayout() + } + + override fun willChangeBounds(): Boolean { + return true + } + } + expandAnimation.duration = ANIMATION_DURATION + chapterListContainer.startAnimation(expandAnimation) + } + + private fun collapse(chapterListContainer: View) { + chapterListContainer.clearAnimation() + val initialHeight = chapterListContainer.measuredHeight + + val collapseAnimation = object : Animation() { + override fun applyTransformation(interpolatedTime: Float, t: Transformation?) { + if (interpolatedTime == 1f) { + chapterListContainer.visibility = View.GONE + } else { + chapterListContainer.layoutParams.height = initialHeight - (initialHeight * interpolatedTime).toInt() } + chapterListContainer.requestLayout() + } + + override fun willChangeBounds(): Boolean { + return true } } + collapseAnimation.duration = ANIMATION_DURATION + chapterListContainer.startAnimation(collapseAnimation) } } } diff --git a/app/src/main/res/layout/topic_play_story_summary.xml b/app/src/main/res/layout/topic_play_story_summary.xml index 0ad9fa9bd7f..41ecdf27ced 100644 --- a/app/src/main/res/layout/topic_play_story_summary.xml +++ b/app/src/main/res/layout/topic_play_story_summary.xml @@ -126,11 +126,12 @@ android:minHeight="48dp"> + android:src="@drawable/ic_arrow_drop_down_black_24dp" /> From 9d560a28f4609e59270b5367ef0404eddadd44bb Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Thu, 28 Nov 2019 22:53:08 +0530 Subject: [PATCH 02/10] Minor bug fixes --- .../app/topic/play/StorySummaryAdapter.kt | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index 19d05504a1d..6a84d8e20a6 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -6,6 +6,7 @@ import android.view.ViewGroup import android.view.animation.Animation import android.view.animation.Transformation import android.widget.LinearLayout +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import org.oppia.app.databinding.TopicPlayStorySummaryBinding import org.oppia.app.databinding.TopicPlayTitleBinding @@ -91,7 +92,7 @@ class StorySummaryAdapter( inner class StorySummaryViewHolder(private val binding: TopicPlayStorySummaryBinding) : RecyclerView.ViewHolder(binding.root) { internal fun bind(storySummaryViewModel: StorySummaryViewModel, position: Int) { - if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex==position) { + if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { binding.isListExpanded = true if (currentExpandedChapterListIndex == position) { @@ -101,8 +102,7 @@ class StorySummaryAdapter( binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() collapse(binding.chapterListContainer) } - } - else { + } else { binding.isListExpanded = false } binding.viewModel = storySummaryViewModel @@ -125,23 +125,22 @@ class StorySummaryAdapter( binding.chapterRecyclerView.adapter = ChapterSummaryAdapter(chapterList, chapterSummarySelector) binding.root.setOnClickListener { - currentExpandedChapterListIndex = - if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { - null - } else { - position - } - expandedChapterListIndexListener.onExpandListIconClicked(currentExpandedChapterListIndex) - - binding.isListExpanded = currentExpandedChapterListIndex == position + binding.isListExpanded = !binding.chapterListContainer.isVisible - if (currentExpandedChapterListIndex == position) { + if (!binding.chapterListContainer.isVisible) { binding.chapterListDropDownIcon.animate().rotation(180F).setDuration(400).start() expand(binding.chapterListContainer) } else { binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() collapse(binding.chapterListContainer) } + + if (binding.chapterListContainer.isVisible) { + currentExpandedChapterListIndex = position + } else { + currentExpandedChapterListIndex = null + } + expandedChapterListIndexListener.onExpandListIconClicked(currentExpandedChapterListIndex) } } From 2632149294bd0cecf9f06f266dc5f68b4b5beedb Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Fri, 29 Nov 2019 12:24:11 +0530 Subject: [PATCH 03/10] Minor optimisation --- .../app/topic/play/StorySummaryAdapter.kt | 48 ++++++++++--------- .../topic/play/TopicPlayFragmentPresenter.kt | 3 +- .../res/anim/rotation_anti_clockwise_180.xml | 8 ++++ .../main/res/anim/rotation_clockwise_180.xml | 8 ++++ .../res/layout/topic_play_story_summary.xml | 6 +-- 5 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/anim/rotation_anti_clockwise_180.xml create mode 100644 app/src/main/res/anim/rotation_clockwise_180.xml diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index 6a84d8e20a6..47a69b5c609 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -1,13 +1,17 @@ package org.oppia.app.topic.play +import android.content.Context +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.Animation +import android.view.animation.AnimationUtils import android.view.animation.Transformation import android.widget.LinearLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import org.oppia.app.R import org.oppia.app.databinding.TopicPlayStorySummaryBinding import org.oppia.app.databinding.TopicPlayTitleBinding import org.oppia.app.model.ChapterPlayState @@ -21,6 +25,7 @@ private const val ANIMATION_DURATION: Long = 400 /** Adapter to bind StorySummary to [RecyclerView] inside [TopicPlayFragment]. */ class StorySummaryAdapter( + private val context: Context, private val itemList: MutableList, private val chapterSummarySelector: ChapterSummarySelector, private val expandedChapterListIndexListener: ExpandedChapterListIndexListener, @@ -92,19 +97,6 @@ class StorySummaryAdapter( inner class StorySummaryViewHolder(private val binding: TopicPlayStorySummaryBinding) : RecyclerView.ViewHolder(binding.root) { internal fun bind(storySummaryViewModel: StorySummaryViewModel, position: Int) { - if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { - binding.isListExpanded = true - - if (currentExpandedChapterListIndex == position) { - binding.chapterListDropDownIcon.animate().rotation(180F).setDuration(400).start() - expand(binding.chapterListContainer) - } else { - binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() - collapse(binding.chapterListContainer) - } - } else { - binding.isListExpanded = false - } binding.viewModel = storySummaryViewModel val chapterSummaries = storySummaryViewModel.storySummary.chapterList @@ -124,27 +116,35 @@ class StorySummaryAdapter( val chapterList = storySummaryViewModel.storySummary.chapterList binding.chapterRecyclerView.adapter = ChapterSummaryAdapter(chapterList, chapterSummarySelector) + if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { + val aniRotate = AnimationUtils.loadAnimation(context, R.anim.rotation_clockwise_180) + binding.chapterListDropDownIcon.startAnimation(aniRotate) + expand(binding.chapterListContainer) + } else { + val aniRotate = AnimationUtils.loadAnimation(context, R.anim.rotation_anti_clockwise_180) + binding.chapterListDropDownIcon.startAnimation(aniRotate) + collapse(binding.chapterListContainer) + } + binding.root.setOnClickListener { - binding.isListExpanded = !binding.chapterListContainer.isVisible + val previousItem = currentExpandedChapterListIndex - if (!binding.chapterListContainer.isVisible) { - binding.chapterListDropDownIcon.animate().rotation(180F).setDuration(400).start() - expand(binding.chapterListContainer) - } else { - binding.chapterListDropDownIcon.animate().rotation(0F).setDuration(400).start() - collapse(binding.chapterListContainer) - } if (binding.chapterListContainer.isVisible) { - currentExpandedChapterListIndex = position - } else { currentExpandedChapterListIndex = null + } else { + currentExpandedChapterListIndex = position } expandedChapterListIndexListener.onExpandListIconClicked(currentExpandedChapterListIndex) + if (previousItem != null && previousItem != position) { + notifyItemChanged(previousItem) + } + notifyItemChanged(position) } } private fun expand(chapterListContainer: View) { + Log.d("TAG", "expand") chapterListContainer.clearAnimation() val matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec((chapterListContainer.parent as View).width, View.MeasureSpec.EXACTLY) @@ -174,7 +174,9 @@ class StorySummaryAdapter( } private fun collapse(chapterListContainer: View) { + Log.d("TAG", "collapse") chapterListContainer.clearAnimation() + val initialHeight = chapterListContainer.measuredHeight val collapseAnimation = object : Animation() { diff --git a/app/src/main/java/org/oppia/app/topic/play/TopicPlayFragmentPresenter.kt b/app/src/main/java/org/oppia/app/topic/play/TopicPlayFragmentPresenter.kt index a0cbef12c2e..af6f50681e6 100644 --- a/app/src/main/java/org/oppia/app/topic/play/TopicPlayFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/TopicPlayFragmentPresenter.kt @@ -26,7 +26,7 @@ import javax.inject.Inject /** The presenter for [TopicPlayFragment]. */ @FragmentScope class TopicPlayFragmentPresenter @Inject constructor( - activity: AppCompatActivity, + private val activity: AppCompatActivity, private val fragment: Fragment, private val logger: Logger, private val explorationDataController: ExplorationDataController, @@ -86,6 +86,7 @@ class TopicPlayFragmentPresenter @Inject constructor( } val storySummaryAdapter = StorySummaryAdapter( + activity, itemList, this as ChapterSummarySelector, expandedChapterListIndexListener, diff --git a/app/src/main/res/anim/rotation_anti_clockwise_180.xml b/app/src/main/res/anim/rotation_anti_clockwise_180.xml new file mode 100644 index 00000000000..12aef1e4edc --- /dev/null +++ b/app/src/main/res/anim/rotation_anti_clockwise_180.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/rotation_clockwise_180.xml b/app/src/main/res/anim/rotation_clockwise_180.xml new file mode 100644 index 00000000000..60301ed912f --- /dev/null +++ b/app/src/main/res/anim/rotation_clockwise_180.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/topic_play_story_summary.xml b/app/src/main/res/layout/topic_play_story_summary.xml index 41ecdf27ced..50cd1e92be3 100644 --- a/app/src/main/res/layout/topic_play_story_summary.xml +++ b/app/src/main/res/layout/topic_play_story_summary.xml @@ -6,10 +6,6 @@ - - @@ -142,7 +138,7 @@ android:layout_height="wrap_content" android:background="@color/whiteLight" android:orientation="vertical" - android:visibility="@{isListExpanded? View.VISIBLE : View.GONE}"> + android:visibility="gone"> Date: Fri, 29 Nov 2019 13:20:14 +0530 Subject: [PATCH 04/10] Final topic play animation --- .../oppia/app/topic/play/StorySummaryAdapter.kt | 9 +++------ .../main/res/anim/rotation_anti_clockwise_180.xml | 14 +++++++++----- app/src/main/res/anim/rotation_clockwise_180.xml | 14 +++++++++----- app/src/main/res/values/integers.xml | 5 +++++ 4 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 app/src/main/res/values/integers.xml diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index 47a69b5c609..46b803d026c 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -21,7 +21,6 @@ import org.oppia.app.model.ChapterSummary private const val VIEW_TYPE_TITLE_TEXT = 1 private const val VIEW_TYPE_STORY_ITEM = 2 -private const val ANIMATION_DURATION: Long = 400 /** Adapter to bind StorySummary to [RecyclerView] inside [TopicPlayFragment]. */ class StorySummaryAdapter( @@ -128,18 +127,16 @@ class StorySummaryAdapter( binding.root.setOnClickListener { val previousItem = currentExpandedChapterListIndex - - if (binding.chapterListContainer.isVisible) { currentExpandedChapterListIndex = null } else { currentExpandedChapterListIndex = position } expandedChapterListIndexListener.onExpandListIconClicked(currentExpandedChapterListIndex) + notifyItemChanged(position) if (previousItem != null && previousItem != position) { notifyItemChanged(previousItem) } - notifyItemChanged(position) } } @@ -169,7 +166,7 @@ class StorySummaryAdapter( return true } } - expandAnimation.duration = ANIMATION_DURATION + expandAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_duration).toLong() chapterListContainer.startAnimation(expandAnimation) } @@ -193,7 +190,7 @@ class StorySummaryAdapter( return true } } - collapseAnimation.duration = ANIMATION_DURATION + collapseAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_duration).toLong() chapterListContainer.startAnimation(collapseAnimation) } } diff --git a/app/src/main/res/anim/rotation_anti_clockwise_180.xml b/app/src/main/res/anim/rotation_anti_clockwise_180.xml index 12aef1e4edc..c9f3496d42f 100644 --- a/app/src/main/res/anim/rotation_anti_clockwise_180.xml +++ b/app/src/main/res/anim/rotation_anti_clockwise_180.xml @@ -1,8 +1,12 @@ - - + - \ No newline at end of file + android:toDegrees="0" /> + diff --git a/app/src/main/res/anim/rotation_clockwise_180.xml b/app/src/main/res/anim/rotation_clockwise_180.xml index 60301ed912f..880f59d3e5a 100644 --- a/app/src/main/res/anim/rotation_clockwise_180.xml +++ b/app/src/main/res/anim/rotation_clockwise_180.xml @@ -1,8 +1,12 @@ - - + - \ No newline at end of file + android:toDegrees="180" /> + diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml new file mode 100644 index 00000000000..83e7c7bdf96 --- /dev/null +++ b/app/src/main/res/values/integers.xml @@ -0,0 +1,5 @@ + + + 300 + 400 + From 16c18aa776f154dc2cbcef80a58f49b77375da64 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Fri, 29 Nov 2019 13:42:38 +0530 Subject: [PATCH 05/10] Remove unused code --- .../java/org/oppia/app/topic/play/StorySummaryAdapter.kt | 3 --- .../main/res/drawable/ic_arrow_drop_up_black_24dp.xml | 9 --------- 2 files changed, 12 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index 46b803d026c..ab959296c83 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -1,7 +1,6 @@ package org.oppia.app.topic.play import android.content.Context -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -141,7 +140,6 @@ class StorySummaryAdapter( } private fun expand(chapterListContainer: View) { - Log.d("TAG", "expand") chapterListContainer.clearAnimation() val matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec((chapterListContainer.parent as View).width, View.MeasureSpec.EXACTLY) @@ -171,7 +169,6 @@ class StorySummaryAdapter( } private fun collapse(chapterListContainer: View) { - Log.d("TAG", "collapse") chapterListContainer.clearAnimation() val initialHeight = chapterListContainer.measuredHeight diff --git a/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml deleted file mode 100644 index b1442ce1595..00000000000 --- a/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - From faf8229ff12d2eacc94fd2fa6f910efeaf51ef8a Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Fri, 29 Nov 2019 15:01:41 +0530 Subject: [PATCH 06/10] Nit renaming --- .../java/org/oppia/app/topic/play/StorySummaryAdapter.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index ab959296c83..045af4727ef 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -113,14 +113,13 @@ class StorySummaryAdapter( val chapterList = storySummaryViewModel.storySummary.chapterList binding.chapterRecyclerView.adapter = ChapterSummaryAdapter(chapterList, chapterSummarySelector) - if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { - val aniRotate = AnimationUtils.loadAnimation(context, R.anim.rotation_clockwise_180) - binding.chapterListDropDownIcon.startAnimation(aniRotate) + val rotate = AnimationUtils.loadAnimation(context, R.anim.rotation_clockwise_180) + binding.chapterListDropDownIcon.startAnimation(rotate) expand(binding.chapterListContainer) } else { - val aniRotate = AnimationUtils.loadAnimation(context, R.anim.rotation_anti_clockwise_180) - binding.chapterListDropDownIcon.startAnimation(aniRotate) + val rotate = AnimationUtils.loadAnimation(context, R.anim.rotation_anti_clockwise_180) + binding.chapterListDropDownIcon.startAnimation(rotate) collapse(binding.chapterListContainer) } From f288b1b9d73dee54ae4fa25c8e5507474a3b3558 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Mon, 2 Dec 2019 19:00:57 +0530 Subject: [PATCH 07/10] Updated test cases --- .../app/topic/play/StorySummaryAdapter.kt | 6 +- .../res/anim/rotation_anti_clockwise_180.xml | 2 +- .../main/res/anim/rotation_clockwise_180.xml | 2 +- app/src/main/res/anim/slide_out_left.xml | 4 +- app/src/main/res/anim/slide_right_in.xml | 4 +- .../res/layout/topic_play_story_summary.xml | 1 + app/src/main/res/values-v21/integers.xml | 2 +- app/src/main/res/values/integers.xml | 4 +- .../app/topic/play/TopicPlayFragmentTest.kt | 176 +++++++++++++----- 9 files changed, 139 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index 045af4727ef..ed2570ae176 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -123,7 +123,7 @@ class StorySummaryAdapter( collapse(binding.chapterListContainer) } - binding.root.setOnClickListener { + binding.storyContainer.setOnClickListener { val previousItem = currentExpandedChapterListIndex if (binding.chapterListContainer.isVisible) { currentExpandedChapterListIndex = null @@ -163,7 +163,7 @@ class StorySummaryAdapter( return true } } - expandAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_duration).toLong() + expandAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_time_ms).toLong() chapterListContainer.startAnimation(expandAnimation) } @@ -186,7 +186,7 @@ class StorySummaryAdapter( return true } } - collapseAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_duration).toLong() + collapseAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_time_ms).toLong() chapterListContainer.startAnimation(collapseAnimation) } } diff --git a/app/src/main/res/anim/rotation_anti_clockwise_180.xml b/app/src/main/res/anim/rotation_anti_clockwise_180.xml index c9f3496d42f..be01eb34e82 100644 --- a/app/src/main/res/anim/rotation_anti_clockwise_180.xml +++ b/app/src/main/res/anim/rotation_anti_clockwise_180.xml @@ -4,7 +4,7 @@ android:fillEnabled="true" android:interpolator="@android:anim/linear_interpolator"> diff --git a/app/src/main/res/anim/slide_right_in.xml b/app/src/main/res/anim/slide_right_in.xml index 40bdeac4dab..26f8dbf0fd3 100644 --- a/app/src/main/res/anim/slide_right_in.xml +++ b/app/src/main/res/anim/slide_right_in.xml @@ -1,11 +1,11 @@ diff --git a/app/src/main/res/layout/topic_play_story_summary.xml b/app/src/main/res/layout/topic_play_story_summary.xml index 50cd1e92be3..80b8d7c76cf 100644 --- a/app/src/main/res/layout/topic_play_story_summary.xml +++ b/app/src/main/res/layout/topic_play_story_summary.xml @@ -16,6 +16,7 @@ - 300 + 300 diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 83e7c7bdf96..64e8ccc5d0a 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,5 +1,5 @@ - 300 - 400 + 300 + 400 diff --git a/app/src/sharedTest/java/org/oppia/app/topic/play/TopicPlayFragmentTest.kt b/app/src/sharedTest/java/org/oppia/app/topic/play/TopicPlayFragmentTest.kt index 24860e804a0..3f9b6a2a7c3 100644 --- a/app/src/sharedTest/java/org/oppia/app/topic/play/TopicPlayFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/app/topic/play/TopicPlayFragmentTest.kt @@ -2,8 +2,10 @@ package org.oppia.app.topic.play import android.app.Application import android.content.Context +import android.content.Intent import android.content.res.Configuration import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches @@ -12,9 +14,9 @@ import androidx.test.espresso.intent.Intents.intended import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule @@ -38,7 +40,9 @@ import org.oppia.app.recyclerview.RecyclerViewMatcher.Companion.atPosition import org.oppia.app.recyclerview.RecyclerViewMatcher.Companion.atPositionOnView import org.oppia.app.story.StoryActivity import org.oppia.app.topic.TopicActivity +import org.oppia.app.topic.TopicTab import org.oppia.app.utility.EspressoTestsMatchers.withDrawable +import org.oppia.domain.topic.TEST_TOPIC_ID_0 import org.oppia.util.threading.BackgroundDispatcher import org.oppia.util.threading.BlockingDispatcher import javax.inject.Singleton @@ -67,33 +71,51 @@ class TopicPlayFragmentTest { @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_storyName_isCorrect() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) onView( atPosition( R.id.story_summary_recycler_view, - 0 + 1 ) ).check(matches(hasDescendant(withText(containsString("First Story"))))) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_chapterCountTextSingle_isCorrect() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) onView( atPosition( R.id.story_summary_recycler_view, - 0 + 1 ) ).check(matches(hasDescendant(withText(containsString("1 Chapter"))))) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_chapterCountTextMultiple_isCorrect() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) onView( atPosition( R.id.story_summary_recycler_view, - 1 + 2 ) ).check(matches(hasDescendant(withText(containsString("3 Chapters"))))) } @@ -101,22 +123,34 @@ class TopicPlayFragmentTest { @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_completeStoryProgress_isDisplayed() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) onView( atPosition( R.id.story_summary_recycler_view, - 0 + 1 ) ).check(matches(hasDescendant(withText(containsString("100%"))))) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_partialStoryProgress_isDisplayed() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) onView( atPosition( R.id.story_summary_recycler_view, - 1 + 2 ) ).check(matches(hasDescendant(withText(containsString("33%"))))) } @@ -124,28 +158,40 @@ class TopicPlayFragmentTest { @Test @Ignore("Landscape not properly supported") // TODO(#56): Reenable once landscape is supported. fun testTopicPlayFragment_loadFragmentWithTopicTestId0_configurationChange_storyName_isCorrect() { - activityTestRule.launchActivity(null) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) activityTestRule.activity.requestedOrientation = Configuration.ORIENTATION_LANDSCAPE onView( atPosition( R.id.story_summary_recycler_view, - 0 + 1 ) ).check(matches(hasDescendant(withText(containsString("First Story"))))) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickStoryItem_opensStoryActivityWithCorrectIntent() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.story_name_text_view)).perform(click()) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_name_text_view)).perform(click()) intended(hasComponent(StoryActivity::class.java.name)) intended(hasExtra(StoryActivity.STORY_ACTIVITY_INTENT_EXTRA, storyId)) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_chapterListIsNotVisible() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.chapter_recycler_view)).check( + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.chapter_recycler_view)).check( matches( not( isDisplayed() @@ -156,33 +202,34 @@ class TopicPlayFragmentTest { @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_default_arrowDown() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).check( - matches( - withDrawable(R.drawable.ic_keyboard_arrow_down_black_24dp) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) ) - ) - } - - @Test - fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickExpandListIcon_iconChanges() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).perform(click()) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).check( + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.chapter_list_drop_down_icon)).check( matches( - withDrawable(R.drawable.ic_keyboard_arrow_up_black_24dp) + withDrawable(R.drawable.ic_arrow_drop_down_black_24dp) ) ) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickExpandListIcon_chapterListIsVisible() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).perform(click()) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_container)).perform(click()) onView( atPositionOnView( R.id.story_summary_recycler_view, - 0, + 1, R.id.chapter_recycler_view ) ).check(matches(isDisplayed())) @@ -190,28 +237,39 @@ class TopicPlayFragmentTest { @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickChapter_opensExplorationActivity() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.expand_list_icon)).perform(click()) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) onView( allOf( - withId(R.id.chapter_recycler_view), - withParent( - atPosition(R.id.story_summary_recycler_view, 1) - ) + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) ) - ).check(matches(hasDescendant(withText(containsString("Second"))))).perform(click()) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_container)).perform(click()) + onView( + atPositionOnView( + R.id.story_summary_recycler_view, + 1, + R.id.chapter_recycler_view + ) + ).check(matches(hasDescendant(withId(R.id.chapter_container)))).perform(click()) intended(hasComponent(ExplorationActivity::class.java.name)) } @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickExpandListIconIndex0_clickExpandListIconIndex1_chapterListForIndex0IsNotDisplayed() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).perform(click()) - onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.expand_list_icon)).perform(click()) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_container)).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 2, R.id.story_container)).perform(click()) onView( atPositionOnView( R.id.story_summary_recycler_view, - 0, + 1, R.id.chapter_recycler_view ) ).check(matches(not(isDisplayed()))) @@ -219,13 +277,19 @@ class TopicPlayFragmentTest { @Test fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickExpandListIconIndex1_clickExpandListIconIndex0_chapterListForIndex0IsNotDisplayed() { - activityTestRule.launchActivity(null) - onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.expand_list_icon)).perform(click()) - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).perform(click()) + activityTestRule.launchActivity(createTopicActivityIntent(TEST_TOPIC_ID_0)) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 2, R.id.story_container)).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_container)).perform(click()) onView( atPositionOnView( R.id.story_summary_recycler_view, - 1, + 2, R.id.chapter_recycler_view ) ).check(matches(not(isDisplayed()))) @@ -235,14 +299,20 @@ class TopicPlayFragmentTest { @Ignore("Landscape not properly supported") // TODO(#56): Reenable once landscape is supported. fun testTopicPlayFragment_loadFragmentWithTopicTestId0_clickExpandListIconIndex0_configurationChange_chapterListIsVisible() { ActivityScenario.launch(TopicActivity::class.java).use { - onView(atPositionOnView(R.id.story_summary_recycler_view, 0, R.id.expand_list_icon)).perform(click()) + onView( + allOf( + withText(TopicTab.getTabForPosition(1).name), + isDescendantOfA(withId(R.id.topic_tabs_container)) + ) + ).perform(click()) + onView(atPositionOnView(R.id.story_summary_recycler_view, 1, R.id.story_container)).perform(click()) it.onActivity { activity -> activity.requestedOrientation = Configuration.ORIENTATION_LANDSCAPE } onView( atPositionOnView( R.id.story_summary_recycler_view, - 0, + 1, R.id.chapter_recycler_view ) ).check(matches(isDisplayed())) @@ -254,6 +324,12 @@ class TopicPlayFragmentTest { Intents.release() } + private fun createTopicActivityIntent(topicId: String): Intent { + return TopicActivity.createTopicActivityIntent( + ApplicationProvider.getApplicationContext(), topicId + ) + } + @Module class TestModule { @Provides From bff5d3004f286386735cbd27c05c0dd9fa0121b9 Mon Sep 17 00:00:00 2001 From: marysoloman Date: Thu, 12 Dec 2019 13:00:56 +0530 Subject: [PATCH 08/10] updated chapter_list_container as ExpandableLayout for expand and collapse animation --- app/build.gradle | 1 + .../app/topic/play/StorySummaryAdapter.kt | 60 +------------------ .../res/layout/topic_play_story_summary.xml | 45 ++++++++------ 3 files changed, 30 insertions(+), 76 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 20658430d11..d8c226a4244 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,6 +75,7 @@ dependencies { 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1', 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1', 'org.mockito:mockito-core:2.7.22', + 'net.cachapa.expandablelayout:expandablelayout:2.9.2', ) testImplementation( 'androidx.test:core:1.2.0', diff --git a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt index ed2570ae176..de13180b12d 100644 --- a/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt +++ b/app/src/main/java/org/oppia/app/topic/play/StorySummaryAdapter.kt @@ -2,12 +2,8 @@ package org.oppia.app.topic.play import android.content.Context import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import android.view.animation.Animation import android.view.animation.AnimationUtils -import android.view.animation.Transformation -import android.widget.LinearLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import org.oppia.app.R @@ -116,11 +112,11 @@ class StorySummaryAdapter( if (currentExpandedChapterListIndex != null && currentExpandedChapterListIndex == position) { val rotate = AnimationUtils.loadAnimation(context, R.anim.rotation_clockwise_180) binding.chapterListDropDownIcon.startAnimation(rotate) - expand(binding.chapterListContainer) + binding.chapterListContainer.expand() } else { val rotate = AnimationUtils.loadAnimation(context, R.anim.rotation_anti_clockwise_180) binding.chapterListDropDownIcon.startAnimation(rotate) - collapse(binding.chapterListContainer) + binding.chapterListContainer.collapse() } binding.storyContainer.setOnClickListener { @@ -137,57 +133,5 @@ class StorySummaryAdapter( } } } - - private fun expand(chapterListContainer: View) { - chapterListContainer.clearAnimation() - val matchParentMeasureSpec = - View.MeasureSpec.makeMeasureSpec((chapterListContainer.parent as View).width, View.MeasureSpec.EXACTLY) - val wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) - chapterListContainer.measure(matchParentMeasureSpec, wrapContentMeasureSpec) - val targetHeight = chapterListContainer.measuredHeight - - // Older versions of android (pre API 21) cancel animations for views with a height of 0. - chapterListContainer.layoutParams.height = 1 - chapterListContainer.visibility = View.VISIBLE - val expandAnimation = object : Animation() { - override fun applyTransformation(interpolatedTime: Float, t: Transformation) { - if (interpolatedTime == 1f) { - chapterListContainer.layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT - } else { - chapterListContainer.layoutParams.height = (targetHeight * interpolatedTime).toInt() - } - chapterListContainer.requestLayout() - } - - override fun willChangeBounds(): Boolean { - return true - } - } - expandAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_time_ms).toLong() - chapterListContainer.startAnimation(expandAnimation) - } - - private fun collapse(chapterListContainer: View) { - chapterListContainer.clearAnimation() - - val initialHeight = chapterListContainer.measuredHeight - - val collapseAnimation = object : Animation() { - override fun applyTransformation(interpolatedTime: Float, t: Transformation?) { - if (interpolatedTime == 1f) { - chapterListContainer.visibility = View.GONE - } else { - chapterListContainer.layoutParams.height = initialHeight - (initialHeight * interpolatedTime).toInt() - } - chapterListContainer.requestLayout() - } - - override fun willChangeBounds(): Boolean { - return true - } - } - collapseAnimation.duration = context.resources.getInteger(R.integer.topic_play_animation_time_ms).toLong() - chapterListContainer.startAnimation(collapseAnimation) - } } } diff --git a/app/src/main/res/layout/topic_play_story_summary.xml b/app/src/main/res/layout/topic_play_story_summary.xml index 80b8d7c76cf..49145cba232 100644 --- a/app/src/main/res/layout/topic_play_story_summary.xml +++ b/app/src/main/res/layout/topic_play_story_summary.xml @@ -132,30 +132,39 @@ - - - - + android:background="@color/colorPrimaryDark" + app:el_duration="300" + app:el_expanded="true"> - - + android:background="@color/whiteLight" + android:orientation="vertical" + > + + + + + + + + From 0a856e0461b101e5475120a6827dc6d2d11821cc Mon Sep 17 00:00:00 2001 From: marysoloman Date: Thu, 12 Dec 2019 13:02:07 +0530 Subject: [PATCH 09/10] nit --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d8c226a4244..7ec843099b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,11 +71,11 @@ dependencies { 'com.google.android.material:material:1.0.0', 'com.google.dagger:dagger:2.24', 'com.google.guava:guava:28.1-android', + 'net.cachapa.expandablelayout:expandablelayout:2.9.2', "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1', 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1', 'org.mockito:mockito-core:2.7.22', - 'net.cachapa.expandablelayout:expandablelayout:2.9.2', ) testImplementation( 'androidx.test:core:1.2.0', From 6b7cf74c6a1757d98a082a882377b4e3829b8b60 Mon Sep 17 00:00:00 2001 From: marysoloman Date: Thu, 12 Dec 2019 14:08:11 +0530 Subject: [PATCH 10/10] nit --- app/src/main/res/values/integers.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 64e8ccc5d0a..bceca989111 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,5 +1,4 @@ 300 - 400