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.eventlib.events.broadcastreceivers;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 
23 import androidx.annotation.CheckResult;
24 
25 import com.android.eventlib.Event;
26 import com.android.eventlib.EventLogger;
27 import com.android.eventlib.EventLogsQuery;
28 import com.android.queryable.info.BroadcastReceiverInfo;
29 import com.android.queryable.queries.BroadcastReceiverQuery;
30 import com.android.queryable.queries.BroadcastReceiverQueryHelper;
31 import com.android.queryable.queries.IntentQuery;
32 import com.android.queryable.queries.IntentQueryHelper;
33 import com.android.queryable.util.SerializableParcelWrapper;
34 
35 /**
36  * Event logged when {@link BroadcastReceiver#onReceive(Context, Intent)} is called.
37  */
38 public final class BroadcastReceivedEvent extends Event {
39 
40     /** Begin a query for {@link BroadcastReceivedEvent} events. */
queryPackage(String packageName)41     public static BroadcastReceivedEventQuery queryPackage(String packageName) {
42         return new BroadcastReceivedEventQuery(packageName);
43     }
44 
45     /** {@link EventLogsQuery} for {@link BroadcastReceivedEvent}. */
46     public static final class BroadcastReceivedEventQuery
47             extends EventLogsQuery<BroadcastReceivedEvent, BroadcastReceivedEventQuery> {
48         BroadcastReceiverQueryHelper<BroadcastReceivedEventQuery> mBroadcastReceiver =
49                 new BroadcastReceiverQueryHelper<>(this);
50         IntentQueryHelper<BroadcastReceivedEventQuery> mIntent = new IntentQueryHelper<>(this);
51 
BroadcastReceivedEventQuery(String packageName)52         private BroadcastReceivedEventQuery(String packageName) {
53             super(BroadcastReceivedEvent.class, packageName);
54         }
55 
56         /**
57          * Query {@link Intent} passed into {@link BroadcastReceiver#onReceive(Context, Intent)}.
58          */
59         @CheckResult
whereIntent()60         public IntentQuery<BroadcastReceivedEventQuery> whereIntent() {
61             return mIntent;
62         }
63 
64         /** Query {@link BroadcastReceiver}. */
65         @CheckResult
whereBroadcastReceiver()66         public BroadcastReceiverQuery<BroadcastReceivedEventQuery> whereBroadcastReceiver() {
67             return mBroadcastReceiver;
68         }
69 
70         @Override
filter(BroadcastReceivedEvent event)71         protected boolean filter(BroadcastReceivedEvent event) {
72             if (!mIntent.matches(event.mIntent)) {
73                 return false;
74             }
75             if (!mBroadcastReceiver.matches(event.mBroadcastReceiver)) {
76                 return false;
77             }
78             return true;
79         }
80     }
81 
82     /** Begin logging a {@link BroadcastReceivedEvent}. */
logger( BroadcastReceiver broadcastReceiver, Context context, Intent intent)83     public static BroadcastReceivedEventLogger logger(
84             BroadcastReceiver broadcastReceiver, Context context, Intent intent) {
85         return new BroadcastReceivedEventLogger(broadcastReceiver, context, intent);
86     }
87 
88     /** {@link EventLogger} for {@link BroadcastReceivedEvent}. */
89     public static final class BroadcastReceivedEventLogger
90             extends EventLogger<BroadcastReceivedEvent> {
BroadcastReceivedEventLogger( BroadcastReceiver broadcastReceiver, Context context, Intent intent)91         private BroadcastReceivedEventLogger(
92                 BroadcastReceiver broadcastReceiver, Context context, Intent intent) {
93             super(context, new BroadcastReceivedEvent());
94             mEvent.mIntent = new SerializableParcelWrapper<>(intent);
95             setBroadcastReceiver(broadcastReceiver);
96         }
97 
98         /** Set the {@link BroadcastReceiver} which received this event. */
setBroadcastReceiver( BroadcastReceiver broadcastReceiver)99         public BroadcastReceivedEventLogger setBroadcastReceiver(
100                 BroadcastReceiver broadcastReceiver) {
101             mEvent.mBroadcastReceiver = new BroadcastReceiverInfo(broadcastReceiver);
102             return this;
103         }
104 
105         /** Set the {@link BroadcastReceiver} which received this event. */
setBroadcastReceiver( Class<? extends BroadcastReceiver> broadcastReceiverClass)106         public BroadcastReceivedEventLogger setBroadcastReceiver(
107                 Class<? extends BroadcastReceiver> broadcastReceiverClass) {
108             mEvent.mBroadcastReceiver = new BroadcastReceiverInfo(broadcastReceiverClass);
109             return this;
110         }
111 
112         /** Set the {@link BroadcastReceiver} which received this event. */
setBroadcastReceiver( String broadcastReceiverClassName)113         public BroadcastReceivedEventLogger setBroadcastReceiver(
114                 String broadcastReceiverClassName) {
115             mEvent.mBroadcastReceiver = new BroadcastReceiverInfo(broadcastReceiverClassName);
116             return this;
117         }
118 
119         /** Set the {@link Intent} which was received. */
setIntent(Intent intent)120         public BroadcastReceivedEventLogger setIntent(Intent intent) {
121             mEvent.mIntent = new SerializableParcelWrapper<>(intent);
122             return this;
123         }
124     }
125 
126     protected SerializableParcelWrapper<Intent> mIntent;
127     protected BroadcastReceiverInfo mBroadcastReceiver;
128 
129     /**
130      * The {@link Intent} passed into {@link BroadcastReceiver#onReceive(Context, Intent)}.
131      */
intent()132     public Intent intent() {
133         if (mIntent == null) {
134             return null;
135         }
136         return mIntent.get();
137     }
138 
139     /** Information about the {@link BroadcastReceiver} which received the intent. */
broadcastReceiver()140     public BroadcastReceiverInfo broadcastReceiver() {
141         return mBroadcastReceiver;
142     }
143 
144     @Override
toString()145     public String toString() {
146         return "BroadcastReceivedEvent{"
147                 + " intent=" + intent()
148                 + ", broadcastReceiver=" + mBroadcastReceiver
149                 + ", packageName='" + mPackageName + "'"
150                 + ", timestamp=" + mTimestamp
151                 + "}";
152     }
153 }
154