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<Message> 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
This commit is contained in:
Andrey Kulikov
2018-10-31 14:57:22 +00:00
parent d33b50a66a
commit a4ae81857a
2 changed files with 10 additions and 5 deletions

View File

@@ -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);

View File

@@ -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);
}
/**