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