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.IntegerQuery; 33 import com.android.queryable.queries.IntegerQueryHelper; 34 import com.android.queryable.queries.PersistableBundleQuery; 35 import com.android.queryable.queries.PersistableBundleQueryHelper; 36 import com.android.queryable.util.SerializableParcelWrapper; 37 38 /** 39 * Event logged when {@link Activity#onCreate(Bundle)} or 40 * {@link Activity#onCreate(Bundle, PersistableBundle)} is called. 41 */ 42 public final class ActivityCreatedEvent extends Event { 43 44 private static final long serialVersionUID = 1; 45 46 /** Begins a query for {@link ActivityCreatedEvent} events. */ queryPackage(String packageName)47 public static ActivityCreatedEventQuery queryPackage(String packageName) { 48 return new ActivityCreatedEventQuery(packageName); 49 } 50 51 /** {@link EventLogsQuery} for {@link ActivityCreatedEvent}. */ 52 public static final class ActivityCreatedEventQuery 53 extends EventLogsQuery<ActivityCreatedEvent, ActivityCreatedEventQuery> { 54 55 private static final long serialVersionUID = 1; 56 57 ActivityQueryHelper<ActivityCreatedEventQuery> mActivity = new ActivityQueryHelper<>(this); 58 BundleQueryHelper<ActivityCreatedEventQuery> mSavedInstanceState = 59 new BundleQueryHelper<>(this); 60 PersistableBundleQueryHelper<ActivityCreatedEventQuery> mPersistentState = 61 new PersistableBundleQueryHelper<>(this); 62 IntegerQuery<ActivityCreatedEventQuery> mTaskId = new IntegerQueryHelper<>(this); 63 ActivityCreatedEventQuery(String packageName)64 private ActivityCreatedEventQuery(String packageName) { 65 super(ActivityCreatedEvent.class, packageName); 66 } 67 68 /** 69 * Query {@code savedInstanceState} {@link Bundle} passed into 70 * {@link Activity#onCreate(Bundle)} or 71 * {@link Activity#onCreate(Bundle, PersistableBundle)}. 72 */ 73 @CheckResult whereSavedInstanceState()74 public BundleQueryHelper<ActivityCreatedEventQuery> whereSavedInstanceState() { 75 return mSavedInstanceState; 76 } 77 78 /** 79 * Query {@code persistentState} {@link PersistableBundle} passed into 80 * {@link Activity#onCreate(Bundle, PersistableBundle)}. 81 */ 82 @CheckResult wherePersistentState()83 public PersistableBundleQuery<ActivityCreatedEventQuery> wherePersistentState() { 84 return mPersistentState; 85 } 86 87 /** Query {@link Activity}. */ 88 @CheckResult whereActivity()89 public ActivityQuery<ActivityCreatedEventQuery> whereActivity() { 90 return mActivity; 91 } 92 93 /** Query {@code taskId}. */ 94 @CheckResult whereTaskId()95 public IntegerQuery<ActivityCreatedEventQuery> whereTaskId() { 96 return mTaskId; 97 } 98 99 @Override filter(ActivityCreatedEvent event)100 protected boolean filter(ActivityCreatedEvent event) { 101 if (!mSavedInstanceState.matches(event.mSavedInstanceState)) { 102 return false; 103 } 104 if (!mPersistentState.matches(event.mPersistentState)) { 105 return false; 106 } 107 if (!mActivity.matches(event.mActivity)) { 108 return false; 109 } 110 if (!mTaskId.matches(event.mTaskId)) { 111 return false; 112 } 113 return true; 114 } 115 116 @Override describeQuery(String fieldName)117 public String describeQuery(String fieldName) { 118 return toStringBuilder(ActivityCreatedEvent.class, this) 119 .field("savedInstanceState", mSavedInstanceState) 120 .field("persistentState", mPersistentState) 121 .field("activity", mActivity) 122 .field("taskId", mTaskId) 123 .toString(); 124 } 125 } 126 127 /** Begins logging a {@link ActivityCreatedEvent}. */ logger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState)128 public static ActivityCreatedEventLogger logger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState) { 129 return new ActivityCreatedEventLogger(activity, activityInfo, savedInstanceState); 130 } 131 132 /** {@link EventLogger} for {@link ActivityCreatedEvent}. */ 133 public static final class ActivityCreatedEventLogger extends EventLogger<ActivityCreatedEvent> { ActivityCreatedEventLogger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState)134 private ActivityCreatedEventLogger(Activity activity, android.content.pm.ActivityInfo activityInfo, Bundle savedInstanceState) { 135 super(activity, new ActivityCreatedEvent()); 136 setSavedInstanceState(savedInstanceState); 137 setTaskId(activity.getTaskId()); 138 setActivity(activityInfo); 139 } 140 setActivity(android.content.pm.ActivityInfo activityInfo)141 public ActivityCreatedEventLogger setActivity(android.content.pm.ActivityInfo activityInfo) { 142 mEvent.mActivity = ActivityInfo.builder() 143 .activityClass(activityInfo.name) 144 .exported(activityInfo.exported) 145 .build(); 146 return this; 147 } 148 setSavedInstanceState(Bundle savedInstanceState)149 public ActivityCreatedEventLogger setSavedInstanceState(Bundle savedInstanceState) { 150 mEvent.mSavedInstanceState = new SerializableParcelWrapper<>(savedInstanceState); 151 return this; 152 } 153 setPersistentState(PersistableBundle persistentState)154 public ActivityCreatedEventLogger setPersistentState(PersistableBundle persistentState) { 155 mEvent.mPersistentState = new SerializableParcelWrapper<>(persistentState); 156 return this; 157 } 158 159 /** Sets the task ID for the activity. */ setTaskId(int taskId)160 public ActivityCreatedEventLogger setTaskId(int taskId) { 161 mEvent.mTaskId = taskId; 162 return this; 163 } 164 } 165 166 protected SerializableParcelWrapper<Bundle> mSavedInstanceState; 167 protected SerializableParcelWrapper<PersistableBundle> mPersistentState; 168 protected ActivityInfo mActivity; 169 protected int mTaskId; 170 171 /** 172 * The {@code savedInstanceState} {@link Bundle} passed into 173 * {@link Activity#onCreate(Bundle)} or 174 * {@link Activity#onCreate(Bundle, PersistableBundle)}. 175 */ savedInstanceState()176 public Bundle savedInstanceState() { 177 if (mSavedInstanceState == null) { 178 return null; 179 } 180 return mSavedInstanceState.get(); 181 } 182 183 /** 184 * The {@code persistentState} {@link PersistableBundle} passed into 185 * {@link Activity#onCreate(Bundle, PersistableBundle)}. 186 */ persistentState()187 public PersistableBundle persistentState() { 188 if (mPersistentState == null) { 189 return null; 190 } 191 return mPersistentState.get(); 192 } 193 194 /** Information about the {@link Activity} started. */ activity()195 public ActivityInfo activity() { 196 return mActivity; 197 } 198 199 /** The Task ID of the Activity. */ taskId()200 public int taskId() { 201 return mTaskId; 202 } 203 204 @Override toString()205 public String toString() { 206 return "ActivityCreatedEvent{" 207 + " savedInstanceState=" + savedInstanceState() 208 + ", persistentState=" + persistentState() 209 + ", activity=" + mActivity 210 + ", taskId=" + mTaskId 211 + ", packageName='" + mPackageName + "'" 212 + ", timestamp=" + mTimestamp 213 + "}"; 214 } 215 } 216