diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index a816baa35..52edc08fb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -516,6 +516,14 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Clear first time navigation state"), + isEnabled = true, + onClick = { + SignalStore.storyValues().userHasSeenFirstNavView = false + } + ) + clickPref( title = DSLSettingsText.from(R.string.preferences__internal_stories_dialog_launcher), onClick = { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt index 656913988..0ab31a7de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt @@ -1,7 +1,8 @@ package org.thoughtcrime.securesms.stories +import android.animation.Animator +import android.animation.AnimatorListenerAdapter import android.content.Context -import android.graphics.Canvas import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable @@ -10,14 +11,13 @@ import android.util.AttributeSet import android.view.View import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout +import com.airbnb.lottie.LottieAnimationView import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target -import org.signal.core.util.DimensionUnit import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.blurhash.BlurHash -import org.thoughtcrime.securesms.components.CornerMask import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.visible @@ -28,20 +28,22 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( companion object { private const val BLUR_ALPHA = 0x3D - private const val NO_BLUR_ALPHA = 0xB3 + private const val NO_BLUR_ALPHA = 0xCC } init { inflate(context, R.layout.story_first_time_navigation_view, this) } + private val tapToAdvance: LottieAnimationView = findViewById(R.id.edu_tap_icon) + private val swipeUp: LottieAnimationView = findViewById(R.id.edu_swipe_up_icon) + private val swipeRight: LottieAnimationView = findViewById(R.id.edu_swipe_right_icon) private val blurHashView: ImageView = findViewById(R.id.edu_blur_hash) private val overlayView: ImageView = findViewById(R.id.edu_overlay) private val gotIt: View = findViewById(R.id.edu_got_it) + private val close: View = findViewById(R.id.edu_close) - private val cornerMask = CornerMask(this).apply { - setRadius(DimensionUnit.DP.toPixels(18f).toInt()) - } + private var isPlayingAnimations = false var callback: Callback? = null @@ -59,12 +61,14 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( hide() } - setOnClickListener { } - } + close.setOnClickListener { + callback?.onCloseClicked() + GlideApp.with(this).clear(blurHashView) + blurHashView.setImageDrawable(null) + hide() + } - override fun dispatchDraw(canvas: Canvas) { - super.dispatchDraw(canvas) - cornerMask.mask(canvas) + setOnClickListener { } } fun setBlurHash(blurHash: BlurHash?) { @@ -105,10 +109,47 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( } visible = true + startLottieAnimations() } fun hide() { visible = false + endLottieAnimations() + } + + private fun startLottieAnimations() { + isPlayingAnimations = true + tapToAdvance.addAnimatorListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + if (isPlayingAnimations) { + swipeUp.playAnimation() + } + } + }) + + swipeUp.addAnimatorListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + if (isPlayingAnimations) { + swipeRight.playAnimation() + } + } + }) + + swipeRight.addAnimatorListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + postDelayed({ + if (isPlayingAnimations) { + startLottieAnimations() + } + }, 300) + } + }) + + tapToAdvance.playAnimation() + } + + private fun endLottieAnimations() { + isPlayingAnimations = false } private fun isRenderEffectSupported(): Boolean { @@ -118,5 +159,6 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( interface Callback { fun userHasSeenFirstNavigationView(): Boolean fun onGotItClicked() + fun onCloseClicked() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt index 22699a394..a8aa7c113 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt @@ -6,6 +6,7 @@ import android.media.AudioManager import android.os.Build import android.os.Bundle import android.view.KeyEvent +import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AppCompatDelegate import androidx.media.AudioManagerCompat @@ -16,7 +17,9 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaControllerOwner import org.thoughtcrime.securesms.stories.StoryViewerArgs +import org.thoughtcrime.securesms.util.FullscreenHelper import org.thoughtcrime.securesms.util.ServiceUtil +import org.thoughtcrime.securesms.util.ViewUtil import kotlin.math.max import kotlin.math.min @@ -34,9 +37,18 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { StoryMutePolicy.initialize() Glide.get(this).setMemoryCategory(MemoryCategory.HIGH) + FullscreenHelper.showSystemUI(window) supportPostponeEnterTransition() + val root = findViewById(android.R.id.content) + root.setPadding( + 0, + ViewUtil.getStatusBarHeight(root), + 0, + ViewUtil.getNavigationBarHeight(root) + ) + super.onCreate(savedInstanceState, ready) setContentView(R.layout.fragment_container) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt index 81e163c10..6b5428ea2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt @@ -1,5 +1,8 @@ package org.thoughtcrime.securesms.stories.viewer +import android.graphics.RenderEffect +import android.graphics.Shader +import android.os.Build import android.os.Bundle import android.view.View import androidx.core.app.ActivityCompat @@ -8,9 +11,11 @@ import androidx.fragment.app.viewModels import androidx.viewpager2.widget.ViewPager2 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stories.StoryViewerArgs +import org.thoughtcrime.securesms.stories.viewer.first.StoryFirstTimeNavigationFragment import org.thoughtcrime.securesms.stories.viewer.page.StoryViewerPageArgs import org.thoughtcrime.securesms.stories.viewer.page.StoryViewerPageFragment import org.thoughtcrime.securesms.stories.viewer.reply.StoriesSharedElementCrossFaderView @@ -116,6 +121,20 @@ class StoryViewerFragment : viewModel.addHiddenAndRefresh(ids.toSet()) } else { viewModel.refresh() + + if (!SignalStore.storyValues().userHasSeenFirstNavView) { + StoryFirstTimeNavigationFragment().show(childFragmentManager, null) + } + } + + if (Build.VERSION.SDK_INT >= 31) { + lifecycleDisposable += viewModel.isFirstTimeNavigationShowing.subscribe { + if (it) { + requireView().rootView.setRenderEffect(RenderEffect.createBlurEffect(100f, 100f, Shader.TileMode.CLAMP)) + } else { + requireView().rootView.setRenderEffect(null) + } + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt index b7cd12412..0389075d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt @@ -53,13 +53,20 @@ class StoryViewerViewModel( var hasConsumedInitialState = false private set + private val firstTimeNavigationPublisher: BehaviorSubject = BehaviorSubject.createDefault(false) + val isChildScrolling: Observable = childScrollStatePublisher.distinctUntilChanged() + val isFirstTimeNavigationShowing: Observable = firstTimeNavigationPublisher.distinctUntilChanged() fun addHiddenAndRefresh(hidden: Set) { this.hidden.addAll(hidden) refresh() } + fun setIsDisplayingFirstTimeNavigation(isDisplayingFirstTimeNavigation: Boolean) { + firstTimeNavigationPublisher.onNext(isDisplayingFirstTimeNavigation) + } + fun getHidden(): Set = hidden fun setCrossfadeTarget(messageRecord: MmsMessageRecord) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt new file mode 100644 index 000000000..f486d56e0 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt @@ -0,0 +1,86 @@ +package org.thoughtcrime.securesms.stories.viewer.first + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import androidx.core.app.ActivityCompat +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.viewModels +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.stories.StoryFirstTimeNavigationView +import org.thoughtcrime.securesms.stories.viewer.StoryViewerState +import org.thoughtcrime.securesms.stories.viewer.StoryViewerViewModel +import org.thoughtcrime.securesms.util.LifecycleDisposable + +class StoryFirstTimeNavigationFragment : DialogFragment(R.layout.story_viewer_first_time_navigation_stub), StoryFirstTimeNavigationView.Callback { + + private val viewModel: StoryViewerViewModel by viewModels(ownerProducer = { + requireParentFragment() + }) + + private val disposables = LifecycleDisposable() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_FRAME, R.style.Signal_DayNight_Dialog_FullScreen) + isCancelable = false + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + if (Build.VERSION.SDK_INT >= 21) { + dialog.window!!.addFlags( + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION or + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or + WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + ) + } + return dialog + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + (view as StoryFirstTimeNavigationView).show() + view.callback = this + viewModel.setIsDisplayingFirstTimeNavigation(true) + + disposables += viewModel.state.subscribe { state -> + when (state.crossfadeSource) { + is StoryViewerState.CrossfadeSource.ImageUri -> { + view.setBlurHash(state.crossfadeSource.imageBlur) + } + else -> { + view.setBlurHash(null) + } + } + } + } + + override fun userHasSeenFirstNavigationView(): Boolean { + return SignalStore.storyValues().userHasSeenFirstNavView + } + + override fun onGotItClicked() { + dismissAllowingStateLoss() + + SignalStore.storyValues().userHasSeenFirstNavView = true + viewModel.setIsDisplayingFirstTimeNavigation(false) + } + + override fun onCloseClicked() { + dismissAllowingStateLoss() + + if (viewModel.stateSnapshot.skipCrossfade) { + requireActivity().finish() + } else { + ActivityCompat.finishAfterTransition(requireActivity()) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryFirstNavigationStub.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryFirstNavigationStub.kt deleted file mode 100644 index 22289fdb4..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryFirstNavigationStub.kt +++ /dev/null @@ -1,61 +0,0 @@ -package org.thoughtcrime.securesms.stories.viewer.page - -import android.view.ViewStub -import androidx.core.view.isVisible -import org.thoughtcrime.securesms.blurhash.BlurHash -import org.thoughtcrime.securesms.stories.StoryFirstTimeNavigationView -import org.thoughtcrime.securesms.util.views.Stub - -/** - * Specialized stub that allows for early arrival of the blurhash and callback. - */ -class StoryFirstNavigationStub(viewStub: ViewStub) : Stub(viewStub) { - - private var callback: StoryFirstTimeNavigationView.Callback? = null - private var blurHash: BlurHash? = null - - fun setCallback(callback: StoryFirstTimeNavigationView.Callback) { - if (resolved()) { - get().callback = callback - } else { - this.callback = callback - } - } - - fun setBlurHash(blurHash: BlurHash?) { - if (resolved()) { - get().setBlurHash(blurHash) - } else { - this.blurHash = blurHash - } - } - - fun showIfAble(ableToShow: Boolean) { - if (ableToShow) { - get().show() - } - } - - fun isVisible(): Boolean { - return resolved() && get().isVisible - } - - fun hide() { - if (resolved()) { - get().hide() - } - } - - override fun get(): StoryFirstTimeNavigationView { - val needsResolve = !resolved() - val view = super.get() - if (needsResolve) { - view.setBlurHash(blurHash) - view.callback = callback - blurHash = null - callback = null - } - - return view - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index cb5f16bec..11cda95b6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -6,11 +6,8 @@ import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList -import android.graphics.RenderEffect -import android.graphics.Shader import android.graphics.drawable.Drawable import android.media.AudioManager -import android.os.Build import android.os.Bundle import android.text.method.ScrollingMovementMethod import android.view.GestureDetector @@ -55,14 +52,12 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectFor import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs import org.thoughtcrime.securesms.database.AttachmentDatabase import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord -import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mediapreview.MediaPreviewFragment import org.thoughtcrime.securesms.mediapreview.VideoControlsDelegate import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet -import org.thoughtcrime.securesms.stories.StoryFirstTimeNavigationView import org.thoughtcrime.securesms.stories.StorySlateView import org.thoughtcrime.securesms.stories.StoryVolumeOverlayView import org.thoughtcrime.securesms.stories.dialogs.StoryContextMenu @@ -97,7 +92,6 @@ class StoryViewerPageFragment : StoryPostFragment.Callback, MultiselectForwardBottomSheet.Callback, StorySlateView.Callback, - StoryFirstTimeNavigationView.Callback, StoryInfoBottomSheetDialogFragment.OnInfoSheetDismissedListener, SafetyNumberBottomSheet.Callbacks { @@ -108,7 +102,7 @@ class StoryViewerPageFragment : private lateinit var viewsAndReplies: MaterialButton private lateinit var storyCaptionContainer: FrameLayout private lateinit var storyContentContainer: FrameLayout - private lateinit var storyFirstTimeNavigationViewStub: StoryFirstNavigationStub + private lateinit var storyPageContainer: ConstraintLayout private lateinit var sendingBarTextView: TextView private lateinit var sendingBar: View @@ -176,17 +170,16 @@ class StoryViewerPageFragment : val storyGradientBottom: View = view.findViewById(R.id.story_gradient_bottom) val storyVolumeOverlayView: StoryVolumeOverlayView = view.findViewById(R.id.story_volume_overlay) + storyPageContainer = view.findViewById(R.id.story_page_container) storyContentContainer = view.findViewById(R.id.story_content_container) storyCaptionContainer = view.findViewById(R.id.story_caption_container) storySlate = view.findViewById(R.id.story_slate) progressBar = view.findViewById(R.id.progress) viewsAndReplies = view.findViewById(R.id.views_and_replies_bar) - storyFirstTimeNavigationViewStub = StoryFirstNavigationStub(view.findViewById(R.id.story_first_time_nav_stub)) sendingBarTextView = view.findViewById(R.id.sending_text_view) sendingBar = view.findViewById(R.id.sending_bar) storySlate.callback = this - storyFirstTimeNavigationViewStub.setCallback(this) chrome = listOf( closeView, @@ -322,6 +315,10 @@ class StoryViewerPageFragment : viewModel.setIsUserScrollingChild(it) } + lifecycleDisposable += sharedViewModel.isFirstTimeNavigationShowing.subscribe { + viewModel.setIsDisplayingFirstTimeNavigation(it) + } + lifecycleDisposable += storyVolumeViewModel.state.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()).subscribe { volumeState -> if (volumeState.isMuted) { videoControlsDelegate.mute() @@ -384,7 +381,6 @@ class StoryViewerPageFragment : presentDate(date, post) presentDistributionList(distributionList, post) presentCaption(caption, largeCaption, largeCaptionOverlay, post) - presentBlur(post) val durations: Map = state.posts .mapIndexed { index, storyPost -> @@ -428,37 +424,20 @@ class StoryViewerPageFragment : resumeProgress() } - val wasDisplayingNavigationView = storyFirstTimeNavigationViewStub.isVisible() - when { state.hideChromeImmediate -> { hideChromeImmediate() storyCaptionContainer.visible = false - storyFirstTimeNavigationViewStub.hide() } state.hideChrome -> { hideChrome() storyCaptionContainer.visible = true - storyFirstTimeNavigationViewStub.showIfAble(!SignalStore.storyValues().userHasSeenFirstNavView) } else -> { showChrome() storyCaptionContainer.visible = true - storyFirstTimeNavigationViewStub.showIfAble(!SignalStore.storyValues().userHasSeenFirstNavView) } } - - val isDisplayingNavigationView = storyFirstTimeNavigationViewStub.isVisible() - if (isDisplayingNavigationView && Build.VERSION.SDK_INT >= 31) { - hideChromeImmediate() - storyContentContainer.setRenderEffect(RenderEffect.createBlurEffect(100f, 100f, Shader.TileMode.CLAMP)) - } else if (Build.VERSION.SDK_INT >= 31) { - storyContentContainer.setRenderEffect(null) - } - - if (wasDisplayingNavigationView xor isDisplayingNavigationView) { - viewModel.setIsDisplayingFirstTimeNavigation(storyFirstTimeNavigationViewStub.isVisible()) - } } timeoutDisposable.bindTo(viewLifecycleOwner) @@ -590,7 +569,7 @@ class StoryViewerPageFragment : card: CardView ) { val constraintSet = ConstraintSet() - constraintSet.clone(requireView() as ConstraintLayout) + constraintSet.clone(storyPageContainer) when (StoryDisplay.getStoryDisplay(resources.displayMetrics.widthPixels.toFloat(), resources.displayMetrics.heightPixels.toFloat())) { StoryDisplay.LARGE -> { @@ -613,7 +592,7 @@ class StoryViewerPageFragment : } } - constraintSet.applyTo(requireView() as ConstraintLayout) + constraintSet.applyTo(storyPageContainer) } private fun resumeProgress() { @@ -781,13 +760,6 @@ class StoryViewerPageFragment : distributionList.visible = storyPost.distributionList != null && !storyPost.distributionList.isMyStory } - private fun presentBlur(storyPost: StoryPost) { - val record = storyPost.conversationMessage.messageRecord as? MediaMmsMessageRecord - val blurHash = record?.slideDeck?.thumbnailSlide?.placeholderBlur - - storyFirstTimeNavigationViewStub.setBlurHash(blurHash) - } - @SuppressLint("SetTextI18n") private fun presentCaption(caption: TextView, largeCaption: TextView, largeCaptionOverlay: View, storyPost: StoryPost) { val displayBody: String = if (storyPost.content is StoryPost.Content.AttachmentContent) { @@ -1284,15 +1256,6 @@ class StoryViewerPageFragment : sharedViewModel.setContentIsReady() } - override fun userHasSeenFirstNavigationView(): Boolean { - return SignalStore.storyValues().userHasSeenFirstNavView - } - - override fun onGotItClicked() { - SignalStore.storyValues().userHasSeenFirstNavView = true - viewModel.setIsDisplayingFirstTimeNavigation(false) - } - override fun onInfoSheetDismissed() { viewModel.setIsDisplayingInfoDialog(false) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt index 321367bcb..2867fe497 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt @@ -24,7 +24,7 @@ data class StoryViewerPlaybackState( val isUserScaling: Boolean = false, val isDisplayingPartialSendDialog: Boolean = false ) { - val hideChromeImmediate: Boolean = isRunningSharedElementAnimation + val hideChromeImmediate: Boolean = isRunningSharedElementAnimation || isDisplayingFirstTimeNavigation val hideChrome: Boolean = isRunningSharedElementAnimation || isUserLongTouching || diff --git a/app/src/main/res/layout/stories_viewer_activity.xml b/app/src/main/res/layout/stories_viewer_activity.xml new file mode 100644 index 000000000..4709947ef --- /dev/null +++ b/app/src/main/res/layout/stories_viewer_activity.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/stories_viewer_fragment_page.xml b/app/src/main/res/layout/stories_viewer_fragment_page.xml index 90a883f6d..d0d968a1a 100644 --- a/app/src/main/res/layout/stories_viewer_fragment_page.xml +++ b/app/src/main/res/layout/stories_viewer_fragment_page.xml @@ -2,6 +2,7 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/story_first_time_navigation_view.xml b/app/src/main/res/layout/story_first_time_navigation_view.xml index 93f60dcf3..39f76eaa9 100644 --- a/app/src/main/res/layout/story_first_time_navigation_view.xml +++ b/app/src/main/res/layout/story_first_time_navigation_view.xml @@ -8,115 +8,95 @@ + android:layout_height="0dp" + android:importantForAccessibility="no" + app:layout_constraintDimensionRatio="9:16" + app:tint="@color/core_white" /> + android:src="@color/transparent_black_80" /> - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" + app:lottie_rawRes="@raw/stories_tap_to_advance" /> - + - + - + - - - - - - + + + app:layout_constraintTop_toBottomOf="@id/edu_swipe_right_label" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/story_viewer_first_time_navigation_stub.xml b/app/src/main/res/layout/story_viewer_first_time_navigation_stub.xml index 3ed0446c9..3d345f1cf 100644 --- a/app/src/main/res/layout/story_viewer_first_time_navigation_stub.xml +++ b/app/src/main/res/layout/story_viewer_first_time_navigation_stub.xml @@ -2,8 +2,5 @@ + android:layout_height="match_parent" /> diff --git a/app/src/main/res/raw/stories_swipe_right.json b/app/src/main/res/raw/stories_swipe_right.json new file mode 100644 index 000000000..681377e4e --- /dev/null +++ b/app/src/main/res/raw/stories_swipe_right.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.0.2","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":60,"w":720,"h":720,"nm":"Swipe right","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360,360,0],"ix":2},"a":{"a":0,"k":[360,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[31.91,0],[0,0],[4.978,-27.079],[0,0],[-40.589,0],[0,0],[0,-44.564],[0,0],[44.183,0],[0,0],[11.973,29.343],[0,0],[-20.744,0],[0,0],[0,32.185],[0,0]],"o":[[0,0],[-28.289,0],[0,0],[5.185,-39.511],[0,0],[44.183,0],[0,0],[0,44.564],[0,0],[-33.41,0],[0,0],[10.191,16.559],[0,0],[31.91,0],[0,0],[0,-32.185]],"v":[[79.652,-237.586],[-80.348,-237.586],[-137.156,-190],[-159.652,-190],[-80.348,-260],[79.652,-260],[159.652,-179.31],[159.652,179.31],[79.652,260],[-80.348,260],[-154.358,210],[-129.474,210],[-80.348,237.586],[79.652,237.586],[137.43,179.31],[137.43,-179.31]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.347,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[100]},{"t":27,"s":[0]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[322,358,0],"to":[0,0,0],"ti":[-11.12,0,0]},{"t":27,"s":[374.427,358,0]}],"ix":2},"a":{"a":0,"k":[360,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[58.665,-19.652],[0.331,-77.997],[-58.665,-19.703],[-44.612,-5.477],[-12.741,-36.965],[-9.71,-41.204],[-9.71,77.997],[10.29,77.997],[10.29,-41.197],[13.905,-36.132],[44.52,-5.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[363.582,354.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[37]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[-19]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[-13]},{"t":31,"s":[37]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[186,430,0],"to":[-5.333,0,0],"ti":[5.333,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":13,"s":[154,430,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[154,430,0],"to":[5.333,0,0],"ti":[-5.333,0,0]},{"t":31,"s":[186,430,0]}],"ix":2},"a":{"a":0,"k":[-24,129,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.678,3.37],[2.156,11.396],[4.199,29.116],[0,0],[2.323,1.938],[2.993,-0.389],[-0.811,-8.137],[-0.01,-0.166],[-0.441,-22.604],[-0.719,-9.969],[-5.265,-27.199],[-14.232,-19.498],[-29.41,-10.98],[-19.082,2.721],[-12.082,10.174],[-8.059,18.936],[-0.235,0.551],[-7.073,16.348],[-2.163,4.983],[0,0],[0,0],[-11.709,-5.094],[0,0],[-0.047,0.1],[0,0],[1.707,4.295],[4.293,1.851],[4.345,-1.727],[1.851,-4.293],[0.613,-0.807],[0,0],[6.478,2.787],[-2.786,6.478],[0,0],[0,0],[1.74,4.334],[4.3,1.836],[4.339,-1.742],[1.835,-4.3],[0.468,-0.684],[0,0],[6.455,2.839],[-2.839,6.456],[0,0],[-0.033,2.302],[0.855,2.151],[1.613,1.66],[2.126,0.916],[2.314,0.033],[2.152,-0.855],[1.661,-1.613],[0.917,-2.126],[0.433,-0.645],[0,0],[6.486,2.769],[-2.769,6.486],[0,0],[0,0],[-0.034,2.315],[0.854,2.151],[1.613,1.66],[2.125,0.917],[2.315,0.033],[2.151,-0.855],[1.66,-1.613],[0.917,-2.121],[0,0],[0,0],[0.057,-0.122],[0,0],[5.46,0.629],[1.13,5.379]],"o":[[-12.496,2.627],[0,0],[0,0],[-0.375,-1.822],[-1.357,-6.741],[-4.308,-22.769],[0,0],[-1.134,-8.366],[-2.325,-1.94],[-6.366,0.83],[0.016,0.165],[1.385,22.937],[0.198,10.154],[2.148,29.786],[5.253,27.141],[14.116,19.339],[30.027,11.209],[18.997,-2.709],[23.978,-20.192],[0.243,-0.57],[7.846,-18.401],[3.537,-8.176],[0,0],[0,0],[0,0],[0,0],[0.044,-0.101],[0,0],[1.79,-4.256],[-1.727,-4.344],[-4.293,-1.852],[-4.344,1.726],[-0.42,0.972],[0,0],[-2.786,6.478],[-6.478,-2.786],[0,0],[0,0],[1.83,-4.296],[-1.743,-4.339],[-4.301,-1.836],[-4.339,1.743],[-0.338,0.792],[0,0],[-2.84,6.455],[-6.455,-2.84],[0,0],[0.906,-2.115],[0.034,-2.314],[-0.855,-2.151],[-1.613,-1.66],[-2.125,-0.917],[-2.315,-0.034],[-2.151,0.855],[-1.66,1.613],[-0.319,0.738],[0,0],[-2.769,6.486],[-6.485,-2.769],[0,0],[0,0],[0.916,-2.126],[0.033,-2.314],[-0.855,-2.151],[-1.613,-1.66],[-2.126,-0.917],[-2.314,-0.033],[-2.151,0.855],[-1.658,1.61],[0,0],[0,0],[-0.053,0.125],[0,0],[-2.323,4.981],[-5.46,-0.628],[0,0]],"v":[[-93.87,18.612],[-106.366,21.237],[-106.519,20.506],[-106.951,18.419],[-108.549,10.566],[-113.957,-17.156],[-127.833,-99.135],[-127.848,-99.243],[-134.246,-113.665],[-142.404,-115.946],[-153.467,-101.525],[-153.427,-101.029],[-151.147,-32.229],[-150.477,-2.251],[-142.551,86.988],[-114.433,157.294],[-50.787,203.534],[22.241,214.306],[68.3,193.646],[112.863,125.085],[113.579,123.402],[137.535,67.695],[146.282,47.509],[149.711,39.617],[149.722,39.591],[161.435,44.676],[149.722,39.591],[149.862,39.28],[153.99,30.427],[154.122,17.085],[144.721,7.409],[131.231,7.214],[121.555,16.615],[119.997,19.288],[101.757,61.694],[84.982,68.378],[78.297,51.603],[110.283,-22.76],[110.289,-22.775],[110.429,-36.253],[100.991,-45.897],[87.498,-46.043],[77.854,-36.605],[76.639,-34.39],[49.106,28.203],[32.276,34.75],[25.729,17.92],[66.437,-74.622],[67.86,-81.312],[66.616,-88.076],[62.878,-93.849],[57.215,-97.752],[50.49,-99.191],[43.725,-97.947],[37.952,-94.209],[34.049,-88.546],[32.918,-86.47],[-5.951,4.578],[-22.709,11.308],[-29.439,-5.449],[50.103,-191.77],[50.122,-191.813],[51.561,-198.538],[50.317,-205.302],[46.578,-211.076],[40.916,-214.979],[34.19,-216.418],[27.426,-215.174],[21.653,-211.436],[17.754,-205.784],[17.749,-205.773],[-61.981,-19.576],[-62.146,-19.206],[-82.297,24.009],[-95.33,31.297],[-106.366,21.237]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[0,1],[1,1],[1,0]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[0,1],[1,1],[1,0]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.205,-2.245],[-3.949,-4.066],[-2.093,-5.268],[0.082,-5.668],[2.238,-5.198],[0,0],[0,0],[-0.538,-0.007],[-5.205,-2.244],[-3.95,-4.066],[-2.093,-5.268],[0.082,-5.668],[0.552,-2.666],[-5.899,-2.519],[-4.267,-10.624],[2.097,-8.672],[-5.986,-2.581],[-4.228,-10.639],[4.533,-10.513],[0.052,-0.113],[0,0],[0,0],[3.532,-8.165],[7.819,-18.34],[0.364,-0.86],[28.77,-24.227],[24.255,-3.458],[33.124,12.365],[17.277,23.67],[5.693,29.412],[0,0],[0.201,10.287],[1.343,22.333],[-18.378,2.394],[-8.272,-6.901],[-1.794,-13.156],[-4.26,-22.535],[0,0],[0,0],[0,0],[-4.065,3.95],[-5.268,2.093],[-5.668,-0.082]],"o":[[5.206,2.245],[3.95,4.066],[2.094,5.268],[-0.082,5.659],[0,0],[0,0],[0.537,-0.012],[5.668,0.082],[5.205,2.245],[3.95,4.065],[2.093,5.268],[-0.04,2.736],[6.29,-0.227],[10.529,4.495],[3.369,8.389],[6.391,-0.254],[10.512,4.534],[4.227,10.639],[-0.05,0.114],[0,0],[0,0],[-2.16,4.976],[-7.067,16.333],[-0.337,0.79],[-7.9,18.629],[-15.316,12.898],[-24.169,3.447],[-33.741,-12.596],[-17.161,-23.511],[-5.681,-29.354],[0,0],[-0.433,-22.263],[-2.177,-23.284],[9.415,-1.227],[8.262,6.894],[4.105,28.455],[0,0],[0,0],[0,0],[2.245,-5.205],[4.066,-3.95],[5.268,-2.093],[5.668,0.082]],"v":[[50.528,-238.929],[64.395,-229.371],[73.549,-215.234],[76.596,-198.669],[73.083,-182.225],[73.072,-182.2],[48.747,-125.22],[50.359,-125.227],[66.828,-121.703],[80.695,-112.144],[89.849,-98.007],[92.896,-81.443],[92.005,-73.323],[110.518,-69.884],[133.627,-46.271],[135.528,-20.036],[154.334,-16.542],[177.355,7.154],[176.878,40.188],[176.725,40.528],[172.577,49.423],[169.209,57.177],[160.474,77.335],[136.571,132.918],[135.52,135.394],[84.25,212.68],[25.346,239.088],[-60.218,226.959],[-135.561,171.85],[-168.124,91.341],[-176.505,-2.031],[-177.195,-32.873],[-179.405,-99.763],[-146.203,-141.769],[-118.386,-133.775],[-103.049,-103.23],[-89.423,-22.711],[-85.877,-30.315],[-6.214,-216.355],[-6.201,-216.386],[3.357,-230.253],[17.495,-239.406],[34.059,-242.453]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/raw/stories_swipe_up.json b/app/src/main/res/raw/stories_swipe_up.json new file mode 100644 index 000000000..bffef098d --- /dev/null +++ b/app/src/main/res/raw/stories_swipe_up.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.0.2","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":60,"w":720,"h":720,"nm":"Swipe up","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360,360,0],"ix":2},"a":{"a":0,"k":[360,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[312,280],[313.815,1487.646],[1000,1500],[963.695,292.354]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[31.91,0],[0,0],[0,-32.185],[0,0],[-31.91,0],[0,0],[0,0],[0,0],[0,44.564],[0,0],[-44.183,0],[0,0],[0,-44.564],[0,0],[0,0],[0,0]],"o":[[0,0],[-31.91,0],[0,0],[0,32.185],[0,0],[0,0],[0,0],[-44.183,0],[0,0],[0,-44.564],[0,0],[44.183,0],[0,0],[0,0],[0,0],[0,-32.185]],"v":[[80,-237.586],[-80,-237.586],[-137.778,-179.31],[-137.778,179.31],[-80,237.586],[-23.582,237.586],[-23.582,260],[-80,260],[-160,179.31],[-160,-179.31],[-80,-260],[80,-260],[160,-179.31],[160,10],[137.778,10],[137.778,-179.31]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[360,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[100]},{"t":28,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[360,400,0],"to":[0,-23.466,0],"ti":[0,38.337,0]},{"t":25,"s":[360,224.784,0]}],"ix":2},"a":{"a":0,"k":[360,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[58.665,-19.652],[0.331,-77.997],[-58.665,-19.703],[-44.612,-5.477],[-12.741,-36.965],[-9.71,-41.204],[-9.71,77.997],[10.29,77.997],[10.29,-41.197],[13.905,-36.132],[44.52,-5.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[363.582,354.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-44]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[-119]},{"t":28,"s":[-44]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[513.143,517.484,0],"to":[0,0,0],"ti":[1.92,2.071,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[577.52,526.005,0],"to":[-7.973,-8.601,0],"ti":[0,0,0]},{"t":28,"s":[513.143,517.484,0]}],"ix":2},"a":{"a":0,"k":[-33,115,0],"ix":1},"s":{"a":0,"k":[66,66,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.678,3.37],[2.156,11.396],[4.199,29.116],[0,0],[2.323,1.938],[2.993,-0.389],[-0.811,-8.137],[-0.01,-0.166],[-0.441,-22.604],[-0.719,-9.969],[-5.265,-27.199],[-14.232,-19.498],[-29.41,-10.98],[-19.082,2.721],[-12.082,10.174],[-8.059,18.936],[-0.235,0.551],[-7.073,16.348],[-2.163,4.983],[0,0],[0,0],[-11.709,-5.094],[0,0],[-0.047,0.1],[0,0],[1.707,4.295],[4.293,1.851],[4.345,-1.727],[1.851,-4.293],[0.613,-0.807],[0,0],[6.478,2.787],[-2.786,6.478],[0,0],[0,0],[1.74,4.334],[4.3,1.836],[4.339,-1.742],[1.835,-4.3],[0.468,-0.684],[0,0],[6.455,2.839],[-2.839,6.456],[0,0],[-0.033,2.302],[0.855,2.151],[1.613,1.66],[2.126,0.916],[2.314,0.033],[2.152,-0.855],[1.661,-1.613],[0.917,-2.126],[0.433,-0.645],[0,0],[6.486,2.769],[-2.769,6.486],[0,0],[0,0],[-0.034,2.315],[0.854,2.151],[1.613,1.66],[2.125,0.917],[2.315,0.033],[2.151,-0.855],[1.66,-1.613],[0.917,-2.121],[0,0],[0,0],[0.057,-0.122],[0,0],[5.46,0.629],[1.13,5.379]],"o":[[-12.496,2.627],[0,0],[0,0],[-0.375,-1.822],[-1.357,-6.741],[-4.308,-22.769],[0,0],[-1.134,-8.366],[-2.325,-1.94],[-6.366,0.83],[0.016,0.165],[1.385,22.937],[0.198,10.154],[2.148,29.786],[5.253,27.141],[14.116,19.339],[30.027,11.209],[18.997,-2.709],[23.978,-20.192],[0.243,-0.57],[7.846,-18.401],[3.537,-8.176],[0,0],[0,0],[0,0],[0,0],[0.044,-0.101],[0,0],[1.79,-4.256],[-1.727,-4.344],[-4.293,-1.852],[-4.344,1.726],[-0.42,0.972],[0,0],[-2.786,6.478],[-6.478,-2.786],[0,0],[0,0],[1.83,-4.296],[-1.743,-4.339],[-4.301,-1.836],[-4.339,1.743],[-0.338,0.792],[0,0],[-2.84,6.455],[-6.455,-2.84],[0,0],[0.906,-2.115],[0.034,-2.314],[-0.855,-2.151],[-1.613,-1.66],[-2.125,-0.917],[-2.315,-0.034],[-2.151,0.855],[-1.66,1.613],[-0.319,0.738],[0,0],[-2.769,6.486],[-6.485,-2.769],[0,0],[0,0],[0.916,-2.126],[0.033,-2.314],[-0.855,-2.151],[-1.613,-1.66],[-2.126,-0.917],[-2.314,-0.033],[-2.151,0.855],[-1.658,1.61],[0,0],[0,0],[-0.053,0.125],[0,0],[-2.323,4.981],[-5.46,-0.628],[0,0]],"v":[[-93.87,18.612],[-106.366,21.237],[-106.519,20.506],[-106.951,18.419],[-108.549,10.566],[-113.957,-17.156],[-127.833,-99.135],[-127.848,-99.243],[-134.246,-113.665],[-142.404,-115.946],[-153.467,-101.525],[-153.427,-101.029],[-151.147,-32.229],[-150.477,-2.251],[-142.551,86.988],[-114.433,157.294],[-50.787,203.534],[22.241,214.306],[68.3,193.646],[112.863,125.085],[113.579,123.402],[137.535,67.695],[146.282,47.509],[149.711,39.617],[149.722,39.591],[161.435,44.676],[149.722,39.591],[149.862,39.28],[153.99,30.427],[154.122,17.085],[144.721,7.409],[131.231,7.214],[121.555,16.615],[119.997,19.288],[101.757,61.694],[84.982,68.378],[78.297,51.603],[110.283,-22.76],[110.289,-22.775],[110.429,-36.253],[100.991,-45.897],[87.498,-46.043],[77.854,-36.605],[76.639,-34.39],[49.106,28.203],[32.276,34.75],[25.729,17.92],[66.437,-74.622],[67.86,-81.312],[66.616,-88.076],[62.878,-93.849],[57.215,-97.752],[50.49,-99.191],[43.725,-97.947],[37.952,-94.209],[34.049,-88.546],[32.918,-86.47],[-5.951,4.578],[-22.709,11.308],[-29.439,-5.449],[50.103,-191.77],[50.122,-191.813],[51.561,-198.538],[50.317,-205.302],[46.578,-211.076],[40.916,-214.979],[34.19,-216.418],[27.426,-215.174],[21.653,-211.436],[17.754,-205.784],[17.749,-205.773],[-61.981,-19.576],[-62.146,-19.206],[-82.297,24.009],[-95.33,31.297],[-106.366,21.237]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.205,-2.245],[-3.949,-4.066],[-2.093,-5.268],[0.082,-5.668],[2.238,-5.198],[0,0],[0,0],[-0.538,-0.007],[-5.205,-2.244],[-3.95,-4.066],[-2.093,-5.268],[0.082,-5.668],[0.552,-2.666],[-5.899,-2.519],[-4.267,-10.624],[2.097,-8.672],[-5.986,-2.581],[-4.228,-10.639],[4.533,-10.513],[0.052,-0.113],[0,0],[0,0],[3.532,-8.165],[7.819,-18.34],[0.364,-0.86],[28.77,-24.227],[24.255,-3.458],[33.124,12.365],[17.277,23.67],[5.693,29.412],[0,0],[0.201,10.287],[1.343,22.333],[-18.378,2.394],[-8.272,-6.901],[-1.794,-13.156],[-4.26,-22.535],[0,0],[0,0],[0,0],[-4.065,3.95],[-5.268,2.093],[-5.668,-0.082]],"o":[[5.206,2.245],[3.95,4.066],[2.094,5.268],[-0.082,5.659],[0,0],[0,0],[0.537,-0.012],[5.668,0.082],[5.205,2.245],[3.95,4.065],[2.093,5.268],[-0.04,2.736],[6.29,-0.227],[10.529,4.495],[3.369,8.389],[6.391,-0.254],[10.512,4.534],[4.227,10.639],[-0.05,0.114],[0,0],[0,0],[-2.16,4.976],[-7.067,16.333],[-0.337,0.79],[-7.9,18.629],[-15.316,12.898],[-24.169,3.447],[-33.741,-12.596],[-17.161,-23.511],[-5.681,-29.354],[0,0],[-0.433,-22.263],[-2.177,-23.284],[9.415,-1.227],[8.262,6.894],[4.105,28.455],[0,0],[0,0],[0,0],[2.245,-5.205],[4.066,-3.95],[5.268,-2.093],[5.668,0.082]],"v":[[50.528,-238.929],[64.395,-229.371],[73.549,-215.234],[76.596,-198.669],[73.083,-182.225],[73.072,-182.2],[48.747,-125.22],[50.359,-125.227],[66.828,-121.703],[80.695,-112.144],[89.849,-98.007],[92.896,-81.443],[92.005,-73.323],[110.518,-69.884],[133.627,-46.271],[135.528,-20.036],[154.334,-16.542],[177.355,7.154],[176.878,40.188],[176.725,40.528],[172.577,49.423],[169.209,57.177],[160.474,77.335],[136.571,132.918],[135.52,135.394],[84.25,212.68],[25.346,239.088],[-60.218,226.959],[-135.561,171.85],[-168.124,91.341],[-176.505,-2.031],[-177.195,-32.873],[-179.405,-99.763],[-146.203,-141.769],[-118.386,-133.775],[-103.049,-103.23],[-89.423,-22.711],[-85.877,-30.315],[-6.214,-216.355],[-6.201,-216.386],[3.357,-230.253],[17.495,-239.406],[34.059,-242.453]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/raw/stories_tap_to_advance.json b/app/src/main/res/raw/stories_tap_to_advance.json new file mode 100644 index 000000000..0f9bbfbc0 --- /dev/null +++ b/app/src/main/res/raw/stories_tap_to_advance.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.0.2","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":60,"w":720,"h":720,"nm":"Tap to advance","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.929]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[-3]},"o":{"x":[0.167],"y":[-12]},"t":3,"s":[-18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.04]},"t":31,"s":[-18]},{"t":36,"s":[0]}],"ix":10},"p":{"a":0,"k":[360,362,0],"ix":2},"a":{"a":0,"k":[280,280,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.978,0.978,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[-4.6,-4.6,1]},"o":{"x":[0.167,0.167,0.167],"y":[-6.087,-6.087,0]},"t":3,"s":[70,70,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.033,0.033,0]},"t":31,"s":[70,70,100]},{"t":36,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.057,3.999],[1.477,3.717],[2.787,2.869],[3.672,1.584],[3.999,0.058],[3.716,-1.477],[2.868,-2.786],[1.585,-3.672],[0,0],[0,0],[8.339,57.822],[-3.151,-31.623],[-126.535,-47.237],[-15.694,36.81],[0,0],[0,0],[2.983,7.506],[7.417,3.198],[7.505,-2.982],[3.198,-7.417]],"o":[[0,0],[1.584,-3.672],[0.059,-3.999],[-1.477,-3.716],[-2.786,-2.868],[-3.673,-1.583],[-3.998,-0.058],[-3.716,1.476],[-2.868,2.787],[0,0],[0,0],[0,0],[-5.851,-43.179],[7.985,132.183],[126.536,47.237],[15.694,-36.809],[0,0],[3.198,-7.416],[-2.983,-7.505],[-7.416,-3.198],[-7.506,2.984],[0,0]],"v":[[-11.421,-17.168],[68.267,-203.833],[70.753,-215.452],[68.604,-227.138],[62.146,-237.112],[52.364,-243.855],[40.744,-246.341],[29.059,-244.191],[19.085,-237.734],[12.341,-227.951],[-67.549,-41.38],[-87.737,1.914],[-109.101,-117.876],[-160.173,-117.176],[-49.049,199.162],[131.863,111.915],[168.039,28.027],[172.265,18.965],[172.601,-4.34],[156.36,-21.057],[133.056,-21.394],[116.339,-5.152]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[273.321,296.194],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.01,7.495],[7.429,3.171],[7.495,-3.011],[3.172,-7.428]],"o":[[0,0],[3.172,-7.428],[-3.011,-7.496],[-7.429,-3.172],[-7.495,3.01],[0,0]],"v":[[-5.679,58.881],[26.379,-15.651],[26.631,-38.959],[10.327,-55.618],[-12.981,-55.87],[-29.641,-39.567]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[375.5,277.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.058,3.998],[1.477,3.717],[2.787,2.867],[3.672,1.584],[3.998,0.058],[3.716,-1.477],[2.869,-2.786],[1.584,-3.672]],"o":[[0,0],[1.584,-3.672],[0.057,-3.999],[-1.477,-3.716],[-2.787,-2.869],[-3.672,-1.584],[-4,-0.058],[-3.715,1.476],[-2.867,2.787],[0,0]],"v":[[-14.113,67.664],[26.691,-25.098],[29.178,-36.717],[27.028,-48.403],[20.57,-58.376],[10.787,-65.12],[-0.831,-67.606],[-12.518,-65.456],[-22.492,-58.999],[-29.235,-49.216]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[331.226,234.902],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[169.311,379.353,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[149.273,149.273],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":27,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.637,-173.363],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":4,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":24,"s":[100,100]},{"t":36,"s":[120,120]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[100]},{"t":36,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":50,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":91,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":1800,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/values/signal_styles.xml b/app/src/main/res/values/signal_styles.xml index adbb1b95c..43970deb1 100644 --- a/app/src/main/res/values/signal_styles.xml +++ b/app/src/main/res/values/signal_styles.xml @@ -212,7 +212,7 @@ - + diff --git a/app/src/test/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationViewTest.kt b/app/src/test/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationViewTest.kt index e5bb23ba0..0697c7b2e 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationViewTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationViewTest.kt @@ -117,6 +117,7 @@ class StoryFirstTimeNavigationViewTest { testSubject.callback = object : StoryFirstTimeNavigationView.Callback { override fun userHasSeenFirstNavigationView(): Boolean = true override fun onGotItClicked() = error("Unused") + override fun onCloseClicked() = error("Unused") } testSubject.setBlurHash(BlurHash.parseOrNull("0000")!!) @@ -150,6 +151,7 @@ class StoryFirstTimeNavigationViewTest { testSubject.callback = object : StoryFirstTimeNavigationView.Callback { override fun userHasSeenFirstNavigationView(): Boolean = true override fun onGotItClicked() = error("Unused") + override fun onCloseClicked() = error("Unused") } testSubject.show()