1 /*
2  * Copyright (C) 2021 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 com.android.server.statusbar;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.ContextWrapper;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.os.Handler;
25 import android.os.UserHandle;
26 import android.testing.TestableContext;
27 
28 import androidx.annotation.NonNull;
29 import androidx.annotation.Nullable;
30 
31 import java.util.ArrayList;
32 
33 /**
34  * {@link ContextWrapper} that doesn't register {@link BroadcastReceiver}.
35  *
36  * Instead, it keeps a list of the registrations for querying.
37  */
38 class NoBroadcastContextWrapper extends TestableContext {
39 
40     ArrayList<BroadcastReceiverRegistration> mRegistrationList =
41             new ArrayList<>();
42 
NoBroadcastContextWrapper(Context context)43     NoBroadcastContextWrapper(Context context) {
44         super(context);
45     }
46 
47     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter)48     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
49         return registerReceiver(receiver, filter, 0);
50     }
51 
52     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, int flags)53     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
54             int flags) {
55         return registerReceiver(receiver, filter, null, null, flags);
56     }
57 
58     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)59     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
60             @Nullable String broadcastPermission, @Nullable Handler scheduler) {
61         return registerReceiver(receiver, filter, broadcastPermission, scheduler, 0);
62     }
63 
64     @Override
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)65     public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,
66             @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags) {
67         return registerReceiverAsUser(receiver, getUser(), filter, broadcastPermission, scheduler,
68                 flags);
69     }
70 
71     @Nullable
72     @Override
registerReceiverForAllUsers(@ullable BroadcastReceiver receiver, @NonNull IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)73     public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver,
74             @NonNull IntentFilter filter, @Nullable String broadcastPermission,
75             @Nullable Handler scheduler) {
76         return registerReceiverForAllUsers(receiver, filter, broadcastPermission, scheduler, 0);
77     }
78 
79     @Nullable
80     @Override
registerReceiverForAllUsers(@ullable BroadcastReceiver receiver, @NonNull IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)81     public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver,
82             @NonNull IntentFilter filter, @Nullable String broadcastPermission,
83             @Nullable Handler scheduler, int flags) {
84         return registerReceiverAsUser(receiver, UserHandle.ALL, filter, broadcastPermission,
85                 scheduler, flags);
86     }
87 
88     @Override
registerReceiverAsUser(@ullable BroadcastReceiver receiver, UserHandle user, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)89     public Intent registerReceiverAsUser(@Nullable BroadcastReceiver receiver, UserHandle user,
90             IntentFilter filter, @Nullable String broadcastPermission,
91             @Nullable Handler scheduler) {
92         return registerReceiverAsUser(receiver, user, filter, broadcastPermission,
93                 scheduler, 0);
94     }
95 
96     @Override
registerReceiverAsUser(@ullable BroadcastReceiver receiver, UserHandle user, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)97     public Intent registerReceiverAsUser(@Nullable BroadcastReceiver receiver, UserHandle user,
98             IntentFilter filter, @Nullable String broadcastPermission,
99             @Nullable Handler scheduler, int flags) {
100         BroadcastReceiverRegistration reg = new BroadcastReceiverRegistration(
101                 receiver, user, filter, broadcastPermission, scheduler, flags
102         );
103         mRegistrationList.add(reg);
104         return null;
105     }
106 
107     @Override
unregisterReceiver(BroadcastReceiver receiver)108     public void unregisterReceiver(BroadcastReceiver receiver) {
109         mRegistrationList.removeIf((reg) -> reg.mReceiver == receiver);
110     }
111 
112     static class BroadcastReceiverRegistration {
113         final BroadcastReceiver mReceiver;
114         final UserHandle mUser;
115         final IntentFilter mIntentFilter;
116         final String mBroadcastPermission;
117         final Handler mHandler;
118         final int mFlags;
119 
BroadcastReceiverRegistration(BroadcastReceiver receiver, UserHandle user, IntentFilter intentFilter, String broadcastPermission, Handler handler, int flags)120         BroadcastReceiverRegistration(BroadcastReceiver receiver, UserHandle user,
121                 IntentFilter intentFilter, String broadcastPermission, Handler handler, int flags) {
122             mReceiver = receiver;
123             mUser = user;
124             mIntentFilter = intentFilter;
125             mBroadcastPermission = broadcastPermission;
126             mHandler = handler;
127             mFlags = flags;
128         }
129     }
130 }
131