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