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 package android.car; 17 18 import android.annotation.NonNull; 19 import android.car.annotation.ApiRequirements; 20 import android.car.annotation.ApiRequirements.CarVersion; 21 import android.os.Build; 22 import android.os.Parcel; 23 import android.os.Parcelable; 24 25 /** 26 * Represents the API version of the standard Android SDK. 27 */ 28 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 29 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 30 public final class PlatformVersion extends ApiVersion<PlatformVersion> implements Parcelable { 31 32 private static final String CODENAME_REL = "REL"; 33 34 /** 35 * Contains pre-defined versions matching Car releases. 36 */ 37 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 38 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 39 public static class VERSION_CODES { 40 41 /** 42 * Helper object for main version of Android 13. 43 */ 44 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 45 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 46 @NonNull 47 public static final PlatformVersion TIRAMISU_0 = 48 new PlatformVersion("TIRAMISU_0", Build.VERSION_CODES.TIRAMISU, 0); 49 50 /** 51 * Helper object for first minor upgrade of Android 13. 52 */ 53 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 54 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 55 @NonNull 56 public static final PlatformVersion TIRAMISU_1 = 57 new PlatformVersion("TIRAMISU_1", Build.VERSION_CODES.TIRAMISU, 1); 58 59 /** 60 * Helper object for second minor upgrade of Android 13. 61 */ 62 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_2, 63 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 64 @NonNull 65 public static final PlatformVersion TIRAMISU_2 = 66 new PlatformVersion("TIRAMISU_2", Build.VERSION_CODES.TIRAMISU, 2); 67 68 /** 69 * Helper object for third minor upgrade of Android 13. 70 */ 71 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_3, 72 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 73 @NonNull 74 public static final PlatformVersion TIRAMISU_3 = 75 new PlatformVersion("TIRAMISU_3", Build.VERSION_CODES.TIRAMISU, 3); 76 77 /** 78 * Helper object for main version of Android 14. 79 */ 80 @ApiRequirements(minCarVersion = CarVersion.UPSIDE_DOWN_CAKE_0, 81 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 82 @NonNull 83 public static final PlatformVersion UPSIDE_DOWN_CAKE_0 = 84 new PlatformVersion("UPSIDE_DOWN_CAKE_0", Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 0); 85 86 /** 87 * Helper object for first minor upgrade of Android 14. 88 */ 89 @ApiRequirements(minCarVersion = CarVersion.UPSIDE_DOWN_CAKE_1, 90 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 91 @NonNull 92 public static final PlatformVersion UPSIDE_DOWN_CAKE_1 = 93 new PlatformVersion("UPSIDE_DOWN_CAKE_1", Build.VERSION_CODES.UPSIDE_DOWN_CAKE, 1); 94 95 // DO NOT ADD minor UPSIDE_DOWN_CAKE version until lint tool is working. (b/275125924) 96 VERSION_CODES()97 private VERSION_CODES() { 98 throw new UnsupportedOperationException("Only provide constants"); 99 } 100 } 101 102 /** 103 * Creates a named instance with the given major and minor versions. 104 */ 105 // TODO(b/243429779): should not need @ApiRequirements as it's package-protected newInstance(String versionName, int majorVersion, int minorVersion)106 static PlatformVersion newInstance(String versionName, int majorVersion, int minorVersion) { 107 return new PlatformVersion(versionName, majorVersion, minorVersion); 108 } 109 110 /** 111 * Returns the current platform version with given {@code minorVersion}. 112 */ getCurrentPlatformVersionForMinor(String versionName, int minorVersion)113 static PlatformVersion getCurrentPlatformVersionForMinor(String versionName, int minorVersion) { 114 // For un-released version, CUR_DEVELOPMENT should be used instead of SDK_INT. 115 // ex) VERSION_CODES.T is CUR_DEVELOPMENT first then becomes 33 (=SDK_INT) when SDK is 116 // finalized. 117 return new PlatformVersion(versionName, 118 CODENAME_REL.equals(Build.VERSION.CODENAME) ? Build.VERSION.SDK_INT 119 : Build.VERSION_CODES.CUR_DEVELOPMENT, minorVersion); 120 } 121 /** 122 * Creates a new instance with the given major and minor versions. 123 */ 124 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 125 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 126 @NonNull forMajorAndMinorVersions(int majorVersion, int minorVersion)127 public static PlatformVersion forMajorAndMinorVersions(int majorVersion, int minorVersion) { 128 return new PlatformVersion(majorVersion, minorVersion); 129 } 130 131 /** 132 * Creates a new instance for a major version (i.e., the minor version will be {@code 0}. 133 */ 134 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 135 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 136 @NonNull forMajorVersion(int majorVersion)137 public static PlatformVersion forMajorVersion(int majorVersion) { 138 return new PlatformVersion(majorVersion, /* minorVersion= */ 0); 139 } 140 PlatformVersion(String name, int majorVersion, int minorVersion)141 private PlatformVersion(String name, int majorVersion, int minorVersion) { 142 super(name, majorVersion, minorVersion); 143 } 144 PlatformVersion(int majorVersion, int minorVersion)145 private PlatformVersion(int majorVersion, int minorVersion) { 146 super(majorVersion, minorVersion); 147 } 148 149 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 150 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 151 @Override describeContents()152 public int describeContents() { 153 return 0; 154 } 155 156 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 157 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 158 @Override writeToParcel(@onNull Parcel dest, int flags)159 public void writeToParcel(@NonNull Parcel dest, int flags) { 160 writeToParcel(dest); 161 } 162 163 @ApiRequirements(minCarVersion = CarVersion.TIRAMISU_1, 164 minPlatformVersion = ApiRequirements.PlatformVersion.TIRAMISU_0) 165 @NonNull 166 public static final Parcelable.Creator<PlatformVersion> CREATOR = 167 new Parcelable.Creator<PlatformVersion>() { 168 169 @Override 170 public PlatformVersion createFromParcel(Parcel source) { 171 return ApiVersion.readFromParcel(source, 172 (name, major, minor) -> new PlatformVersion(name, major, minor)); 173 } 174 175 @Override 176 public PlatformVersion[] newArray(int size) { 177 return new PlatformVersion[size]; 178 } 179 }; 180 } 181