diff options
| -rw-r--r-- | core/java/android/content/om/OverlayManager.java | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/ApplicationInfo.java | 16 | ||||
| -rw-r--r-- | core/java/android/os/ISystemConfig.aidl | 5 | ||||
| -rw-r--r-- | core/java/android/os/SystemConfigManager.java | 14 | ||||
| -rw-r--r-- | packages/SettingsProvider/AndroidManifest.xml | 1 | ||||
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 12 | ||||
| -rw-r--r-- | services/core/java/com/android/server/SystemConfig.java (renamed from core/java/com/android/server/SystemConfig.java) | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java | 6 | ||||
| -rw-r--r-- | services/java/com/android/server/SystemConfigService.java | 7 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt | 3 |
10 files changed, 59 insertions, 13 deletions
diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 0f7e01b234c2..94275aea0c4d 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -31,8 +31,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import com.android.server.SystemConfig; - import java.util.List; /** @@ -50,7 +48,7 @@ import java.util.List; * <overlayable name="OverlayableResourcesName" actor="overlay://namespace/actorName"> * }</pre></p> * - * <p>Actors are defined through {@link SystemConfig}. Only system packages can be used. + * <p>Actors are defined through SystemConfig. Only system packages can be used. * The namespace "android" is reserved for use by AOSP and any "android" definitions must * have an implementation on device that fulfill their intended functionality.</p> * diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index e13f60c3265b..2c28268d0772 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -45,7 +45,6 @@ import android.window.OnBackInvokedCallback; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Parcelling; import com.android.internal.util.Parcelling.BuiltIn.ForBoolean; -import com.android.server.SystemConfig; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -803,7 +802,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE = 1 << 2; - /** * If false, {@link android.view.KeyEvent#KEYCODE_BACK} related events will be forwarded to * the Activities, Dialogs and Views and {@link android.app.Activity#onBackPressed()}, @@ -815,12 +813,24 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK = 1 << 3; + /** + * Whether or not this package is allowed to access hidden APIs. Replacement for legacy + * implementation of {@link #isPackageWhitelistedForHiddenApis()}. + * + * This is an internal flag and should never be used outside of this class. The real API for + * the hidden API enforcement policy is {@link #getHiddenApiEnforcementPolicy()}. + * + * @hide + */ + public static final int PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS = 1 << 4; + /** @hide */ @IntDef(flag = true, prefix = { "PRIVATE_FLAG_EXT_" }, value = { PRIVATE_FLAG_EXT_PROFILEABLE, PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION, PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE, PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK, + PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoPrivateFlagsExt {} @@ -2222,7 +2232,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } private boolean isPackageWhitelistedForHiddenApis() { - return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName); + return (privateFlagsExt & PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS) != 0; } /** diff --git a/core/java/android/os/ISystemConfig.aidl b/core/java/android/os/ISystemConfig.aidl index 15e3ce25122b..61b24aa55e30 100644 --- a/core/java/android/os/ISystemConfig.aidl +++ b/core/java/android/os/ISystemConfig.aidl @@ -47,4 +47,9 @@ interface ISystemConfig { * @see SystemConfigManager#getEnabledComponentOverrides */ List<ComponentName> getEnabledComponentOverrides(String packageName); + + /** + * @see SystemConfigManager#getDefaultVrComponents + */ + List<ComponentName> getDefaultVrComponents(); } diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java index cde2063fdba5..77843d9fbb0a 100644 --- a/core/java/android/os/SystemConfigManager.java +++ b/core/java/android/os/SystemConfigManager.java @@ -147,4 +147,18 @@ public class SystemConfigManager { throw e.rethrowFromSystemServer(); } } + + /** + * Return the components that are enabled by default as VR mode listener services. + * @hide + */ + @RequiresPermission(android.Manifest.permission.QUERY_ALL_PACKAGES) + public List<ComponentName> getDefaultVrComponents() { + try { + return mInterface.getDefaultVrComponents(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + return Collections.emptyList(); + } } diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml index c5bea2ea6791..79677eeac429 100644 --- a/packages/SettingsProvider/AndroidManifest.xml +++ b/packages/SettingsProvider/AndroidManifest.xml @@ -4,6 +4,7 @@ android:sharedUserId="android.uid.system"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> + <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <application android:allowClearUserData="false" android:label="@string/app_label" diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 8efec671e582..3a25d85b5ecf 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -86,6 +86,7 @@ import android.os.RemoteCallback; import android.os.RemoteException; import android.os.SELinux; import android.os.ServiceManager; +import android.os.SystemConfigManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; @@ -110,12 +111,11 @@ import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; import com.android.internal.util.FrameworkStatsLog; import com.android.providers.settings.SettingsState.Setting; -import com.android.server.SystemConfig; - -import com.google.android.collect.Sets; import libcore.util.HexEncoding; +import com.google.android.collect.Sets; + import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; @@ -368,6 +368,8 @@ public class SettingsProvider extends ContentProvider { // We have to call in the package manager with no lock held, private volatile IPackageManager mPackageManager; + private volatile SystemConfigManager mSysConfigManager; + @GuardedBy("mLock") private boolean mSyncConfigDisabledUntilReboot; @@ -397,6 +399,7 @@ public class SettingsProvider extends ContentProvider { synchronized (mLock) { mUserManager = UserManager.get(getContext()); mPackageManager = AppGlobals.getPackageManager(); + mSysConfigManager = getContext().getSystemService(SystemConfigManager.class); mHandlerThread = new HandlerThread(LOG_TAG, Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); @@ -3875,8 +3878,7 @@ public class SettingsProvider extends ContentProvider { Setting currentSetting = secureSettings.getSettingLocked( Settings.Secure.ENABLED_VR_LISTENERS); if (currentSetting.isNull()) { - ArraySet<ComponentName> l = - SystemConfig.getInstance().getDefaultVrComponents(); + List<ComponentName> l = mSysConfigManager.getDefaultVrComponents(); if (l != null && !l.isEmpty()) { StringBuilder b = new StringBuilder(); diff --git a/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java index 2c9ef4f3c059..b7f8d38171a2 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,6 +72,8 @@ import java.util.Set; * Loads global system configuration info. * Note: Initializing this class hits the disk and is slow. This class should generally only be * accessed by the system_server process. + * + * @hide */ public class SystemConfig { static final String TAG = "SystemConfig"; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index be3a4dab6152..6b3155504f5f 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -54,6 +54,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.server.SystemConfig; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.pkg.AndroidPackage; @@ -1005,11 +1006,14 @@ public class PackageInfoUtils { /** @see ApplicationInfo#privateFlagsExt */ public static int appInfoPrivateFlagsExt(AndroidPackage pkg, @Nullable PackageStateInternal pkgSetting) { + var isAllowlistedForHiddenApis = SystemConfig.getInstance().getHiddenApiWhitelistedApps() + .contains(pkg.getPackageName()); // @formatter:off int pkgWithoutStateFlags = flag(pkg.isProfileable(), ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) | flag(pkg.hasRequestForegroundServiceExemption(), ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION) | flag(pkg.areAttributionsUserVisible(), ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) - | flag(pkg.isOnBackInvokedCallbackEnabled(), ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK); + | flag(pkg.isOnBackInvokedCallbackEnabled(), ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK) + | flag(isAllowlistedForHiddenApis, ApplicationInfo.PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS); return appInfoPrivateFlagsExt(pkgWithoutStateFlags, pkgSetting); // @formatter:on } diff --git a/services/java/com/android/server/SystemConfigService.java b/services/java/com/android/server/SystemConfigService.java index cb52e5f72d5f..6e82907d4361 100644 --- a/services/java/com/android/server/SystemConfigService.java +++ b/services/java/com/android/server/SystemConfigService.java @@ -101,6 +101,13 @@ public class SystemConfigService extends SystemService { } return enabledComponent; } + + @Override + public List<ComponentName> getDefaultVrComponents() { + getContext().enforceCallingOrSelfPermission(Manifest.permission.QUERY_ALL_PACKAGES, + "Caller must hold " + Manifest.permission.QUERY_ALL_PACKAGES); + return new ArrayList<>(SystemConfig.getInstance().getDefaultVrComponents()); + } }; public SystemConfigService(Context context) { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index cc57b9f913e3..dc7bcd625ee3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -38,6 +38,7 @@ import android.os.UserManager import android.os.incremental.IncrementalManager import android.provider.DeviceConfig import android.util.ArrayMap +import android.util.ArraySet import android.util.DisplayMetrics import android.util.EventLog import android.view.Display @@ -294,6 +295,8 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { wheneverStatic { SystemConfig.getInstance() }.thenReturn(mocks.systemConfig) whenever(mocks.systemConfig.availableFeatures).thenReturn(DEFAULT_AVAILABLE_FEATURES_MAP) whenever(mocks.systemConfig.sharedLibraries).thenReturn(DEFAULT_SHARED_LIBRARIES_LIST) + whenever(mocks.systemConfig.defaultVrComponents).thenReturn(ArraySet()) + whenever(mocks.systemConfig.hiddenApiWhitelistedApps).thenReturn(ArraySet()) wheneverStatic { SystemProperties.getBoolean("fw.free_cache_v2", true) }.thenReturn(true) wheneverStatic { Environment.getPackageCacheDirectory() }.thenReturn(packageCacheDirectory) wheneverStatic { SystemProperties.digestOf("ro.build.fingerprint") }.thenReturn("cacheName") |