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