1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 
15 package com.android.systemui;
16 
17 import android.content.BroadcastReceiver;
18 import android.content.Context;
19 import android.content.Intent;
20 import android.content.IntentFilter;
21 import android.hardware.display.DisplayManager;
22 import android.os.Handler;
23 import android.os.UserHandle;
24 import android.testing.LeakCheck;
25 import android.testing.TestableContext;
26 import android.util.ArraySet;
27 import android.util.Log;
28 import android.view.Display;
29 
30 import com.android.internal.annotations.GuardedBy;
31 
32 import java.util.Set;
33 
34 public class SysuiTestableContext extends TestableContext {
35 
36     @GuardedBy("mRegisteredReceivers")
37     private final Set<BroadcastReceiver> mRegisteredReceivers = new ArraySet<>();
38 
SysuiTestableContext(Context base)39     public SysuiTestableContext(Context base) {
40         super(base);
41         setTheme(R.style.Theme_SystemUI);
42     }
43 
SysuiTestableContext(Context base, LeakCheck check)44     public SysuiTestableContext(Context base, LeakCheck check) {
45         super(base, check);
46         setTheme(R.style.Theme_SystemUI);
47     }
48 
49     @Override
createDisplayContext(Display display)50     public Context createDisplayContext(Display display) {
51         if (display == null) {
52             throw new IllegalArgumentException("display must not be null");
53         }
54 
55         SysuiTestableContext context =
56                 new SysuiTestableContext(getBaseContext().createDisplayContext(display));
57         return context;
58     }
59 
createDefaultDisplayContext()60     public SysuiTestableContext createDefaultDisplayContext() {
61         Display display = getBaseContext().getSystemService(DisplayManager.class).getDisplays()[0];
62         return (SysuiTestableContext) createDisplayContext(display);
63     }
64 
cleanUpReceivers(String testName)65     public void cleanUpReceivers(String testName) {
66         Set<BroadcastReceiver> copy;
67         synchronized (mRegisteredReceivers) {
68             copy = new ArraySet<>(mRegisteredReceivers);
69             mRegisteredReceivers.clear();
70         }
71         for (BroadcastReceiver r : copy) {
72             try {
73                 unregisterReceiver(r);
74                 Log.w(testName, "Receiver not unregistered from Context: " + r);
75             } catch (IllegalArgumentException e) {
76                 // Nothing to do here. Somehow it got unregistered.
77             }
78         }
79     }
80 
81     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)82     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
83         if (receiver != null) {
84             synchronized (mRegisteredReceivers) {
85                 mRegisteredReceivers.add(receiver);
86             }
87         }
88         return super.registerReceiver(receiver, filter);
89     }
90 
91     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)92     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
93         if (receiver != null) {
94             synchronized (mRegisteredReceivers) {
95                 mRegisteredReceivers.add(receiver);
96             }
97         }
98         return super.registerReceiver(receiver, filter, flags);
99     }
100 
101     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)102     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
103             String broadcastPermission, Handler scheduler) {
104         if (receiver != null) {
105             synchronized (mRegisteredReceivers) {
106                 mRegisteredReceivers.add(receiver);
107             }
108         }
109         return super.registerReceiver(receiver, filter, broadcastPermission, scheduler);
110     }
111 
112     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)113     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
114             String broadcastPermission, Handler scheduler, int flags) {
115         if (receiver != null) {
116             synchronized (mRegisteredReceivers) {
117                 mRegisteredReceivers.add(receiver);
118             }
119         }
120         return super.registerReceiver(receiver, filter, broadcastPermission, scheduler, flags);
121     }
122 
123     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)124     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
125             IntentFilter filter, String broadcastPermission, Handler scheduler) {
126         if (receiver != null) {
127             synchronized (mRegisteredReceivers) {
128                 mRegisteredReceivers.add(receiver);
129             }
130         }
131         return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission, scheduler);
132     }
133 
134     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)135     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
136             IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) {
137         if (receiver != null) {
138             synchronized (mRegisteredReceivers) {
139                 mRegisteredReceivers.add(receiver);
140             }
141         }
142         return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission, scheduler,
143                 flags);
144     }
145 
146     @Override
unregisterReceiver(BroadcastReceiver receiver)147     public void unregisterReceiver(BroadcastReceiver receiver) {
148         if (receiver != null) {
149             synchronized (mRegisteredReceivers) {
150                 mRegisteredReceivers.remove(receiver);
151             }
152         }
153         super.unregisterReceiver(receiver);
154     }
155 }
156