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