diff options
22 files changed, 183 insertions, 114 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index c15b3e0b80c3..09b9bdade906 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1949,6 +1949,8 @@ public class PackageParser { 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 @@ public class PackageParser { 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 @@ public class PackageParser { * @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 @@ public class PackageParser { 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 @@ public class PackageParser { * @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 @@ public class PackageParser { 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 10d6f2d6d04b..7d995d084247 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -577,14 +577,14 @@ public class ApkLiteParseUtils { 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 3e1c5bb3d7ec..30e289f62698 100644 --- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java @@ -293,11 +293,14 @@ public class FrameworkParsingPackageUtils { * {@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 @@ public class FrameworkParsingPackageUtils { 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 @@ public class FrameworkParsingPackageUtils { * @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 059bd846327c..22e8251b3f52 100644 --- a/core/java/android/os/storage/StorageManagerInternal.java +++ b/core/java/android/os/storage/StorageManagerInternal.java @@ -19,6 +19,7 @@ package android.os.storage; 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 class StorageManagerInternal { */ 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 7140ff12be64..dd17788c7811 100644 --- a/core/java/android/security/OWNERS +++ b/core/java/android/security/OWNERS @@ -7,5 +7,4 @@ per-file NetworkSecurityPolicy.java = cbrubaker@google.com 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 65129a46d113..d9e01161ce6d 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 65129a46d113..000000000000 --- 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 162e02904075..0f2f8ad3d99e 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 000000000000..d9e01161ce6d --- /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 7ab9d761e236..913f65586cd6 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 54955c6b7fab..1394bd443f03 100644 --- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java +++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java @@ -325,32 +325,25 @@ public abstract class KeyStore2ParameterUtils { 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() + 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()) { + } + 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"); } - } else { - addSids(args, spec); - args.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType() + args.add(KeyStore2ParameterUtils.makeBool( + KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY )); - 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 - )); - } } } } diff --git a/libs/androidfw/OWNERS b/libs/androidfw/OWNERS index 17f5164cf417..436f10737cb4 100644 --- a/libs/androidfw/OWNERS +++ b/libs/androidfw/OWNERS @@ -4,4 +4,4 @@ zyy@google.com 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 08d8be81ca68..08c71c3eae70 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1377,6 +1377,16 @@ class StorageManagerService extends IStorageManager.Stub 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 @@ class StorageManagerService extends IStorageManager.Stub final VolumeInfo from; final VolumeInfo to; + final List<UserInfo> users; synchronized (mLock) { if (Objects.equals(mPrimaryStorageUuid, volumeUuid)) { @@ -2999,7 +3010,7 @@ class StorageManagerService extends IStorageManager.Stub 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 @@ class StorageManagerService extends IStorageManager.Stub } } + // 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 @@ class StorageManagerService extends IStorageManager.Stub 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 a3d4b85367cf..d0c4e553ad8c 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 1f96205aa3cb..139d9cfc75ae 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.RemoteCallbackList; 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.PackageStateInternal; 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 @@ public final class MovePackageHelper { } 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 @@ public final class MovePackageHelper { 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); - } - 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(); + Slog.d(TAG, "Preparing user directories before moving app, from UUID " + fromVolumeUuid + + " to UUID " + toVolumeUuid); + } + 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 810fa5f1e4b3..9dae523c22b5 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 @@ public class ParsingPackageUtils { 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 @@ public class ParsingPackageUtils { ParseResult<Integer> targetSdkVersionResult = FrameworkParsingPackageUtils .computeTargetSdkVersion(targetVers, targetCode, SDK_CODENAMES, input, - isApkInApex); + isApkInApex, pkgName); if (targetSdkVersionResult.isError()) { return input.error(targetSdkVersionResult); } @@ -1609,7 +1610,8 @@ public class ParsingPackageUtils { } 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 0af9fe930d83..26abe51c8c34 100644 --- a/services/core/java/com/android/server/wm/OWNERS +++ b/services/core/java/com/android/server/wm/OWNERS @@ -18,4 +18,4 @@ rgl@google.com 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 c6a634056087..8961072deaf8 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 @@ public class PackageParserLegacyCoreTest { minSdkCodename, PLATFORM_VERSION, isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, - input); + input, + null); if (expectedMinSdk == -1) { assertTrue(result.isError()); @@ -206,7 +207,7 @@ public class PackageParserLegacyCoreTest { 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 92c7871e611d..687e8f77b00d 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 @@ public class SystemConfigTest { + " <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 fbbfefd9d00e..fbf8eeffd947 100644 --- a/telecomm/java/android/telecom/RemoteConnectionManager.java +++ b/telecomm/java/android/telecom/RemoteConnectionManager.java @@ -39,18 +39,21 @@ public class RemoteConnectionManager { 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 @@ public class RemoteConnectionManager { } 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 @@ public class RemoteConnectionManager { } 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 d02fd83df6af..51cf38bce64e 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -353,8 +353,8 @@ static void printCompatibleScreens(ResXMLTree& tree, String8* outError) { } 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 afbeef5a0b41..dc82aac9d41c 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 |