From a4ae81857a7eb84d019ea7855b24ba9fe69fbf50 Mon Sep 17 00:00:00 2001 From: Andrey Kulikov Date: Wed, 31 Oct 2018 14:57:22 +0000 Subject: [PATCH] Make transitions Scene.getCurrentScene() public I pretty sure the getter method Scene.getCurrentScene() should be promoted to be public. This method is the only option for developers to understand is the sceneRoot already in the scene they need. Otherwise they have to introduce their own states and sync it with all scene changes which is more error-prone. To make it simpler to developers we can just make the method public. As an example of usage: void displayMessages(List messages) { if (!messages.isEmpty()) { if (Scene.getCurrentScene(root) != messagesScene) { TransitionManager.go(messagesScene); MyAnalytics.trackDisplayMessages(); (... more initialization ... ) } messagesView.display(messages); } } Test: added a cts test for getCurrentScene Change in AndroidX: aosp/807055 Bug: 118720709 Change-Id: Ic90e3576a82b5ab9a88e38e396efd49875968011 --- api/current.txt | 1 + core/java/android/transition/Scene.java | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/api/current.txt b/api/current.txt index ae7270dc7e019..92c1a782d43cc 100755 --- a/api/current.txt +++ b/api/current.txt @@ -45841,6 +45841,7 @@ package android.transition { ctor public deprecated Scene(android.view.ViewGroup, android.view.ViewGroup); method public void enter(); method public void exit(); + method public static android.transition.Scene getCurrentScene(android.view.View); method public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context); method public android.view.ViewGroup getSceneRoot(); method public void setEnterAction(java.lang.Runnable); diff --git a/core/java/android/transition/Scene.java b/core/java/android/transition/Scene.java index 1bdcff98ff17c..7e499f29122ad 100644 --- a/core/java/android/transition/Scene.java +++ b/core/java/android/transition/Scene.java @@ -16,6 +16,8 @@ package android.transition; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.util.SparseArray; @@ -196,22 +198,24 @@ public final class Scene { * information is used by Scene to determine whether there is a previous * scene which should be exited before the new scene is entered. * - * @param view The view on which the current scene is being set + * @param sceneRoot The view on which the current scene is being set */ @UnsupportedAppUsage - static void setCurrentScene(View view, Scene scene) { - view.setTagInternal(com.android.internal.R.id.current_scene, scene); + static void setCurrentScene(@NonNull View sceneRoot, @Nullable Scene scene) { + sceneRoot.setTagInternal(com.android.internal.R.id.current_scene, scene); } /** * Gets the current {@link Scene} set on the given view. A scene is set on a view * only if that view is the scene root. * + * @param sceneRoot The view on which the current scene will be returned * @return The current Scene set on this view. A value of null indicates that * no Scene is currently set. */ - static Scene getCurrentScene(View view) { - return (Scene) view.getTag(com.android.internal.R.id.current_scene); + @Nullable + public static Scene getCurrentScene(@NonNull View sceneRoot) { + return (Scene) sceneRoot.getTag(com.android.internal.R.id.current_scene); } /**