1 /* 2 * Copyright (C) 2020 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; 18 19 import android.content.Context; 20 21 import androidx.annotation.CheckResult; 22 23 import com.android.eventlib.Event; 24 import com.android.eventlib.EventLogger; 25 import com.android.eventlib.EventLogsQuery; 26 import com.android.queryable.queries.SerializableQuery; 27 import com.android.queryable.queries.SerializableQueryHelper; 28 import com.android.queryable.queries.StringQuery; 29 import com.android.queryable.queries.StringQueryHelper; 30 31 import java.io.Serializable; 32 33 /** 34 * Implementation of {@link Event} which can be used for events not covered by other 35 * {@link Event} subclasses. 36 * 37 * <p>To use, set custom data as {@link #tag()} and {@link #data()}. 38 */ 39 public final class CustomEvent extends Event { 40 41 private static final long serialVersionUID = 1; 42 43 /** Begins a query for {@link CustomEvent} events. */ queryPackage(String packageName)44 public static CustomEventQuery queryPackage(String packageName) { 45 return new CustomEventQuery(packageName); 46 } 47 48 public static final class CustomEventQuery 49 extends EventLogsQuery<CustomEvent, CustomEventQuery> { 50 StringQueryHelper<CustomEventQuery> mTag = new StringQueryHelper<>(this); 51 SerializableQueryHelper<CustomEventQuery> mData = new SerializableQueryHelper<>(this); 52 CustomEventQuery(String packageName)53 private CustomEventQuery(String packageName) { 54 super(CustomEvent.class, packageName); 55 } 56 57 /** Filter for a particular {@link CustomEvent#tag()}. */ 58 @CheckResult whereTag()59 public StringQuery<CustomEventQuery> whereTag() { 60 return mTag; 61 } 62 63 /** Filter for a particular {@link CustomEvent#data()}. */ 64 @CheckResult whereData()65 public SerializableQuery<CustomEventQuery> whereData() { 66 return mData; 67 } 68 69 @Override filter(CustomEvent event)70 protected boolean filter(CustomEvent event) { 71 if (!mTag.matches(event.mTag)) { 72 return false; 73 } 74 if (!mData.matches(event.mData)) { 75 return false; 76 } 77 return true; 78 } 79 80 @Override describeQuery(String fieldName)81 public String describeQuery(String fieldName) { 82 return toStringBuilder(CustomEvent.class, this) 83 .field("tag", mTag) 84 .field("data", mData) 85 .toString(); 86 } 87 } 88 89 /** Begins logging a {@link CustomEvent}. */ logger(Context context)90 public static CustomEventLogger logger(Context context) { 91 return new CustomEventLogger(context); 92 } 93 94 public static final class CustomEventLogger extends EventLogger<CustomEvent> { CustomEventLogger(Context context)95 private CustomEventLogger(Context context) { 96 super(context, new CustomEvent()); 97 } 98 99 /** Sets the {@link CustomEvent#tag()}. */ setTag(String tag)100 public CustomEventLogger setTag(String tag) { 101 mEvent.mTag = tag; 102 return this; 103 } 104 105 /** Sets the {@link CustomEvent#data()}. */ setData(Serializable data)106 public CustomEventLogger setData(Serializable data) { 107 mEvent.mData = data; 108 return this; 109 } 110 } 111 112 protected String mTag; 113 protected Serializable mData; 114 115 /** Get the tag set using {@link CustomEventLogger#setTag(String)}. */ tag()116 public String tag() { 117 return mTag; 118 } 119 120 /** Get the tag set using {@link CustomEventLogger#setData(Serializable)}. */ data()121 public Serializable data() { 122 return mData; 123 } 124 125 @Override toString()126 public String toString() { 127 return "CustomEvent{" 128 + "tag='" + mTag + "'" 129 + ", data=" + mData 130 + ", packageName='" + mPackageName + "'" 131 + ", timestamp=" + mTimestamp 132 + "}"; 133 } 134 } 135 136 137