Fix various bugs with KitKat preventing stories from launching.

This commit is contained in:
Alex Hart 2022-10-28 12:31:53 -03:00
parent a066271766
commit e369f56eab
9 changed files with 35 additions and 25 deletions

View file

@ -3,15 +3,14 @@ package org.thoughtcrime.securesms.animation.transitions
import android.animation.Animator
import android.animation.ValueAnimator
import android.content.Context
import android.transition.Transition
import android.transition.TransitionValues
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.view.ViewCompat
import androidx.transition.Transition
import androidx.transition.TransitionValues
import com.google.android.material.floatingactionbutton.FloatingActionButton
@RequiresApi(21)
class FabElevationFadeTransform(context: Context, attrs: AttributeSet?) : Transition(context, attrs) {
class FabElevationFadeTransform(context: Context, attrs: AttributeSet) : Transition(context, attrs) {
companion object {
private const val ELEVATION = "CrossfaderTransition.ELEVATION"
@ -19,23 +18,23 @@ class FabElevationFadeTransform(context: Context, attrs: AttributeSet?) : Transi
override fun captureStartValues(transitionValues: TransitionValues) {
if (transitionValues.view is FloatingActionButton) {
transitionValues.values[ELEVATION] = transitionValues.view.elevation
transitionValues.values[ELEVATION] = ViewCompat.getElevation(transitionValues.view)
}
}
override fun captureEndValues(transitionValues: TransitionValues) {
if (transitionValues.view is FloatingActionButton) {
transitionValues.values[ELEVATION] = transitionValues.view.elevation
transitionValues.values[ELEVATION] = ViewCompat.getElevation(transitionValues.view)
}
}
override fun createAnimator(sceneRoot: ViewGroup?, startValues: TransitionValues?, endValues: TransitionValues?): Animator? {
override fun createAnimator(sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues?): Animator? {
if (startValues?.view !is FloatingActionButton || endValues?.view !is FloatingActionButton) {
return null
}
val startElevation = startValues.view.elevation
val endElevation = endValues.view.elevation
val startElevation = ViewCompat.getElevation(startValues.view)
val endElevation = ViewCompat.getElevation(endValues.view)
if (startElevation == endElevation) {
return null
}
@ -46,7 +45,7 @@ class FabElevationFadeTransform(context: Context, attrs: AttributeSet?) : Transi
).apply {
addUpdateListener {
val elevation = it.animatedValue as Float
endValues.view.elevation = elevation
ViewCompat.setElevation(endValues.view, elevation)
}
}
}

View file

@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.ActionMenuView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.children
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@ -108,6 +109,9 @@ class MainActivityListHostFragment : Fragment(R.layout.main_activity_list_host_f
val cameraFab = requireView().findViewById<View>(R.id.camera_fab)
val newConvoFab = requireView().findViewById<View>(R.id.fab)
ViewCompat.setTransitionName(cameraFab, "camera_fab")
ViewCompat.setTransitionName(newConvoFab, "new_convo_fab")
val extras: Navigator.Extras? = if (cameraFab == null || newConvoFab == null) {
null
} else {

View file

@ -4,7 +4,6 @@ import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.transition.TransitionInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
@ -16,6 +15,7 @@ import androidx.core.app.SharedElementCallback
import androidx.core.view.ViewCompat
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.transition.TransitionInflater
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
@ -129,6 +129,10 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
lifecycleDisposable.bindTo(viewLifecycleOwner)
emptyNotice = requireView().findViewById(R.id.empty_notice)
cameraFab = requireView().findViewById(R.id.camera_fab)
val sharedElementTarget: View = requireView().findViewById(R.id.camera_fab_shared_element_target)
ViewCompat.setTransitionName(cameraFab, "new_convo_fab")
ViewCompat.setTransitionName(sharedElementTarget, "camera_fab")
sharedElementEnterTransition = TransitionInflater.from(requireContext()).inflateTransition(R.transition.change_transform_fabs)
setEnterSharedElementCallback(object : SharedElementCallback() {
@ -139,6 +143,7 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy {
cameraFab.setImageResource(R.drawable.ic_camera_outline_24)
sharedElementTarget.alpha = 0f
}
}
}

View file

@ -7,6 +7,7 @@ import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
@ -116,6 +117,7 @@ object StoriesLandingItem {
private val badgeView: BadgeImageView = itemView.findViewById(R.id.badge)
private val storyPreview: ImageView = itemView.findViewById<ImageView>(R.id.story).apply {
isClickable = false
ViewCompat.setTransitionName(this, "story")
}
private val storyBlur: ImageView = itemView.findViewById<ImageView>(R.id.story_blur).apply {
isClickable = false

View file

@ -6,6 +6,7 @@ import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.core.app.ActivityCompat
import androidx.core.view.ViewCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.viewpager2.widget.ViewPager2
@ -51,6 +52,7 @@ class StoryViewerFragment :
storyCrossfader = view.findViewById(R.id.story_content_crossfader)
storyPager = view.findViewById(R.id.story_item_pager)
ViewCompat.setTransitionName(storyCrossfader, "story")
storyCrossfader.callback = this
val adapter = StoryViewerPagerAdapter(

View file

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.stories.viewer
import android.os.Build
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
@ -30,7 +31,7 @@ class StoryViewerViewModel(
storyViewerArgs.storyThumbUri != null -> StoryViewerState.CrossfadeSource.ImageUri(storyViewerArgs.storyThumbUri, storyViewerArgs.storyThumbBlur)
else -> StoryViewerState.CrossfadeSource.None
},
skipCrossfade = storyViewerArgs.isFromNotification || storyViewerArgs.isFromQuote
skipCrossfade = storyViewerArgs.isFromNotification || storyViewerArgs.isFromQuote || Build.VERSION.SDK_INT < 21
)
)

View file

@ -10,6 +10,7 @@ import android.view.WindowManager
import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.stories.StoryFirstTimeNavigationView
@ -51,7 +52,7 @@ class StoryFirstTimeNavigationFragment : DialogFragment(R.layout.story_viewer_fi
view.callback = this
viewModel.setIsDisplayingFirstTimeNavigation(true)
disposables += viewModel.state.subscribe { state ->
disposables += viewModel.state.observeOn(AndroidSchedulers.mainThread()).subscribe { state ->
when (state.crossfadeSource) {
is StoryViewerState.CrossfadeSource.ImageUri -> {
view.setBlurHash(state.crossfadeSource.imageBlur)

View file

@ -7,6 +7,8 @@ import android.view.ViewGroup;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import java.util.function.Function;

View file

@ -1,11 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,12m-10.5,0a10.5,10.5 0,1 1,21 0a10.5,10.5 0,1 1,-21 0"
android:strokeWidth="3"
android:fillColor="@color/signal_colorPrimary"
android:strokeColor="@color/signal_colorBackground"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/signal_colorPrimary" />
<stroke android:color="@color/signal_colorOnPrimary" android:width="3dp" />
</shape>