1 /* 2 * Copyright (C) 2022 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.settings.fuelgauge.batteryusage.db; 18 19 import android.content.ContentValues; 20 21 import androidx.room.Entity; 22 import androidx.room.PrimaryKey; 23 24 import com.android.settings.fuelgauge.batteryusage.ConvertUtils; 25 26 import com.google.errorprone.annotations.CanIgnoreReturnValue; 27 28 import java.util.Locale; 29 30 /** A {@link Entity} class to save app usage events into database. */ 31 @Entity 32 public class AppUsageEventEntity { 33 /** Keys for accessing {@link ContentValues}. */ 34 public static final String KEY_UID = "uid"; 35 public static final String KEY_USER_ID = "userId"; 36 public static final String KEY_TIMESTAMP = "timestamp"; 37 public static final String KEY_APP_USAGE_EVENT_TYPE = "appUsageEventType"; 38 public static final String KEY_PACKAGE_NAME = "packageName"; 39 public static final String KEY_INSTANCE_ID = "instanceId"; 40 public static final String KEY_TASK_ROOT_PACKAGE_NAME = "taskRootPackageName"; 41 42 @PrimaryKey(autoGenerate = true) 43 private long mId; 44 45 // Records the app relative information. 46 public final long uid; 47 public final long userId; 48 public final long timestamp; 49 public final int appUsageEventType; 50 public final String packageName; 51 public final int instanceId; 52 public final String taskRootPackageName; 53 AppUsageEventEntity( final long uid, final long userId, final long timestamp, final int appUsageEventType, final String packageName, final int instanceId, final String taskRootPackageName)54 public AppUsageEventEntity( 55 final long uid, 56 final long userId, 57 final long timestamp, 58 final int appUsageEventType, 59 final String packageName, 60 final int instanceId, 61 final String taskRootPackageName) { 62 this.uid = uid; 63 this.userId = userId; 64 this.timestamp = timestamp; 65 this.appUsageEventType = appUsageEventType; 66 this.packageName = packageName; 67 this.instanceId = instanceId; 68 this.taskRootPackageName = taskRootPackageName; 69 } 70 71 /** Sets the auto-generated content ID. */ setId(long id)72 public void setId(long id) { 73 this.mId = id; 74 } 75 76 /** Gets the auto-generated content ID. */ getId()77 public long getId() { 78 return mId; 79 } 80 81 @Override toString()82 public String toString() { 83 final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp); 84 final StringBuilder builder = new StringBuilder() 85 .append("\nAppUsageEvent{") 86 .append(String.format(Locale.US, 87 "\n\tpackage=%s|uid=%d|userId=%d", packageName, uid, userId)) 88 .append(String.format(Locale.US, "\n\ttimestamp=%s|eventType=%d|instanceId=%d", 89 recordAtDateTime, appUsageEventType, instanceId)) 90 .append(String.format(Locale.US, "\n\ttaskRootPackageName=%s", 91 taskRootPackageName)); 92 return builder.toString(); 93 } 94 95 /** Creates new {@link AppUsageEventEntity} from {@link ContentValues}. */ create(ContentValues contentValues)96 public static AppUsageEventEntity create(ContentValues contentValues) { 97 Builder builder = AppUsageEventEntity.newBuilder(); 98 if (contentValues.containsKey(KEY_UID)) { 99 builder.setUid(contentValues.getAsLong(KEY_UID)); 100 } 101 if (contentValues.containsKey(KEY_USER_ID)) { 102 builder.setUserId(contentValues.getAsLong(KEY_USER_ID)); 103 } 104 if (contentValues.containsKey(KEY_TIMESTAMP)) { 105 builder.setTimestamp(contentValues.getAsLong(KEY_TIMESTAMP)); 106 } 107 if (contentValues.containsKey(KEY_APP_USAGE_EVENT_TYPE)) { 108 builder.setAppUsageEventType(contentValues.getAsInteger(KEY_APP_USAGE_EVENT_TYPE)); 109 } 110 if (contentValues.containsKey(KEY_PACKAGE_NAME)) { 111 builder.setPackageName(contentValues.getAsString(KEY_PACKAGE_NAME)); 112 } 113 if (contentValues.containsKey(KEY_INSTANCE_ID)) { 114 builder.setInstanceId( 115 contentValues.getAsInteger(KEY_INSTANCE_ID)); 116 } 117 if (contentValues.containsKey(KEY_TASK_ROOT_PACKAGE_NAME)) { 118 builder.setTaskRootPackageName(contentValues.getAsString(KEY_TASK_ROOT_PACKAGE_NAME)); 119 } 120 return builder.build(); 121 } 122 123 /** Creates a new {@link Builder} instance. */ newBuilder()124 public static Builder newBuilder() { 125 return new Builder(); 126 } 127 128 /** A convenience builder class to improve readability. */ 129 public static class Builder { 130 private long mUid; 131 private long mUserId; 132 private long mTimestamp; 133 private int mAppUsageEventType; 134 private String mPackageName; 135 private int mInstanceId; 136 private String mTaskRootPackageName; 137 138 /** Sets the uid. */ 139 @CanIgnoreReturnValue setUid(final long uid)140 public Builder setUid(final long uid) { 141 this.mUid = uid; 142 return this; 143 } 144 145 /** Sets the user ID. */ 146 @CanIgnoreReturnValue setUserId(final long userId)147 public Builder setUserId(final long userId) { 148 this.mUserId = userId; 149 return this; 150 } 151 152 /** Sets the timestamp. */ 153 @CanIgnoreReturnValue setTimestamp(final long timestamp)154 public Builder setTimestamp(final long timestamp) { 155 this.mTimestamp = timestamp; 156 return this; 157 } 158 159 /** Sets the app usage event type. */ 160 @CanIgnoreReturnValue setAppUsageEventType(final int appUsageEventType)161 public Builder setAppUsageEventType(final int appUsageEventType) { 162 this.mAppUsageEventType = appUsageEventType; 163 return this; 164 } 165 166 /** Sets the package name. */ 167 @CanIgnoreReturnValue setPackageName(final String packageName)168 public Builder setPackageName(final String packageName) { 169 this.mPackageName = packageName; 170 return this; 171 } 172 173 /** Sets the instance ID. */ 174 @CanIgnoreReturnValue setInstanceId(final int instanceId)175 public Builder setInstanceId(final int instanceId) { 176 this.mInstanceId = instanceId; 177 return this; 178 } 179 180 /** Sets the task root package name. */ 181 @CanIgnoreReturnValue setTaskRootPackageName(final String taskRootPackageName)182 public Builder setTaskRootPackageName(final String taskRootPackageName) { 183 this.mTaskRootPackageName = taskRootPackageName; 184 return this; 185 } 186 187 /** Builds the AppUsageEvent. */ build()188 public AppUsageEventEntity build() { 189 return new AppUsageEventEntity( 190 mUid, 191 mUserId, 192 mTimestamp, 193 mAppUsageEventType, 194 mPackageName, 195 mInstanceId, 196 mTaskRootPackageName); 197 } 198 Builder()199 private Builder() {} 200 } 201 202 203 } 204