1 /*
2  * Copyright (C) 2022 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.view;
18 
19 import static android.view.ContentRecordingSession.RECORD_CONTENT_DISPLAY;
20 import static android.view.ContentRecordingSession.RECORD_CONTENT_TASK;
21 import static android.view.Display.DEFAULT_DISPLAY;
22 import static android.view.Display.INVALID_DISPLAY;
23 
24 import static com.google.common.truth.Truth.assertThat;
25 
26 import android.os.Binder;
27 import android.os.IBinder;
28 import android.os.Parcel;
29 import android.platform.test.annotations.Presubmit;
30 
31 import androidx.test.ext.junit.runners.AndroidJUnit4;
32 import androidx.test.filters.SmallTest;
33 
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 
37 /**
38  * Tests for {@link ContentRecordingSession} class.
39  *
40  * Build/Install/Run:
41  * atest FrameworksCoreTests:ContentRecordingSessionTest
42  */
43 @RunWith(AndroidJUnit4.class)
44 @SmallTest
45 @Presubmit
46 public class ContentRecordingSessionTest {
47     private static final int DISPLAY_ID = 1;
48     private static final IBinder WINDOW_TOKEN = new Binder("DisplayContentWindowToken");
49 
50     @Test
testParcelable()51     public void testParcelable() {
52         ContentRecordingSession session = ContentRecordingSession.createTaskSession(WINDOW_TOKEN);
53         session.setVirtualDisplayId(DISPLAY_ID);
54 
55         Parcel parcel = Parcel.obtain();
56         session.writeToParcel(parcel, 0 /* flags */);
57         parcel.setDataPosition(0);
58         ContentRecordingSession session2 = ContentRecordingSession.CREATOR.createFromParcel(parcel);
59         assertThat(session).isEqualTo(session2);
60         parcel.recycle();
61     }
62 
63     @Test
testTaskConstructor()64     public void testTaskConstructor() {
65         ContentRecordingSession session = ContentRecordingSession.createTaskSession(WINDOW_TOKEN);
66         assertThat(session.getContentToRecord()).isEqualTo(RECORD_CONTENT_TASK);
67         assertThat(session.getTokenToRecord()).isEqualTo(WINDOW_TOKEN);
68     }
69 
70     @Test
testDisplayConstructor()71     public void testDisplayConstructor() {
72         ContentRecordingSession session = ContentRecordingSession.createDisplaySession(
73                 DEFAULT_DISPLAY);
74         assertThat(session.getContentToRecord()).isEqualTo(RECORD_CONTENT_DISPLAY);
75         assertThat(session.getTokenToRecord()).isNull();
76     }
77 
78     @Test
testIsValid_displaySession()79     public void testIsValid_displaySession() {
80         // Canonical display session.
81         ContentRecordingSession displaySession = ContentRecordingSession.createDisplaySession(
82                 DEFAULT_DISPLAY);
83         displaySession.setVirtualDisplayId(DEFAULT_DISPLAY);
84         assertThat(ContentRecordingSession.isValid(displaySession)).isTrue();
85 
86         // Virtual display id values.
87         ContentRecordingSession displaySession0 = ContentRecordingSession.createDisplaySession(
88                 DEFAULT_DISPLAY);
89         assertThat(ContentRecordingSession.isValid(displaySession0)).isFalse();
90 
91         ContentRecordingSession displaySession1 = ContentRecordingSession.createDisplaySession(
92                 DEFAULT_DISPLAY);
93         displaySession1.setVirtualDisplayId(INVALID_DISPLAY);
94         assertThat(ContentRecordingSession.isValid(displaySession1)).isFalse();
95 
96         // Display id values.
97         ContentRecordingSession displaySession2 = ContentRecordingSession.createDisplaySession(
98                 INVALID_DISPLAY);
99         displaySession2.setVirtualDisplayId(DEFAULT_DISPLAY);
100         assertThat(ContentRecordingSession.isValid(displaySession2)).isFalse();
101 
102         displaySession2.setDisplayToRecord(DEFAULT_DISPLAY);
103         assertThat(ContentRecordingSession.isValid(displaySession2)).isTrue();
104     }
105 
106     @Test
testIsValid_taskSession()107     public void testIsValid_taskSession() {
108         // Canonical task session.
109         ContentRecordingSession taskSession = ContentRecordingSession.createTaskSession(
110                 WINDOW_TOKEN);
111         taskSession.setVirtualDisplayId(DEFAULT_DISPLAY);
112         assertThat(ContentRecordingSession.isValid(taskSession)).isTrue();
113 
114         // Virtual display id values.
115         ContentRecordingSession taskSession0 = ContentRecordingSession.createTaskSession(
116                 WINDOW_TOKEN);
117         assertThat(ContentRecordingSession.isValid(taskSession0)).isFalse();
118 
119         ContentRecordingSession taskSession1 = ContentRecordingSession.createTaskSession(
120                 WINDOW_TOKEN);
121         taskSession1.setVirtualDisplayId(INVALID_DISPLAY);
122         assertThat(ContentRecordingSession.isValid(taskSession1)).isFalse();
123 
124         // Window container values.
125         ContentRecordingSession taskSession3 = ContentRecordingSession.createTaskSession(null);
126         taskSession3.setVirtualDisplayId(DEFAULT_DISPLAY);
127         assertThat(ContentRecordingSession.isValid(taskSession3)).isFalse();
128 
129         ContentRecordingSession taskSession4 = ContentRecordingSession.createTaskSession(
130                 WINDOW_TOKEN);
131         taskSession4.setVirtualDisplayId(DEFAULT_DISPLAY);
132         taskSession4.setTokenToRecord(null);
133         assertThat(ContentRecordingSession.isValid(taskSession4)).isFalse();
134     }
135 
136     @Test
testIsProjectionOnSameDisplay()137     public void testIsProjectionOnSameDisplay() {
138         assertThat(ContentRecordingSession.isProjectionOnSameDisplay(null, null)).isFalse();
139         ContentRecordingSession session = ContentRecordingSession.createDisplaySession(
140                 DEFAULT_DISPLAY);
141         session.setVirtualDisplayId(DEFAULT_DISPLAY);
142         assertThat(ContentRecordingSession.isProjectionOnSameDisplay(session, null)).isFalse();
143 
144         ContentRecordingSession incomingSession = ContentRecordingSession.createDisplaySession(
145                 DEFAULT_DISPLAY);
146         incomingSession.setVirtualDisplayId(DEFAULT_DISPLAY);
147         assertThat(ContentRecordingSession.isProjectionOnSameDisplay(session,
148                 incomingSession)).isTrue();
149 
150         incomingSession.setVirtualDisplayId(DEFAULT_DISPLAY + 1);
151         assertThat(ContentRecordingSession.isProjectionOnSameDisplay(session,
152                 incomingSession)).isFalse();
153     }
154 
155     @Test
testEquals()156     public void testEquals() {
157         ContentRecordingSession session = ContentRecordingSession.createTaskSession(WINDOW_TOKEN);
158         session.setVirtualDisplayId(DISPLAY_ID);
159 
160         ContentRecordingSession session2 = ContentRecordingSession.createTaskSession(WINDOW_TOKEN);
161         session2.setVirtualDisplayId(DISPLAY_ID);
162         assertThat(session).isEqualTo(session2);
163     }
164 }
165