1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.server.wm.jetpack.embedding;
18 
19 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_CREATE;
20 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_DESTROY;
21 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_PAUSE;
22 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_RESUME;
23 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_START;
24 import static android.server.wm.activity.lifecycle.LifecycleConstants.ON_STOP;
25 import static android.server.wm.activity.lifecycle.TransitionVerifier.transition;
26 
27 import static org.junit.Assert.assertTrue;
28 
29 import android.app.Activity;
30 import android.app.Application;
31 import android.net.Uri;
32 import android.os.Bundle;
33 import android.server.wm.activity.lifecycle.EventLog;
34 import android.server.wm.activity.lifecycle.EventLog.EventLogClient;
35 import android.server.wm.activity.lifecycle.EventTracker;
36 import android.server.wm.jetpack.extensions.util.TestValueCountConsumer;
37 
38 import org.junit.After;
39 import org.junit.Before;
40 
41 /**
42  * Base test class for the {@link androidx.window.extensions} implementation provided on the device
43  * (and only if one is available) for the Activity Embedding functionality and Activity lifecycle
44  * callbacks.
45  */
46 public class ActivityEmbeddingLifecycleTestBase extends ActivityEmbeddingTestBase {
47     protected static final String TEST_OWNER = "TEST_OWNER";
48     protected static final String ON_SPLIT_STATES_UPDATED = "ON_SPLIT_STATES_UPDATED";
49 
50     protected EventLog mEventLog;
51     protected EventTracker mLifecycleTracker;
52 
53     private EventLogClient mEventLogClient;
54     private LifecycleCallbacks mLifecycleCallbacks;
55 
56     @Before
57     @Override
setUp()58     public void setUp() throws Exception {
59         super.setUp();
60         mSplitInfoConsumer = new SplitInfoLifecycleConsumer<>();
61         mActivityEmbeddingComponent.setSplitInfoCallback(mSplitInfoConsumer);
62 
63         mEventLogClient = EventLogClient.create(TEST_OWNER, mInstrumentation.getTargetContext(),
64                 Uri.parse("content://android.server.wm.jetpack.logprovider"));
65 
66         // Log transitions for all activities that belong to this app.
67         mEventLog = new EventLog();
68         mEventLog.clear();
69 
70         // Track transitions and allow waiting for pending activity states.
71         mLifecycleTracker = new EventTracker(mEventLog);
72         mLifecycleCallbacks = new LifecycleCallbacks();
73         mApplication.registerActivityLifecycleCallbacks(mLifecycleCallbacks);
74     }
75 
76     @After
77     @Override
tearDown()78     public void tearDown() throws Throwable {
79         super.tearDown();
80         mApplication.unregisterActivityLifecycleCallbacks(mLifecycleCallbacks);
81         if (mEventLogClient != null) {
82             mEventLogClient.close();
83         }
84     }
85 
waitAndAssertActivityOnStop(Class<? extends Activity> activityClass)86     protected void waitAndAssertActivityOnStop(Class<? extends Activity> activityClass) {
87         mLifecycleTracker.waitAndAssertActivityCurrentState(activityClass, ON_STOP);
88     }
89 
waitAndAssertActivityOnDestroy(Class<? extends Activity> activityClass)90     protected void waitAndAssertActivityOnDestroy(Class<? extends Activity> activityClass) {
91         mLifecycleTracker.waitAndAssertActivityCurrentState(activityClass, ON_DESTROY);
92     }
93 
waitAndAssertSplitStatesUpdated()94     protected void waitAndAssertSplitStatesUpdated() {
95         assertTrue("Split state change must be observed",
96                 mLifecycleTracker.waitForConditionWithTimeout(() -> mEventLog.getLog().contains(
97                         transition(TEST_OWNER, ON_SPLIT_STATES_UPDATED))));
98     }
99 
100     private final class LifecycleCallbacks implements
101             Application.ActivityLifecycleCallbacks {
102         @Override
onActivityCreated(Activity activity, Bundle savedInstanceState)103         public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
104             mEventLogClient.onCallback(ON_CREATE, activity);
105         }
106 
107         @Override
onActivityStarted(Activity activity)108         public void onActivityStarted(Activity activity) {
109             mEventLogClient.onCallback(ON_START, activity);
110         }
111 
112         @Override
onActivityResumed(Activity activity)113         public void onActivityResumed(Activity activity) {
114             mEventLogClient.onCallback(ON_RESUME, activity);
115         }
116 
117         @Override
onActivityPaused(Activity activity)118         public void onActivityPaused(Activity activity) {
119             mEventLogClient.onCallback(ON_PAUSE, activity);
120         }
121 
122         @Override
onActivityStopped(Activity activity)123         public void onActivityStopped(Activity activity) {
124             mEventLogClient.onCallback(ON_STOP, activity);
125         }
126 
127         @Override
onActivityDestroyed(Activity activity)128         public void onActivityDestroyed(Activity activity) {
129             mEventLogClient.onCallback(ON_DESTROY, activity);
130         }
131 
132         @Override
onActivitySaveInstanceState(Activity activity, Bundle outState)133         public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
134         }
135     }
136 
137     private final class SplitInfoLifecycleConsumer<T> extends TestValueCountConsumer<T> {
138         @Override
accept(T value)139         public void accept(T value) {
140             super.accept(value);
141             mEventLogClient.onCallback(ON_SPLIT_STATES_UPDATED, TEST_OWNER);
142         }
143     }
144 }
145