From afd820054045b2628cdb59b0013c4f5bfda512da Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 19 Jun 2022 15:55:38 +0300 Subject: [PATCH] Add material fab transition --- .../koitharu/kotatsu/main/ui/MainActivity.kt | 24 +++++++++++++++-- .../kotatsu/reader/ui/ReaderActivity.kt | 26 +++++++++++++++++++ app/src/main/res/anim/fragment_fade_in.xml | 6 +++++ app/src/main/res/anim/fragment_fade_out.xml | 6 +++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/anim/fragment_fade_in.xml create mode 100644 app/src/main/res/anim/fragment_fade_out.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 55cd36559..99eea6634 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.MenuItem import android.view.View import android.view.ViewGroup.MarginLayoutParams +import android.view.Window import androidx.activity.result.ActivityResultCallback import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.view.ActionMode @@ -24,6 +25,7 @@ import com.google.android.material.appbar.AppBarLayout.LayoutParams.* import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar +import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.koin.android.ext.android.get @@ -84,6 +86,11 @@ class MainActivity : get() = binding.appbar override fun onCreate(savedInstanceState: Bundle?) { + + window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) + setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback()) + window.sharedElementsUseOverlay = false + super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater)) navHeaderBinding = NavigationHeaderBinding.inflate(layoutInflater) @@ -319,8 +326,20 @@ class MainActivity : } private fun onOpenReader(manga: Manga) { - val options = ActivityOptions.makeScaleUpAnimation(binding.fab, 0, 0, binding.fab.width, binding.fab.height) - startActivity(ReaderActivity.newIntent(this, manga), options?.toBundle()) + apply { + val intent = ReaderActivity.newIntent(this, manga) + val options = ActivityOptions.makeSceneTransitionAnimation( + this, + binding.fab, + ReaderActivity.SHARED_ELEMENT_NAME + ) + startActivity( + intent.apply { + putExtra(ReaderActivity.EXTRA_IS_TRANSITION, true) + }, + options.toBundle() + ) + } } private fun onError(e: Throwable) { @@ -388,6 +407,7 @@ class MainActivity : private fun setPrimaryFragment(fragment: Fragment) { supportFragmentManager.beginTransaction() + .setCustomAnimations(R.anim.fragment_fade_in, R.anim.fragment_fade_out) .replace(R.id.container, fragment, TAG_PRIMARY) .commit() adjustFabVisibility(topFragment = fragment) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index e4a29b948..cddd4d931 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -19,6 +19,8 @@ import androidx.transition.TransitionManager import androidx.transition.TransitionSet import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar +import com.google.android.material.transition.platform.MaterialContainerTransform +import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -79,6 +81,21 @@ class ReaderActivity : private val hideUiRunnable = Runnable { setUiIsVisible(false) } override fun onCreate(savedInstanceState: Bundle?) { + + // Setup shared element transitions + if (intent.extras?.getBoolean(EXTRA_IS_TRANSITION) == true) { + window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) + findViewById(android.R.id.content)?.let { contentView -> + contentView.transitionName = SHARED_ELEMENT_NAME + setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback()) + window.sharedElementEnterTransition = buildContainerTransform(true) + window.sharedElementReturnTransition = buildContainerTransform(false) + + // Postpone custom transition until manga ready + postponeEnterTransition() + } + } + super.onCreate(savedInstanceState) setContentView(ActivityReaderBinding.inflate(layoutInflater)) readerManager = ReaderManager(supportFragmentManager, R.id.container) @@ -113,6 +130,12 @@ class ReaderActivity : } } + private fun buildContainerTransform(entering: Boolean): MaterialContainerTransform { + return MaterialContainerTransform(this, entering).apply { + addTarget(android.R.id.content) + } + } + private fun onInitReader(mode: ReaderMode) { if (readerManager.currentMode != mode) { readerManager.replace(mode) @@ -129,6 +152,7 @@ class ReaderActivity : if (binding.appbarTop.isVisible) { lifecycle.postDelayed(hideUiRunnable, TimeUnit.SECONDS.toMillis(1)) } + startPostponedEnterTransition() } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -393,6 +417,8 @@ class ReaderActivity : companion object { + const val SHARED_ELEMENT_NAME = "reader_shared_element_root" + const val EXTRA_IS_TRANSITION = "${BuildConfig.APPLICATION_ID}.READER_IS_TRANSITION" const val ACTION_MANGA_READ = "${BuildConfig.APPLICATION_ID}.action.READ_MANGA" private const val EXTRA_STATE = "state" private const val EXTRA_BRANCH = "branch" diff --git a/app/src/main/res/anim/fragment_fade_in.xml b/app/src/main/res/anim/fragment_fade_in.xml new file mode 100644 index 000000000..acb538bce --- /dev/null +++ b/app/src/main/res/anim/fragment_fade_in.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/fragment_fade_out.xml b/app/src/main/res/anim/fragment_fade_out.xml new file mode 100644 index 000000000..1d4a9662b --- /dev/null +++ b/app/src/main/res/anim/fragment_fade_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file