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.activities;
18 
19 import android.app.Activity;
20 import android.os.Bundle;
21 import android.os.PersistableBundle;
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.ActivityInfo;
29 import com.android.queryable.queries.ActivityQuery;
30 import com.android.queryable.queries.ActivityQueryHelper;
31 import com.android.queryable.queries.BundleQueryHelper;
32 import com.android.queryable.queries.PersistableBundleQuery;
33 import com.android.queryable.queries.PersistableBundleQueryHelper;
34 import com.android.queryable.util.SerializableParcelWrapper;
35 
36 /**
37  * Event logged when {@link Activity#onCreate(Bundle)} or
38  * {@link Activity#onCreate(Bundle, PersistableBundle)} is called.
39  */
40 public final class ActivityCreatedEvent extends Event {
41 
42     /** Begin a query for {@link ActivityCreatedEvent} events. */
queryPackage(String packageName)43     public static ActivityCreatedEventQuery queryPackage(String packageName) {
44         return new ActivityCreatedEventQuery(packageName);
45     }
46 
47     /** {@link EventLogsQuery} for {@link ActivityCreatedEvent}. */
48     public static final class ActivityCreatedEventQuery
49             extends EventLogsQuery<ActivityCreatedEvent, ActivityCreatedEventQuery> {
50         ActivityQueryHelper<ActivityCreatedEventQuery> mActivity = new ActivityQueryHelper<>(this);
51         BundleQueryHelper<ActivityCreatedEventQuery> mSavedInstanceState =
52                 new BundleQueryHelper<>(this);
53         PersistableBundleQueryHelper<ActivityCreatedEventQuery> mPersistentState =
54                 new PersistableBundleQueryHelper<>(this);
55 
ActivityCreatedEventQuery(String packageName)56         private ActivityCreatedEventQuery(String packageName) {
57             super(ActivityCreatedEvent.class, packageName);
58         }
59 
60         /**
61          * Query {@code savedInstanceState} {@link Bundle} passed into
62          * {@link Activity#onCreate(Bundle)} or
63          * {@link Activity#onCreate(Bundle, PersistableBundle)}.
64          */
65         @CheckResult
whereSavedInstanceState()66         public BundleQueryHelper<ActivityCreatedEventQuery> whereSavedInstanceState() {
67             return mSavedInstanceState;
68         }
69 
70         /**
71          * Query {@code persistentState} {@link PersistableBundle} passed into
72          * {@link Activity#onCreate(Bundle, PersistableBundle)}.
73          */
74         @CheckResult
wherePersistentState()75         public PersistableBundleQuery<ActivityCreatedEventQuery> wherePersistentState() {
76             return mPersistentState;
77         }
78 
79         /** Query {@link Activity}. */
80         @CheckResult
whereActivity()81         public ActivityQuery<ActivityCreatedEventQuery> whereActivity() {
82             return mActivity;
83         }
84 
85         @Override
filter(ActivityCreatedEvent event)86         protected boolean filter(ActivityCreatedEvent event) {
87             if (!mSavedInstanceState.matches(event.mSavedInstanceState)) {
88                 return false;
89             }
90             if (!mPersistentState.matches(event.mPersistentState)) {
91                 return false;
92             }
93             if (!mActivity.matches(event.mActivity)) {
94                 return false;
95             }
96             return true;
97         }
98     }
99 
100     /** Begin logging a {@link ActivityCreatedEvent}. */
logger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState)101     public static ActivityCreatedEventLogger logger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState) {
102         return new ActivityCreatedEventLogger(activity, activityInfo, savedInstanceState);
103     }
104 
105     /** {@link EventLogger} for {@link ActivityCreatedEvent}. */
106     public static final class ActivityCreatedEventLogger extends EventLogger<ActivityCreatedEvent> {
ActivityCreatedEventLogger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState)107         private ActivityCreatedEventLogger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState) {
108             super(activity, new ActivityCreatedEvent());
109             mEvent.mSavedInstanceState = new SerializableParcelWrapper<>(savedInstanceState);
110             setActivity(activityInfo);
111         }
112 
setActivity(android.content.pm.ActivityInfo activityInfo)113         public ActivityCreatedEventLogger setActivity(android.content.pm.ActivityInfo activityInfo) {
114             mEvent.mActivity = ActivityInfo.builder()
115                     .activityClass(activityInfo.name)
116                     .exported(activityInfo.exported)
117                     .build();
118             return this;
119         }
120 
setSavedInstanceState(Bundle savedInstanceState)121         public ActivityCreatedEventLogger setSavedInstanceState(Bundle savedInstanceState) {
122             mEvent.mSavedInstanceState = new SerializableParcelWrapper<>(savedInstanceState);
123             return this;
124         }
125 
setPersistentState(PersistableBundle persistentState)126         public ActivityCreatedEventLogger setPersistentState(PersistableBundle persistentState) {
127             mEvent.mPersistentState = new SerializableParcelWrapper<>(persistentState);
128             return this;
129         }
130     }
131 
132     protected SerializableParcelWrapper<Bundle> mSavedInstanceState;
133     protected SerializableParcelWrapper<PersistableBundle> mPersistentState;
134     protected ActivityInfo mActivity;
135 
136     /**
137      * The {@code savedInstanceState} {@link Bundle} passed into
138      * {@link Activity#onCreate(Bundle)} or
139      * {@link Activity#onCreate(Bundle, PersistableBundle)}.
140      */
savedInstanceState()141     public Bundle savedInstanceState() {
142         if (mSavedInstanceState == null) {
143             return null;
144         }
145         return mSavedInstanceState.get();
146     }
147 
148     /**
149      * The {@code persistentState} {@link PersistableBundle} passed into
150      * {@link Activity#onCreate(Bundle, PersistableBundle)}.
151      */
persistentState()152     public PersistableBundle persistentState() {
153         if (mPersistentState == null) {
154             return null;
155         }
156         return mPersistentState.get();
157     }
158 
159     /** Information about the {@link Activity} started. */
activity()160     public ActivityInfo activity() {
161         return mActivity;
162     }
163 
164     @Override
toString()165     public String toString() {
166         return "ActivityCreatedEvent{"
167                 + " savedInstanceState=" + savedInstanceState()
168                 + ", persistentState=" + persistentState()
169                 + ", activity=" + mActivity
170                 + ", packageName='" + mPackageName + "'"
171                 + ", timestamp=" + mTimestamp
172                 + "}";
173     }
174 }
175