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.car.apitest;
18 
19 import android.annotation.Nullable;
20 import android.content.BroadcastReceiver;
21 import android.content.Context;
22 import android.content.ContextWrapper;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.os.Handler;
26 import android.os.UserHandle;
27 import android.util.ArrayMap;
28 import android.util.Log;
29 
30 import com.android.internal.annotations.GuardedBy;
31 
32 import java.util.ArrayList;
33 import java.util.Collection;
34 
35 /**
36  * A {@link Context} for testing which tracks registering/unregistering of broadcast receivers.
37  */
38 final class ReceiverTrackingContext extends ContextWrapper {
39 
40     private static final String TAG =  ReceiverTrackingContext.class.getSimpleName();
41 
42     private final Object mLock = new Object();
43     @GuardedBy("mLock")
44     private final ArrayMap<BroadcastReceiver, String> mReceivers = new ArrayMap<>();
45 
ReceiverTrackingContext(Context baseContext)46     ReceiverTrackingContext(Context baseContext) {
47         super(baseContext);
48     }
49 
50     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter)51     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
52         addReceiver(receiver, "registerReceiver(%s, %s)", receiver, filter);
53 
54         return super.registerReceiver(receiver, filter);
55     }
56 
57     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, int flags)58     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
59             int flags) {
60         addReceiver(receiver, "registerReceiver(%s, %s, %d)", receiver, filter, flags);
61 
62         return super.registerReceiver(receiver, filter, flags);
63     }
64 
65     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)66     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
67             @Nullable String broadcastPermission, @Nullable Handler scheduler) {
68         addReceiver(receiver, "registerReceiver(%s, %s, %s, %s)",
69                 receiver, filter, broadcastPermission, scheduler);
70 
71         return super.registerReceiver(receiver, filter, broadcastPermission,
72                 scheduler);
73     }
74 
75     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)76     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
77             @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags) {
78         addReceiver(receiver, "registerReceiver(%s, %s, %s, %s, %d)",
79                 receiver, filter, broadcastPermission, scheduler, flags);
80 
81         return super.registerReceiver(receiver, filter, broadcastPermission,
82                 scheduler, flags);
83     }
84 
85     @Override
86     @Nullable
registerReceiverForAllUsers(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)87     public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver,
88             IntentFilter filter, @Nullable String broadcastPermission,
89             @Nullable Handler scheduler) {
90         addReceiver(receiver, "registerReceiverForAllUsers(%s, %s, %s, %s)",
91                 receiver, filter, broadcastPermission, scheduler);
92 
93         return super.registerReceiverForAllUsers(receiver, filter, broadcastPermission,
94                 scheduler);
95     }
96 
97     @Override
98     @Nullable
registerReceiverForAllUsers(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)99     public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver,
100             IntentFilter filter, @Nullable String broadcastPermission,
101             @Nullable Handler scheduler, int flags) {
102         addReceiver(receiver, "registerReceiverForAllUsers(%s, %s, %s, %s, %d)",
103                 receiver, filter, broadcastPermission, scheduler, flags);
104 
105         return super.registerReceiverForAllUsers(receiver, filter, broadcastPermission,
106                 scheduler, flags);
107     }
108 
109     @Override
registerReceiverAsUser(@ullable BroadcastReceiver receiver, UserHandle user, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)110     public Intent registerReceiverAsUser(@Nullable BroadcastReceiver receiver, UserHandle user,
111             IntentFilter filter, @Nullable String broadcastPermission,
112             @Nullable Handler scheduler) {
113         addReceiver(receiver, "registerReceiverAsUser(%s, %s, %s, %s, %s)",
114                 receiver, user, filter, broadcastPermission, scheduler);
115 
116         return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
117                 scheduler);
118     }
119 
120     @Override
registerReceiverAsUser(@ullable BroadcastReceiver receiver, UserHandle user, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)121     public Intent registerReceiverAsUser(@Nullable BroadcastReceiver receiver, UserHandle user,
122             IntentFilter filter, @Nullable String broadcastPermission,
123             @Nullable Handler scheduler, int flags) {
124         addReceiver(receiver, "registerReceiverAsUser(%s, %s, %s, %s, %s, %d)",
125                 receiver, user, filter, broadcastPermission, scheduler, flags);
126 
127         return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
128                 scheduler, flags);
129     }
130 
131     @Override
unregisterReceiver(BroadcastReceiver receiver)132     public void unregisterReceiver(BroadcastReceiver receiver) {
133         Log.d(TAG, "unregisterReceiver(" + receiver + ") called.");
134         synchronized (mLock) {
135             mReceivers.remove(receiver);
136         }
137 
138         super.unregisterReceiver(receiver);
139     }
140 
141     /**
142      * Returns the registration information of currently registered broadcast receivers.
143      *
144      * <p>At the end of each test, make sure this collection is empty to verify all registered
145      * receivers have been unregistered.</p>
146      */
getReceiversInfo()147     public Collection<String> getReceiversInfo() {
148         synchronized (mLock) {
149             return new ArrayList<String>(mReceivers.values());
150         }
151     }
152 
153     /**
154      * Clear all receivers.
155      */
clearReceivers()156     public void clearReceivers() {
157         synchronized (mLock) {
158             mReceivers.clear();
159         }
160     }
161 
addReceiver(BroadcastReceiver receiver, String methodPattern, Object... args)162     private void addReceiver(BroadcastReceiver receiver, String methodPattern, Object... args) {
163         String info = String.format(methodPattern, args)
164                 + String.format(" called by %s", new Throwable().getStackTrace()[2]);
165         Log.d(TAG, info);
166         synchronized (mLock) {
167             mReceivers.put(receiver, info);
168         }
169     }
170 }
171