Merge "Add OWNERS for PowerMonitors" into main
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index c15b3e0..09b9bda 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1949,6 +1949,8 @@
int type;
boolean foundApp = false;
+ String pkgName = (pkg != null) ? pkg.packageName : "<unknown>";
+
TypedArray sa = res.obtainAttributes(parser,
com.android.internal.R.styleable.AndroidManifest);
@@ -2218,14 +2220,14 @@
sa.recycle();
final int minSdkVersion = PackageParser.computeMinSdkVersion(minVers, minCode,
- SDK_VERSION, SDK_CODENAMES, outError);
+ SDK_VERSION, SDK_CODENAMES, outError, pkgName);
if (minSdkVersion < 0) {
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
}
final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers,
- targetCode, SDK_CODENAMES, outError);
+ targetCode, SDK_CODENAMES, outError, pkgName);
if (targetSdkVersion < 0) {
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
@@ -2610,13 +2612,15 @@
* @param platformSdkCodenames array of allowed pre-release SDK codenames
* for this platform
* @param outError output array to populate with error, if applicable
+ * @param pkgName for debug logging
* @return the targetSdkVersion to use at runtime, or -1 if the package is
* not compatible with this platform
* @hide Exposed for unit testing only.
*/
public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers,
@Nullable String targetCode, @NonNull String[] platformSdkCodenames,
- @NonNull String[] outError) {
+ @NonNull String[] outError,
+ String pkgName) {
// If it's a release SDK, return the version number unmodified.
if (targetCode == null) {
return targetVers;
@@ -2628,6 +2632,15 @@
return Build.VERSION_CODES.CUR_DEVELOPMENT;
}
+ // TODO(b/294161396): add a check for a "true REL" flag.
+ if (platformSdkCodenames.length == 0
+ && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
+ targetCode)) {
+ Slog.w(TAG, "Package " + pkgName + " requires development platform " + targetCode
+ + ", returning current version " + Build.VERSION.SDK_INT);
+ return Build.VERSION.SDK_INT;
+ }
+
// Otherwise, we're looking at an incompatible pre-release SDK.
if (platformSdkCodenames.length > 0) {
outError[0] = "Requires development platform " + targetCode
@@ -2674,13 +2687,15 @@
* @param platformSdkCodenames array of allowed prerelease SDK codenames
* for this platform
* @param outError output array to populate with error, if applicable
+ * @param pkgName for debug logging
* @return the minSdkVersion to use at runtime, or -1 if the package is not
* compatible with this platform
* @hide Exposed for unit testing only.
*/
public static int computeMinSdkVersion(@IntRange(from = 1) int minVers,
@Nullable String minCode, @IntRange(from = 1) int platformSdkVersion,
- @NonNull String[] platformSdkCodenames, @NonNull String[] outError) {
+ @NonNull String[] platformSdkCodenames, @NonNull String[] outError,
+ String pkgName) {
// If it's a release SDK, make sure we meet the minimum SDK requirement.
if (minCode == null) {
if (minVers <= platformSdkVersion) {
@@ -2699,6 +2714,15 @@
return Build.VERSION_CODES.CUR_DEVELOPMENT;
}
+ // TODO(b/294161396): add a check for a "true REL" flag.
+ if (platformSdkCodenames.length == 0
+ && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
+ minCode)) {
+ Slog.w(TAG, "Package " + pkgName + " requires min development platform " + minCode
+ + ", returning current version " + Build.VERSION.SDK_INT);
+ return Build.VERSION.SDK_INT;
+ }
+
// Otherwise, we're looking at an incompatible pre-release SDK.
if (platformSdkCodenames.length > 0) {
outError[0] = "Requires development platform " + minCode
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 10d6f2d..7d995d0 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -577,14 +577,14 @@
ParseResult<Integer> targetResult = FrameworkParsingPackageUtils.computeTargetSdkVersion(
targetVer, targetCode, SDK_CODENAMES, input,
- allowUnknownCodenames);
+ allowUnknownCodenames, codePath);
if (targetResult.isError()) {
return input.error(targetResult);
}
targetSdkVersion = targetResult.getResult();
ParseResult<Integer> minResult = FrameworkParsingPackageUtils.computeMinSdkVersion(
- minVer, minCode, SDK_VERSION, SDK_CODENAMES, input);
+ minVer, minCode, SDK_VERSION, SDK_CODENAMES, input, codePath);
if (minResult.isError()) {
return input.error(minResult);
}
diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
index 3e1c5bb..30e289f 100644
--- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
@@ -293,11 +293,14 @@
* {@code null} otherwise
* @param platformSdkVersion platform SDK version number, typically Build.VERSION.SDK_INT
* @param platformSdkCodenames array of allowed prerelease SDK codenames for this platform
+ * @param input parsing context
+ * @param pkgName for debug logging
* @return the minSdkVersion to use at runtime if successful
*/
public static ParseResult<Integer> computeMinSdkVersion(@IntRange(from = 1) int minVers,
@Nullable String minCode, @IntRange(from = 1) int platformSdkVersion,
- @NonNull String[] platformSdkCodenames, @NonNull ParseInput input) {
+ @NonNull String[] platformSdkCodenames, @NonNull ParseInput input,
+ String pkgName) {
// If it's a release SDK, make sure we meet the minimum SDK requirement.
if (minCode == null) {
if (minVers <= platformSdkVersion) {
@@ -316,6 +319,15 @@
return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
}
+ // TODO(b/294161396): add a check for a "true REL" flag.
+ if (platformSdkCodenames.length == 0
+ && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
+ minCode)) {
+ Slog.w(TAG, "Parsed package " + pkgName + " requires min development platform "
+ + minCode + ", returning current version " + Build.VERSION.SDK_INT);
+ return input.success(Build.VERSION.SDK_INT);
+ }
+
// Otherwise, we're looking at an incompatible pre-release SDK.
if (platformSdkCodenames.length > 0) {
return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK,
@@ -358,29 +370,38 @@
* @param platformSdkCodenames array of allowed pre-release SDK codenames for this platform
* @param allowUnknownCodenames allow unknown codenames, if true this method will accept unknown
* (presumed to be future) codenames
+ * @param pkgName for debug logging
* @return the targetSdkVersion to use at runtime if successful
*/
public static ParseResult<Integer> computeTargetSdkVersion(@IntRange(from = 0) int targetVers,
@Nullable String targetCode, @NonNull String[] platformSdkCodenames,
- @NonNull ParseInput input, boolean allowUnknownCodenames) {
+ @NonNull ParseInput input, boolean allowUnknownCodenames,
+ String pkgName) {
// If it's a release SDK, return the version number unmodified.
if (targetCode == null) {
return input.success(targetVers);
}
+ // TODO(b/294161396): add a check for a "true REL" flag.
+ // If it's a pre-release SDK and the codename matches this platform, it
+ // definitely targets this SDK.
+ if (matchTargetCode(platformSdkCodenames, targetCode)) {
+ return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
+ }
+ if (platformSdkCodenames.length == 0
+ && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
+ targetCode)) {
+ Slog.w(TAG, "Parsed package " + pkgName + " requires development platform " + targetCode
+ + ", returning current version " + Build.VERSION.SDK_INT);
+ return input.success(Build.VERSION.SDK_INT);
+ }
+
try {
if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) {
return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
}
} catch (IllegalArgumentException e) {
- // isAtMost() throws it when encountering an older SDK codename
- return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, e.getMessage());
- }
-
- // If it's a pre-release SDK and the codename matches this platform, it
- // definitely targets this SDK.
- if (matchTargetCode(platformSdkCodenames, targetCode)) {
- return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
+ return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, "Bad package SDK");
}
// Otherwise, we're looking at an incompatible pre-release SDK.
diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java
index 059bd84..22e8251 100644
--- a/core/java/android/os/storage/StorageManagerInternal.java
+++ b/core/java/android/os/storage/StorageManagerInternal.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.content.pm.UserInfo;
import android.os.IVold;
import java.util.List;
@@ -169,4 +170,19 @@
*/
public abstract void registerCloudProviderChangeListener(
@NonNull CloudProviderChangeListener listener);
+
+ /**
+ * Prepares user data directories before moving storage or apps. This is required as adoptable
+ * storage unlock is tied to the prepare user data and storage needs to be unlocked before
+ * performing any operations on it. This will also create user data directories before
+ * initiating the move operations, which essential for ensuring the directories to have correct
+ * SELinux labels and permissions.
+ *
+ * @param fromVolumeUuid the source volume UUID from which content needs to be transferred
+ * @param toVolumeUuid the destination volume UUID to which contents are to be transferred
+ * @param users a list of users for whom to prepare storage
+ */
+ public abstract void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid,
+ List<UserInfo> users);
+
}
diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS
index 7140ff1..dd17788 100644
--- a/core/java/android/security/OWNERS
+++ b/core/java/android/security/OWNERS
@@ -7,5 +7,4 @@
per-file NetworkSecurityPolicy.java = klyubin@google.com
per-file FrameworkNetworkSecurityPolicy.java = cbrubaker@google.com
per-file FrameworkNetworkSecurityPolicy.java = klyubin@google.com
-per-file Confirmation*.java = jdanis@google.com
-per-file Confirmation*.java = swillden@google.com
+per-file Confirmation*.java = file:/keystore/OWNERS
diff --git a/core/java/android/security/keystore/OWNERS b/core/java/android/security/keystore/OWNERS
index 65129a4..d9e0116 100644
--- a/core/java/android/security/keystore/OWNERS
+++ b/core/java/android/security/keystore/OWNERS
@@ -1,5 +1 @@
-# Bug component: 189335
-
-swillden@google.com
-jdanis@google.com
-jbires@google.com
+include /keystore/OWNERS
diff --git a/core/java/android/security/keystore/recovery/OWNERS b/core/java/android/security/keystore/recovery/OWNERS
deleted file mode 100644
index 65129a4..0000000
--- a/core/java/android/security/keystore/recovery/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# Bug component: 189335
-
-swillden@google.com
-jdanis@google.com
-jbires@google.com
diff --git a/core/java/android/speech/OWNERS b/core/java/android/speech/OWNERS
index 162e029..0f2f8ad 100644
--- a/core/java/android/speech/OWNERS
+++ b/core/java/android/speech/OWNERS
@@ -1,5 +1,4 @@
volnov@google.com
eugeniom@google.com
schfan@google.com
-andreaambu@google.com
-hackz@google.com
\ No newline at end of file
+hackz@google.com
diff --git a/core/tests/coretests/src/android/security/keystore/OWNERS b/core/tests/coretests/src/android/security/keystore/OWNERS
new file mode 100644
index 0000000..d9e0116
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/OWNERS
@@ -0,0 +1 @@
+include /keystore/OWNERS
diff --git a/keystore/OWNERS b/keystore/OWNERS
index 7ab9d76..913f655 100644
--- a/keystore/OWNERS
+++ b/keystore/OWNERS
@@ -1,4 +1,4 @@
+# Bug component: 189335
eranm@google.com
jbires@google.com
-jdanis@google.com
swillden@google.com
diff --git a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
index 54955c6..1394bd4 100644
--- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
@@ -325,32 +325,25 @@
args.add(KeyStore2ParameterUtils.makeBool(
KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED));
} else {
- if (spec.getUserAuthenticationValidityDurationSeconds() == 0) {
- // Every use of this key needs to be authorized by the user.
- addSids(args, spec);
- args.add(KeyStore2ParameterUtils.makeEnum(
- KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType()
- ));
-
- if (spec.isUserAuthenticationValidWhileOnBody()) {
- throw new ProviderException(
- "Key validity extension while device is on-body is not "
- + "supported for keys requiring fingerprint authentication");
- }
- } else {
- addSids(args, spec);
- args.add(KeyStore2ParameterUtils.makeEnum(
- KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType()
- ));
+ addSids(args, spec);
+ args.add(KeyStore2ParameterUtils.makeEnum(
+ KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType()
+ ));
+ if (spec.getUserAuthenticationValidityDurationSeconds() != 0) {
args.add(KeyStore2ParameterUtils.makeInt(
KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
spec.getUserAuthenticationValidityDurationSeconds()
));
- if (spec.isUserAuthenticationValidWhileOnBody()) {
- args.add(KeyStore2ParameterUtils.makeBool(
- KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY
- ));
+ }
+ if (spec.isUserAuthenticationValidWhileOnBody()) {
+ if (spec.getUserAuthenticationValidityDurationSeconds() == 0) {
+ throw new ProviderException(
+ "Key validity extension while device is on-body is not "
+ + "supported for keys requiring fingerprint authentication");
}
+ args.add(KeyStore2ParameterUtils.makeBool(
+ KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY
+ ));
}
}
}
diff --git a/libs/androidfw/OWNERS b/libs/androidfw/OWNERS
index 17f5164..436f107 100644
--- a/libs/androidfw/OWNERS
+++ b/libs/androidfw/OWNERS
@@ -4,4 +4,4 @@
patb@google.com
per-file CursorWindow.cpp=omakoto@google.com
-per-file LocaleDataTables.cpp=vichang@google.com,ngeoffray@google.com,nikitai@google.com
+per-file LocaleDataTables.cpp=vichang@google.com,ngeoffray@google.com
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 08d8be8..08c71c3 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1377,6 +1377,16 @@
return mVold.supportsBlockCheckpoint();
}
+ private void prepareUserStorageForMoveInternal(String fromVolumeUuid, String toVolumeUuid,
+ List<UserInfo> users) throws Exception {
+
+ final int flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
+ for (UserInfo user : users) {
+ prepareUserStorageInternal(fromVolumeUuid, user.id, user.serialNumber, flags);
+ prepareUserStorageInternal(toVolumeUuid, user.id, user.serialNumber, flags);
+ }
+ }
+
@Override
public void onAwakeStateChanged(boolean isAwake) {
// Ignored
@@ -2986,6 +2996,7 @@
final VolumeInfo from;
final VolumeInfo to;
+ final List<UserInfo> users;
synchronized (mLock) {
if (Objects.equals(mPrimaryStorageUuid, volumeUuid)) {
@@ -2999,7 +3010,7 @@
mMoveTargetUuid = volumeUuid;
// We need all the users unlocked to move their primary storage
- final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+ users = mContext.getSystemService(UserManager.class).getUsers();
for (UserInfo user : users) {
if (StorageManager.isFileEncrypted() && !isUserKeyUnlocked(user.id)) {
Slog.w(TAG, "Failing move due to locked user " + user.id);
@@ -3035,6 +3046,19 @@
}
}
+ // Prepare the storage before move, this is required to unlock adoptable storage (as the
+ // keys are tied to prepare user data step) & also is required for the destination files to
+ // end up with the correct SELinux labels and encryption policies for directories
+ try {
+ prepareUserStorageForMoveInternal(mPrimaryStorageUuid, volumeUuid, users);
+ } catch (Exception e) {
+ Slog.w(TAG, "Failing move due to failure on prepare user data", e);
+ synchronized (mLock) {
+ onMoveStatusLocked(PackageManager.MOVE_FAILED_INTERNAL_ERROR);
+ }
+ return;
+ }
+
try {
mVold.moveStorage(from.id, to.id, new IVoldTaskListener.Stub() {
@Override
@@ -5024,5 +5048,16 @@
mCloudProviderChangeListeners.add(listener);
mHandler.obtainMessage(H_CLOUD_MEDIA_PROVIDER_CHANGED, listener);
}
+
+ @Override
+ public void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid,
+ List<UserInfo> users) {
+ try {
+ prepareUserStorageForMoveInternal(fromVolumeUuid, toVolumeUuid, users);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
}
diff --git a/services/core/java/com/android/server/net/watchlist/OWNERS b/services/core/java/com/android/server/net/watchlist/OWNERS
index a3d4b85..d0c4e55 100644
--- a/services/core/java/com/android/server/net/watchlist/OWNERS
+++ b/services/core/java/com/android/server/net/watchlist/OWNERS
@@ -1,3 +1,2 @@
-rickywai@google.com
alanstokes@google.com
simonjw@google.com
diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java
index 1f96205..139d9cf 100644
--- a/services/core/java/com/android/server/pm/MovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/MovePackageHelper.java
@@ -48,8 +48,8 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.storage.StorageManager;
+import android.os.storage.StorageManagerInternal;
import android.os.storage.VolumeInfo;
-import android.text.TextUtils;
import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseIntArray;
@@ -63,6 +63,7 @@
import com.android.server.pm.pkg.PackageStateUtils;
import java.io.File;
+import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -223,9 +224,7 @@
}
try {
- for (int index = 0; index < installedUserIds.length; index++) {
- prepareUserDataForVolumeIfRequired(volumeUuid, installedUserIds[index], storage);
- }
+ prepareUserStorageForMove(currentVolumeUuid, volumeUuid, installedUserIds);
} catch (RuntimeException e) {
freezer.close();
throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
@@ -380,27 +379,20 @@
return true;
}
- private void prepareUserDataForVolumeIfRequired(String volumeUuid, int userId,
- StorageManager storageManager) {
- if (TextUtils.isEmpty(volumeUuid)
- || doesDataDirectoryExistForUser(volumeUuid, userId)) {
- return;
- }
+ private void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid,
+ int[] userIds) {
if (DEBUG_INSTALL) {
- Slog.d(TAG, "Preparing user directories for user u" + userId + " for UUID "
- + volumeUuid);
+ Slog.d(TAG, "Preparing user directories before moving app, from UUID " + fromVolumeUuid
+ + " to UUID " + toVolumeUuid);
}
- final UserInfo user = mPm.mUserManager.getUserInfo(userId);
- if (user == null) return;
- // This call is same as StorageEventHelper#loadPrivatePackagesInner which prepares
- // the storage before reconciling apps
- storageManager.prepareUserStorage(volumeUuid, user.id, user.serialNumber,
- StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
- }
-
- private boolean doesDataDirectoryExistForUser(String uuid, int userId) {
- final File userDirectoryFile = Environment.getDataUserCeDirectory(uuid, userId);
- return userDirectoryFile != null && userDirectoryFile.exists();
+ final StorageManagerInternal smInternal =
+ mPm.mInjector.getLocalService(StorageManagerInternal.class);
+ final ArrayList<UserInfo> users = new ArrayList<>();
+ for (int userId : userIds) {
+ final UserInfo user = mPm.mUserManager.getUserInfo(userId);
+ users.add(user);
+ }
+ smInternal.prepareUserStorageForMove(fromVolumeUuid, toVolumeUuid, users);
}
public static class MoveCallbacks extends Handler {
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
index 810fa5f..9dae523 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
@@ -1546,6 +1546,7 @@
private static ParseResult<ParsingPackage> parseUsesSdk(ParseInput input,
ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags)
throws IOException, XmlPullParserException {
+ String pkgName = (pkg != null) ? pkg.getPackageName() : "<unknown>";
if (SDK_VERSION > 0) {
final boolean isApkInApex = (flags & PARSE_APK_IN_APEX) != 0;
TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestUsesSdk);
@@ -1595,7 +1596,7 @@
ParseResult<Integer> targetSdkVersionResult = FrameworkParsingPackageUtils
.computeTargetSdkVersion(targetVers, targetCode, SDK_CODENAMES, input,
- isApkInApex);
+ isApkInApex, pkgName);
if (targetSdkVersionResult.isError()) {
return input.error(targetSdkVersionResult);
}
@@ -1609,7 +1610,8 @@
}
ParseResult<Integer> minSdkVersionResult = FrameworkParsingPackageUtils
- .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES, input);
+ .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES,
+ input, pkgName);
if (minSdkVersionResult.isError()) {
return input.error(minSdkVersionResult);
}
diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS
index 0af9fe9..26abe51 100644
--- a/services/core/java/com/android/server/wm/OWNERS
+++ b/services/core/java/com/android/server/wm/OWNERS
@@ -18,4 +18,4 @@
yunfanc@google.com
per-file BackgroundActivityStartController.java = set noparent
-per-file BackgroundActivityStartController.java = brufino@google.com, ogunwale@google.com, louischang@google.com, lus@google.com, rickywai@google.com
+per-file BackgroundActivityStartController.java = brufino@google.com, ogunwale@google.com, louischang@google.com, lus@google.com
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java
index c6a6340..8961072d 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java
@@ -111,7 +111,8 @@
minSdkCodename,
PLATFORM_VERSION,
isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE,
- input);
+ input,
+ null);
if (expectedMinSdk == -1) {
assertTrue(result.isError());
@@ -206,7 +207,7 @@
targetSdkCodename,
isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE,
input,
- allowUnknownCodenames);
+ allowUnknownCodenames, null);
if (expectedTargetSdk == -1) {
assertTrue(result.isError());
diff --git a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
index 92c7871..687e8f7 100644
--- a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
@@ -446,14 +446,14 @@
+ " <library \n"
+ " name=\"foo\"\n"
+ " file=\"" + mFooJar + "\"\n"
- + " on-bootclasspath-before=\"Q\"\n"
+ + " on-bootclasspath-before=\"A\"\n"
+ " on-bootclasspath-since=\"W\"\n"
+ " />\n\n"
+ " </permissions>";
parseSharedLibraries(contents);
assertFooIsOnlySharedLibrary();
SystemConfig.SharedLibraryEntry entry = mSysConfig.getSharedLibraries().get("foo");
- assertThat(entry.onBootclasspathBefore).isEqualTo("Q");
+ assertThat(entry.onBootclasspathBefore).isEqualTo("A");
assertThat(entry.onBootclasspathSince).isEqualTo("W");
}
diff --git a/telecomm/java/android/telecom/RemoteConnectionManager.java b/telecomm/java/android/telecom/RemoteConnectionManager.java
index fbbfefd..fbf8eef 100644
--- a/telecomm/java/android/telecom/RemoteConnectionManager.java
+++ b/telecomm/java/android/telecom/RemoteConnectionManager.java
@@ -39,18 +39,21 @@
void addConnectionService(
ComponentName componentName,
IConnectionService outgoingConnectionServiceRpc) {
- if (!mRemoteConnectionServices.containsKey(componentName)) {
- try {
- RemoteConnectionService remoteConnectionService = new RemoteConnectionService(
- outgoingConnectionServiceRpc,
- mOurConnectionServiceImpl);
- mRemoteConnectionServices.put(componentName, remoteConnectionService);
- } catch (RemoteException e) {
- Log.w(RemoteConnectionManager.this,
- "error when addConnectionService of %s: %s", componentName,
- e.toString());
- }
- }
+ mRemoteConnectionServices.computeIfAbsent(
+ componentName,
+ key -> {
+ try {
+ return new RemoteConnectionService(
+ outgoingConnectionServiceRpc, mOurConnectionServiceImpl);
+ } catch (RemoteException e) {
+ Log.w(
+ RemoteConnectionManager.this,
+ "error when addConnectionService of %s: %s",
+ componentName,
+ e.toString());
+ return null;
+ }
+ });
}
public RemoteConnection createRemoteConnection(
@@ -63,17 +66,14 @@
}
ComponentName componentName = request.getAccountHandle().getComponentName();
- if (!mRemoteConnectionServices.containsKey(componentName)) {
+ RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
+ if (remoteService == null) {
throw new UnsupportedOperationException("accountHandle not supported: "
+ componentName);
}
- RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
- if (remoteService != null) {
- return remoteService.createRemoteConnection(
- connectionManagerPhoneAccount, request, isIncoming);
- }
- return null;
+ return remoteService.createRemoteConnection(
+ connectionManagerPhoneAccount, request, isIncoming);
}
/**
@@ -94,17 +94,14 @@
}
ComponentName componentName = request.getAccountHandle().getComponentName();
- if (!mRemoteConnectionServices.containsKey(componentName)) {
+ RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
+ if (remoteService == null) {
throw new UnsupportedOperationException("accountHandle not supported: "
+ componentName);
}
- RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
- if (remoteService != null) {
- return remoteService.createRemoteConference(
- connectionManagerPhoneAccount, request, isIncoming);
- }
- return null;
+ return remoteService.createRemoteConference(
+ connectionManagerPhoneAccount, request, isIncoming);
}
public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) {
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index d02fd83..51cf38b 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -353,8 +353,8 @@
}
static void printUsesPermission(const String8& name, bool optional=false, int maxSdkVersion=-1,
- const String8& requiredFeature = String8::empty(),
- const String8& requiredNotFeature = String8::empty()) {
+ const String8& requiredFeature = String8(),
+ const String8& requiredNotFeature = String8()) {
printf("uses-permission: name='%s'", ResTable::normalizeForOutput(name.string()).string());
if (maxSdkVersion != -1) {
printf(" maxSdkVersion='%d'", maxSdkVersion);
diff --git a/tools/hiddenapi/OWNERS b/tools/hiddenapi/OWNERS
index afbeef5..dc82aac 100644
--- a/tools/hiddenapi/OWNERS
+++ b/tools/hiddenapi/OWNERS
@@ -1,5 +1,4 @@
# compat-team@ for changes to hiddenapi files
-andreionea@google.com
mathewi@google.com
satayev@google.com