1 /*
2  * Copyright (C) 2018 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.content;
18 
19 import static android.content.Context.DEVICE_ID_DEFAULT;
20 import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
21 import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
22 import static android.view.Display.DEFAULT_DISPLAY;
23 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
24 
25 import static com.google.common.truth.Truth.assertThat;
26 
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertFalse;
29 import static org.junit.Assert.assertTrue;
30 
31 import android.app.ActivityThread;
32 import android.content.res.Configuration;
33 import android.graphics.PixelFormat;
34 import android.hardware.display.DisplayManager;
35 import android.hardware.display.VirtualDisplay;
36 import android.media.ImageReader;
37 import android.os.UserHandle;
38 import android.platform.test.annotations.Presubmit;
39 import android.view.Display;
40 
41 import androidx.test.core.app.ApplicationProvider;
42 import androidx.test.ext.junit.runners.AndroidJUnit4;
43 import androidx.test.filters.SmallTest;
44 import androidx.test.platform.app.InstrumentationRegistry;
45 
46 import org.junit.Test;
47 import org.junit.runner.RunWith;
48 
49 /**
50  *  Build/Install/Run:
51  *   atest FrameworksCoreTests:ContextTest
52  */
53 @Presubmit
54 @SmallTest
55 @RunWith(AndroidJUnit4.class)
56 public class ContextTest {
57     @Test
testDisplayIdForSystemContext()58     public void testDisplayIdForSystemContext() {
59         final Context systemContext =
60                 ActivityThread.currentActivityThread().getSystemContext();
61 
62         assertEquals(systemContext.getDisplay().getDisplayId(), systemContext.getDisplayId());
63     }
64 
65     @Test
testDisplayIdForSystemUiContext()66     public void testDisplayIdForSystemUiContext() {
67         final Context systemUiContext =
68                 ActivityThread.currentActivityThread().getSystemUiContext();
69 
70         assertEquals(systemUiContext.getDisplay().getDisplayId(), systemUiContext.getDisplayId());
71     }
72 
73     @Test
testDisplayIdForTestContext()74     public void testDisplayIdForTestContext() {
75         final Context testContext =
76                 InstrumentationRegistry.getInstrumentation().getTargetContext();
77 
78         assertEquals(testContext.getDisplayNoVerify().getDisplayId(), testContext.getDisplayId());
79     }
80 
81     @Test
testDisplayIdForDefaultDisplayContext()82     public void testDisplayIdForDefaultDisplayContext() {
83         final Context testContext =
84                 InstrumentationRegistry.getInstrumentation().getTargetContext();
85         final DisplayManager dm = testContext.getSystemService(DisplayManager.class);
86         final Context defaultDisplayContext =
87                 testContext.createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY));
88 
89         assertEquals(defaultDisplayContext.getDisplay().getDisplayId(),
90                 defaultDisplayContext.getDisplayId());
91     }
92 
93     @Test(expected = NullPointerException.class)
testStartActivityAsUserNullIntentNullUser()94     public void testStartActivityAsUserNullIntentNullUser() {
95         final Context testContext =
96                 InstrumentationRegistry.getInstrumentation().getTargetContext();
97         testContext.startActivityAsUser(null, null);
98     }
99 
100     @Test(expected = NullPointerException.class)
testStartActivityAsUserNullIntentNonNullUser()101     public void testStartActivityAsUserNullIntentNonNullUser() {
102         final Context testContext =
103                 InstrumentationRegistry.getInstrumentation().getTargetContext();
104         testContext.startActivityAsUser(null, new UserHandle(UserHandle.USER_ALL));
105     }
106 
107     @Test(expected = NullPointerException.class)
testStartActivityAsUserNonNullIntentNullUser()108     public void testStartActivityAsUserNonNullIntentNullUser() {
109         final Context testContext =
110                 InstrumentationRegistry.getInstrumentation().getTargetContext();
111         testContext.startActivityAsUser(new Intent(), null);
112     }
113 
114     @Test(expected = RuntimeException.class)
testStartActivityAsUserNonNullIntentNonNullUser()115     public void testStartActivityAsUserNonNullIntentNonNullUser() {
116         final Context testContext =
117                 InstrumentationRegistry.getInstrumentation().getTargetContext();
118         testContext.startActivityAsUser(new Intent(), new UserHandle(UserHandle.USER_ALL));
119     }
120 
121     @Test
testIsUiContext_appContext_returnsFalse()122     public void testIsUiContext_appContext_returnsFalse() {
123         final Context appContext = ApplicationProvider.getApplicationContext();
124 
125         assertThat(appContext.isUiContext()).isFalse();
126     }
127 
128     @Test
testIsUiContext_systemContext_returnsTrue()129     public void testIsUiContext_systemContext_returnsTrue() {
130         final Context systemContext =
131                 ActivityThread.currentActivityThread().getSystemContext();
132 
133         assertThat(systemContext.isUiContext()).isTrue();
134     }
135 
136     @Test
testIsUiContext_systemUiContext_returnsTrue()137     public void testIsUiContext_systemUiContext_returnsTrue() {
138         final Context systemUiContext =
139                 ActivityThread.currentActivityThread().getSystemUiContext();
140 
141         assertThat(systemUiContext.isUiContext()).isTrue();
142     }
143 
144     @Test
testGetDisplayFromDisplayContextDerivedContextOnPrimaryDisplay()145     public void testGetDisplayFromDisplayContextDerivedContextOnPrimaryDisplay() {
146         verifyGetDisplayFromDisplayContextDerivedContext(false /* onSecondaryDisplay */);
147     }
148 
149     @Test
testGetDisplayFromDisplayContextDerivedContextOnSecondaryDisplay()150     public void testGetDisplayFromDisplayContextDerivedContextOnSecondaryDisplay() {
151         verifyGetDisplayFromDisplayContextDerivedContext(true /* onSecondaryDisplay */);
152     }
153 
verifyGetDisplayFromDisplayContextDerivedContext( boolean onSecondaryDisplay)154     private static void verifyGetDisplayFromDisplayContextDerivedContext(
155             boolean onSecondaryDisplay) {
156         final Context appContext = ApplicationProvider.getApplicationContext();
157         final DisplayManager displayManager = appContext.getSystemService(DisplayManager.class);
158         final Display display;
159         if (onSecondaryDisplay) {
160             display = getSecondaryDisplay(displayManager);
161         } else {
162             display = displayManager.getDisplay(DEFAULT_DISPLAY);
163         }
164         final Context context = appContext.createDisplayContext(display)
165                 .createConfigurationContext(new Configuration());
166         assertEquals(display, context.getDisplay());
167     }
168 
getSecondaryDisplay(DisplayManager displayManager)169     private static Display getSecondaryDisplay(DisplayManager displayManager) {
170         final int width = 800;
171         final int height = 480;
172         final int density = 160;
173         ImageReader reader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888,
174                 2 /* maxImages */);
175         VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay(
176                 ContextTest.class.getName(), width, height, density, reader.getSurface(),
177                 VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
178         return virtualDisplay.getDisplay();
179     }
180 
181     @Test
testIsUiContext_ContextWrapper()182     public void testIsUiContext_ContextWrapper() {
183         ContextWrapper wrapper = new ContextWrapper(null /* base */);
184 
185         assertFalse(wrapper.isUiContext());
186 
187         wrapper = new ContextWrapper(createUiContext());
188 
189         assertTrue(wrapper.isUiContext());
190     }
191 
192     @Test
testIsUiContext_UiContextDerivedContext()193     public void testIsUiContext_UiContextDerivedContext() {
194         final Context uiContext = createUiContext();
195         Context context = uiContext.createAttributionContext(null /* attributionTag */);
196 
197         assertTrue(context.isUiContext());
198 
199         context = uiContext.createConfigurationContext(new Configuration());
200 
201         assertTrue(context.isUiContext());
202     }
203 
204     @Test
testIsUiContext_UiContextDerivedDisplayContext()205     public void testIsUiContext_UiContextDerivedDisplayContext() {
206         final Context uiContext = createUiContext();
207         final Display secondaryDisplay =
208                 getSecondaryDisplay(uiContext.getSystemService(DisplayManager.class));
209         final Context context = uiContext.createDisplayContext(secondaryDisplay);
210 
211         assertFalse(context.isUiContext());
212     }
213 
214     @Test
testDeviceIdForSystemContext()215     public void testDeviceIdForSystemContext() {
216         final Context systemContext =
217                 ActivityThread.currentActivityThread().getSystemContext();
218 
219         assertEquals(systemContext.getDeviceId(), DEVICE_ID_DEFAULT);
220     }
221 
222     @Test
testDeviceIdForSystemUiContext()223     public void testDeviceIdForSystemUiContext() {
224         final Context systemUiContext =
225                 ActivityThread.currentActivityThread().getSystemUiContext();
226 
227         assertEquals(systemUiContext.getDeviceId(), DEVICE_ID_DEFAULT);
228     }
229 
230     @Test
testDeviceIdForTestContext()231     public void testDeviceIdForTestContext() {
232         final Context testContext =
233                 InstrumentationRegistry.getInstrumentation().getTargetContext();
234 
235         assertEquals(testContext.getDeviceId(), DEVICE_ID_DEFAULT);
236     }
237 
createUiContext()238     private Context createUiContext() {
239         final Context appContext = ApplicationProvider.getApplicationContext();
240         final DisplayManager displayManager = appContext.getSystemService(DisplayManager.class);
241         final Display display = displayManager.getDisplay(DEFAULT_DISPLAY);
242         return appContext.createDisplayContext(display)
243                 .createWindowContext(TYPE_APPLICATION_OVERLAY, null /* options */);
244     }
245 }
246