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 android.car.user; 18 19 import static com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport.BOILERPLATE_CODE; 20 21 import android.annotation.IntDef; 22 import android.annotation.NonNull; 23 import android.annotation.Nullable; 24 import android.annotation.SystemApi; 25 import android.annotation.TestApi; 26 import android.car.annotation.AddedInOrBefore; 27 import android.os.Parcelable; 28 import android.os.UserHandle; 29 import android.os.UserManager; 30 31 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport; 32 import com.android.car.internal.util.DataClass; 33 import com.android.car.internal.util.DebugUtils; 34 35 import java.lang.annotation.Retention; 36 import java.lang.annotation.RetentionPolicy; 37 38 /** 39 * User creation results. 40 * 41 * @hide 42 */ 43 @DataClass( 44 genToString = true, 45 genHiddenConstructor = true, 46 genHiddenConstDefs = true) 47 @SystemApi 48 public final class UserCreationResult implements Parcelable, OperationResult { 49 50 /** 51 * {@link Status} called when user creation is successful for both HAL and Android. 52 */ 53 @Status 54 @AddedInOrBefore(majorVersion = 33) 55 public static final int STATUS_SUCCESSFUL = CommonResults.STATUS_SUCCESSFUL; 56 57 /** 58 * {@link Status} called when user creation failed on Android - HAL is not even called in this 59 * case. 60 */ 61 @Status 62 @AddedInOrBefore(majorVersion = 33) 63 public static final int STATUS_ANDROID_FAILURE = CommonResults.STATUS_ANDROID_FAILURE; 64 65 /** 66 * {@link Status} called when user was created on Android but HAL returned a failure - the 67 * Android user is automatically removed. 68 */ 69 @Status 70 @AddedInOrBefore(majorVersion = 33) 71 public static final int STATUS_HAL_FAILURE = CommonResults.STATUS_HAL_FAILURE; 72 73 /** 74 * {@link Status} called when user creation is failed for HAL for some internal error - the 75 * Android user is not automatically removed. 76 */ 77 @Status 78 @AddedInOrBefore(majorVersion = 33) 79 public static final int STATUS_HAL_INTERNAL_FAILURE = CommonResults.STATUS_HAL_INTERNAL_FAILURE; 80 81 /** 82 * {@link Status} called when given parameters or environment states are invalid for creating 83 * user - HAL or Android user creation is not requested. 84 */ 85 @Status 86 @AddedInOrBefore(majorVersion = 33) 87 public static final int STATUS_INVALID_REQUEST = CommonResults.STATUS_INVALID_REQUEST; 88 89 /** 90 * Gets the user creation result status. 91 * 92 * @return either {@link UserCreationResult#STATUS_SUCCESSFUL}, 93 * {@link UserCreationResult#STATUS_ANDROID_FAILURE}, 94 * {@link UserCreationResult#STATUS_HAL_FAILURE}, 95 * {@link UserCreationResult#STATUS_HAL_INTERNAL_FAILURE}, or 96 * {@link UserCreationResult#STATUS_INVALID_REQUEST}. 97 */ 98 private final @Status int mStatus; 99 100 // TODO(b/214443810): codegen generates call to writeInteger() / readInteger(), we need to 101 // manually change to writeInt() / readInt() 102 /** 103 * Gets the failure status returned by {@link UserManager} when the {@link #getStatus() status} 104 * is {@link #STATUS_ANDROID_FAILURE}. 105 * 106 * @return {@code USER_OPERATION_ERROR_} constants defined by {@link UserManager}, or 107 * {@code null} when the {@link #getStatus() status} is not {@link #STATUS_ANDROID_FAILURE}. 108 */ 109 @Nullable 110 private final Integer mAndroidFailureStatus; 111 112 /** 113 * Gets the created user. 114 */ 115 @Nullable 116 private final UserHandle mUser; 117 118 /** 119 * Gets the error message sent by HAL, if any. 120 */ 121 @Nullable 122 private final String mErrorMessage; 123 124 /** 125 * Gets the internal error message , if any. 126 */ 127 @Nullable 128 private final String mInternalErrorMessage; 129 130 @Override 131 @AddedInOrBefore(majorVersion = 33) isSuccess()132 public boolean isSuccess() { 133 return mStatus == STATUS_SUCCESSFUL; 134 } 135 136 /** @hide */ 137 @TestApi UserCreationResult(@tatus int status)138 public UserCreationResult(@Status int status) { 139 this(status, /* user= */ null); 140 } 141 142 /** @hide */ UserCreationResult(@tatus int status, UserHandle user)143 public UserCreationResult(@Status int status, UserHandle user) { 144 this(status, /* androidFailureStatus= */ null, user, /* errorMessage= */ null, 145 /* internalErrorMessage= */ null); 146 } 147 148 // NOTE: codegen generates this method, but without @ExcludeFromCodeCoverageGeneratedReport 149 @Override 150 @ExcludeFromCodeCoverageGeneratedReport(reason = BOILERPLATE_CODE) 151 @AddedInOrBefore(majorVersion = 33) describeContents()152 public int describeContents() { 153 return 0; 154 } 155 156 157 158 // Code below generated by codegen v1.0.23. 159 // 160 // DO NOT MODIFY! 161 // CHECKSTYLE:OFF Generated code 162 // 163 // To regenerate run: 164 // $ codegen $ANDROID_BUILD_TOP/packages/services/Car/car-lib/src/android/car/user/UserCreationResult.java 165 // Added AddedInOrBefore or ApiRequirement Annotation manually 166 // 167 // To exclude the generated code from IntelliJ auto-formatting enable (one-time): 168 // Settings > Editor > Code Style > Formatter Control 169 //@formatter:off 170 171 172 /** @hide */ 173 @IntDef(prefix = "STATUS_", value = { 174 STATUS_SUCCESSFUL, 175 STATUS_ANDROID_FAILURE, 176 STATUS_HAL_FAILURE, 177 STATUS_HAL_INTERNAL_FAILURE, 178 STATUS_INVALID_REQUEST 179 }) 180 @Retention(RetentionPolicy.SOURCE) 181 @DataClass.Generated.Member 182 public @interface Status {} 183 184 @DataClass.Generated.Member 185 @ExcludeFromCodeCoverageGeneratedReport(reason = BOILERPLATE_CODE) 186 @AddedInOrBefore(majorVersion = 33) 187 @NonNull statusToString(@tatus int value)188 public static String statusToString(@Status int value) { 189 switch (value) { 190 case STATUS_SUCCESSFUL: 191 return "STATUS_SUCCESSFUL"; 192 case STATUS_ANDROID_FAILURE: 193 return "STATUS_ANDROID_FAILURE"; 194 case STATUS_HAL_FAILURE: 195 return "STATUS_HAL_FAILURE"; 196 case STATUS_HAL_INTERNAL_FAILURE: 197 return "STATUS_HAL_INTERNAL_FAILURE"; 198 case STATUS_INVALID_REQUEST: 199 return "STATUS_INVALID_REQUEST"; 200 default: return Integer.toHexString(value); 201 } 202 } 203 204 /** 205 * Creates a new UserCreationResult. 206 * 207 * @param status 208 * Gets the user creation result status. 209 * 210 * @return either {@link UserCreationResult#STATUS_SUCCESSFUL}, 211 * {@link UserCreationResult#STATUS_ANDROID_FAILURE}, 212 * {@link UserCreationResult#STATUS_HAL_FAILURE}, 213 * {@link UserCreationResult#STATUS_HAL_INTERNAL_FAILURE}, or 214 * {@link UserCreationResult#STATUS_INVALID_REQUEST}. 215 * @param androidFailureStatus 216 * Gets the failure status returned by {@link UserManager} when the {@link #getStatus() status} 217 * is {@link #STATUS_ANDROID_FAILURE}. 218 * 219 * @return {@code USER_OPERATION_ERROR_} constants defined by {@link UserManager}, or 220 * {@code null} when the {@link #getStatus() status} is not {@link #STATUS_ANDROID_FAILURE}. 221 * @param user 222 * Gets the created user. 223 * @param errorMessage 224 * Gets the error message sent by HAL, if any. 225 * @param internalErrorMessage 226 * Gets the internal error message , if any. 227 * @hide 228 */ 229 @DataClass.Generated.Member UserCreationResult( @tatus int status, @Nullable Integer androidFailureStatus, @Nullable UserHandle user, @Nullable String errorMessage, @Nullable String internalErrorMessage)230 public UserCreationResult( 231 @Status int status, 232 @Nullable Integer androidFailureStatus, 233 @Nullable UserHandle user, 234 @Nullable String errorMessage, 235 @Nullable String internalErrorMessage) { 236 this.mStatus = status; 237 238 if (!(mStatus == STATUS_SUCCESSFUL) 239 && !(mStatus == STATUS_ANDROID_FAILURE) 240 && !(mStatus == STATUS_HAL_FAILURE) 241 && !(mStatus == STATUS_HAL_INTERNAL_FAILURE) 242 && !(mStatus == STATUS_INVALID_REQUEST)) { 243 throw new java.lang.IllegalArgumentException( 244 "status was " + mStatus + " but must be one of: " 245 + "STATUS_SUCCESSFUL(" + STATUS_SUCCESSFUL + "), " 246 + "STATUS_ANDROID_FAILURE(" + STATUS_ANDROID_FAILURE + "), " 247 + "STATUS_HAL_FAILURE(" + STATUS_HAL_FAILURE + "), " 248 + "STATUS_HAL_INTERNAL_FAILURE(" + STATUS_HAL_INTERNAL_FAILURE + "), " 249 + "STATUS_INVALID_REQUEST(" + STATUS_INVALID_REQUEST + ")"); 250 } 251 252 this.mAndroidFailureStatus = androidFailureStatus; 253 this.mUser = user; 254 this.mErrorMessage = errorMessage; 255 this.mInternalErrorMessage = internalErrorMessage; 256 257 // onConstructed(); // You can define this method to get a callback 258 } 259 260 /** 261 * Gets the user creation result status. 262 * 263 * @return either {@link UserCreationResult#STATUS_SUCCESSFUL}, 264 * {@link UserCreationResult#STATUS_ANDROID_FAILURE}, 265 * {@link UserCreationResult#STATUS_HAL_FAILURE}, 266 * {@link UserCreationResult#STATUS_HAL_INTERNAL_FAILURE}, or 267 * {@link UserCreationResult#STATUS_INVALID_REQUEST}. 268 */ 269 @DataClass.Generated.Member 270 @AddedInOrBefore(majorVersion = 33) getStatus()271 public @Status int getStatus() { 272 return mStatus; 273 } 274 275 /** 276 * Gets the failure status returned by {@link UserManager} when the {@link #getStatus() status} 277 * is {@link #STATUS_ANDROID_FAILURE}. 278 * 279 * @return {@code USER_OPERATION_ERROR_} constants defined by {@link UserManager}, or 280 * {@code null} when the {@link #getStatus() status} is not {@link #STATUS_ANDROID_FAILURE}. 281 */ 282 @DataClass.Generated.Member 283 @AddedInOrBefore(majorVersion = 33) getAndroidFailureStatus()284 public @Nullable Integer getAndroidFailureStatus() { 285 return mAndroidFailureStatus; 286 } 287 288 /** 289 * Gets the created user. 290 */ 291 @DataClass.Generated.Member 292 @AddedInOrBefore(majorVersion = 33) getUser()293 public @Nullable UserHandle getUser() { 294 return mUser; 295 } 296 297 /** 298 * Gets the error message sent by HAL, if any. 299 */ 300 @DataClass.Generated.Member 301 @AddedInOrBefore(majorVersion = 33) getErrorMessage()302 public @Nullable String getErrorMessage() { 303 return mErrorMessage; 304 } 305 306 /** 307 * Gets the internal error message , if any. 308 */ 309 @DataClass.Generated.Member 310 @AddedInOrBefore(majorVersion = 33) getInternalErrorMessage()311 public @Nullable String getInternalErrorMessage() { 312 return mInternalErrorMessage; 313 } 314 315 @Override 316 @DataClass.Generated.Member toString()317 public String toString() { 318 // You can override field toString logic by defining methods like: 319 // String fieldNameToString() { ... } 320 321 return "UserCreationResult { " + 322 "status = " + statusToString(mStatus) + ", " + 323 "androidFailureStatus = " + mAndroidFailureStatus + 324 (mAndroidFailureStatus != null ? " (" 325 + DebugUtils.constantToString(UserManager.class, "USER_OPERATION_", 326 mAndroidFailureStatus) + ")" : "") + 327 ", user = " + mUser + ", " + 328 "errorMessage = " + mErrorMessage + ", " + 329 "internalErrorMessage = " + mInternalErrorMessage + 330 " }"; 331 } 332 333 @Override 334 @DataClass.Generated.Member 335 @AddedInOrBefore(majorVersion = 33) writeToParcel(@ndroid.annotation.NonNull android.os.Parcel dest, int flags)336 public void writeToParcel(@android.annotation.NonNull android.os.Parcel dest, int flags) { 337 // You can override field parcelling by defining methods like: 338 // void parcelFieldName(Parcel dest, int flags) { ... } 339 340 byte flg = 0; 341 if (mAndroidFailureStatus != null) flg |= 0x2; 342 if (mUser != null) flg |= 0x4; 343 if (mErrorMessage != null) flg |= 0x8; 344 if (mInternalErrorMessage != null) flg |= 0x10; 345 dest.writeByte(flg); 346 dest.writeInt(mStatus); 347 if (mAndroidFailureStatus != null) dest.writeInt(mAndroidFailureStatus); 348 if (mUser != null) dest.writeTypedObject(mUser, flags); 349 if (mErrorMessage != null) dest.writeString(mErrorMessage); 350 if (mInternalErrorMessage != null) dest.writeString(mInternalErrorMessage); 351 } 352 353 /** @hide */ 354 @SuppressWarnings({"unchecked", "RedundantCast"}) 355 @DataClass.Generated.Member UserCreationResult(@ndroid.annotation.NonNull android.os.Parcel in)356 /* package-private */ UserCreationResult(@android.annotation.NonNull android.os.Parcel in) { 357 // You can override field unparcelling by defining methods like: 358 // static FieldType unparcelFieldName(Parcel in) { ... } 359 360 byte flg = in.readByte(); 361 int status = in.readInt(); 362 Integer androidFailureStatus = (flg & 0x2) == 0 ? null : (Integer) in.readInt(); 363 UserHandle user = (flg & 0x4) == 0 ? null : (UserHandle) in.readTypedObject(UserHandle.CREATOR); 364 String errorMessage = (flg & 0x8) == 0 ? null : in.readString(); 365 String internalErrorMessage = (flg & 0x10) == 0 ? null : in.readString(); 366 367 this.mStatus = status; 368 369 if (!(mStatus == STATUS_SUCCESSFUL) 370 && !(mStatus == STATUS_ANDROID_FAILURE) 371 && !(mStatus == STATUS_HAL_FAILURE) 372 && !(mStatus == STATUS_HAL_INTERNAL_FAILURE) 373 && !(mStatus == STATUS_INVALID_REQUEST)) { 374 throw new java.lang.IllegalArgumentException( 375 "status was " + mStatus + " but must be one of: " 376 + "STATUS_SUCCESSFUL(" + STATUS_SUCCESSFUL + "), " 377 + "STATUS_ANDROID_FAILURE(" + STATUS_ANDROID_FAILURE + "), " 378 + "STATUS_HAL_FAILURE(" + STATUS_HAL_FAILURE + "), " 379 + "STATUS_HAL_INTERNAL_FAILURE(" + STATUS_HAL_INTERNAL_FAILURE + "), " 380 + "STATUS_INVALID_REQUEST(" + STATUS_INVALID_REQUEST + ")"); 381 } 382 383 this.mAndroidFailureStatus = androidFailureStatus; 384 this.mUser = user; 385 this.mErrorMessage = errorMessage; 386 this.mInternalErrorMessage = internalErrorMessage; 387 388 // onConstructed(); // You can define this method to get a callback 389 } 390 391 @DataClass.Generated.Member 392 @AddedInOrBefore(majorVersion = 33) 393 public static final @android.annotation.NonNull Parcelable.Creator<UserCreationResult> CREATOR 394 = new Parcelable.Creator<UserCreationResult>() { 395 @Override 396 public UserCreationResult[] newArray(int size) { 397 return new UserCreationResult[size]; 398 } 399 400 @Override 401 public UserCreationResult createFromParcel(@android.annotation.NonNull android.os.Parcel in) { 402 return new UserCreationResult(in); 403 } 404 }; 405 406 @DataClass.Generated( 407 time = 1673057364539L, 408 codegenVersion = "1.0.23", 409 sourceFile = "packages/services/Car/car-lib/src/android/car/user/UserCreationResult.java", 410 inputSignatures = "public static final @android.car.user.UserCreationResult.Status @android.car.annotation.AddedInOrBefore int STATUS_SUCCESSFUL\npublic static final @android.car.user.UserCreationResult.Status @android.car.annotation.AddedInOrBefore int STATUS_ANDROID_FAILURE\npublic static final @android.car.user.UserCreationResult.Status @android.car.annotation.AddedInOrBefore int STATUS_HAL_FAILURE\npublic static final @android.car.user.UserCreationResult.Status @android.car.annotation.AddedInOrBefore int STATUS_HAL_INTERNAL_FAILURE\npublic static final @android.car.user.UserCreationResult.Status @android.car.annotation.AddedInOrBefore int STATUS_INVALID_REQUEST\nprivate final @android.car.user.UserCreationResult.Status int mStatus\nprivate final @android.annotation.Nullable java.lang.Integer mAndroidFailureStatus\nprivate final @android.annotation.Nullable android.os.UserHandle mUser\nprivate final @android.annotation.Nullable java.lang.String mErrorMessage\nprivate final @android.annotation.Nullable java.lang.String mInternalErrorMessage\npublic @java.lang.Override @android.car.annotation.AddedInOrBefore boolean isSuccess()\npublic @java.lang.Override @com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport @android.car.annotation.AddedInOrBefore int describeContents()\nclass UserCreationResult extends java.lang.Object implements [android.os.Parcelable, android.car.user.OperationResult]\n@com.android.car.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") 411 @Deprecated __metadata()412 private void __metadata() {} 413 414 415 //@formatter:on 416 // End of generated code 417 418 } 419