diff --git a/api/system-current.txt b/api/system-current.txt index c9de97ed4a9a6..0853adcabd115 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -155,6 +155,7 @@ package android { field public static final String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES"; field public static final String RADIO_SCAN_WITHOUT_LOCATION = "android.permission.RADIO_SCAN_WITHOUT_LOCATION"; field public static final String READ_ACTIVE_EMERGENCY_SESSION = "android.permission.READ_ACTIVE_EMERGENCY_SESSION"; + field public static final String READ_CARRIER_APP_INFO = "android.permission.READ_CARRIER_APP_INFO"; field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS"; field public static final String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS"; field public static final String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG"; @@ -1753,6 +1754,7 @@ package android.content { field public static final String SECURE_ELEMENT_SERVICE = "secure_element"; field public static final String STATS_MANAGER = "stats"; field public static final String STATUS_BAR_SERVICE = "statusbar"; + field public static final String SYSTEM_CONFIG_SERVICE = "system_config"; field public static final String SYSTEM_UPDATE_SERVICE = "system_update"; field public static final String TELEPHONY_IMS_SERVICE = "telephony_ims"; field public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry"; @@ -7485,6 +7487,11 @@ package android.os { field public static final int TUPLE_VALUE_TYPE = 7; // 0x7 } + public class SystemConfigManager { + method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Set getDisabledUntilUsedPreinstalledCarrierApps(); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Map> getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); + } + public class SystemProperties { method @NonNull public static String get(@NonNull String); method @NonNull public static String get(@NonNull String, @Nullable String); diff --git a/api/test-current.txt b/api/test-current.txt index 519ead8394b95..b1003d61495e1 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2181,6 +2181,11 @@ package android.os { method public void log(android.os.StrictMode.ViolationInfo); } + public class SystemConfigManager { + method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Set getDisabledUntilUsedPreinstalledCarrierApps(); + method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Map> getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); + } + public class SystemProperties { method @NonNull public static String get(@NonNull String); method @NonNull public static String get(@NonNull String, @Nullable String); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 7b21f12e04f13..c1e535643ddf7 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -148,6 +148,7 @@ import android.os.RecoverySystem; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; +import android.os.SystemConfigManager; import android.os.SystemUpdateManager; import android.os.SystemVibrator; import android.os.UserHandle; @@ -627,6 +628,13 @@ public final class SystemServiceRegistry { return new SystemUpdateManager(service); }}); + registerService(Context.SYSTEM_CONFIG_SERVICE, SystemConfigManager.class, + new CachedServiceFetcher() { + @Override + public SystemConfigManager createService(ContextImpl ctx) { + return new SystemConfigManager(); + }}); + registerService(Context.TELEPHONY_REGISTRY_SERVICE, TelephonyRegistryManager.class, new CachedServiceFetcher() { @Override diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 3df94a7e233a2..2943e398dd876 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5018,6 +5018,14 @@ public abstract class Context { @TestApi public static final String TELEPHONY_IMS_SERVICE = "telephony_ims"; + /** + * Use with {@link #getSystemService(String)} to retrieve an + * {@link android.os.SystemConfigManager}. + * @hide + */ + @SystemApi + public static final String SYSTEM_CONFIG_SERVICE = "system_config"; + /** * Use with {@link #getSystemService(String)} to retrieve an * {@link android.telephony.ims.RcsMessageManager}. diff --git a/core/java/android/os/ISystemConfig.aidl b/core/java/android/os/ISystemConfig.aidl new file mode 100644 index 0000000000000..d3b029854112f --- /dev/null +++ b/core/java/android/os/ISystemConfig.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2020 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +/** + * Binder interface to query SystemConfig in the system server. + * {@hide} + */ +interface ISystemConfig { + /** + * @see SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierApps + */ + List getDisabledUntilUsedPreinstalledCarrierApps(); + + /** + * @see SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierAssociatedApps + */ + Map getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); +} diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java new file mode 100644 index 0000000000000..3a9ce2fa85f13 --- /dev/null +++ b/core/java/android/os/SystemConfigManager.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2020 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.os; + +import android.Manifest; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; +import android.annotation.SystemService; +import android.annotation.TestApi; +import android.content.Context; +import android.util.ArraySet; +import android.util.Log; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** + * Allows apps outside the system process to access various bits of configuration defined in + * /etc/sysconfig and its counterparts on OEM and vendor partitions. + * + * TODO: Intended for access by system mainline modules only. Marking as SystemApi until the + * module-only API surface is available. + * @hide + */ +@SystemApi +@TestApi +@SystemService(Context.SYSTEM_CONFIG_SERVICE) +public class SystemConfigManager { + private static final String TAG = SystemConfigManager.class.getSimpleName(); + + private final ISystemConfig mInterface; + + /** @hide **/ + public SystemConfigManager() { + mInterface = ISystemConfig.Stub.asInterface( + ServiceManager.getService(Context.SYSTEM_CONFIG_SERVICE)); + } + + /** + * Returns a set of package names for carrier apps that are preinstalled on the device but + * should be disabled until the matching carrier's SIM is inserted into the device. + * @return A set of package names. + */ + @RequiresPermission(Manifest.permission.READ_CARRIER_APP_INFO) + public @NonNull Set getDisabledUntilUsedPreinstalledCarrierApps() { + try { + List apps = mInterface.getDisabledUntilUsedPreinstalledCarrierApps(); + return new ArraySet<>(apps); + } catch (RemoteException e) { + Log.e(TAG, "Caught remote exception"); + return Collections.emptySet(); + } + } + + /** + * Returns a map that describes helper apps associated with carrier apps that, like the apps + * returned by {@link #getDisabledUntilUsedPreinstalledCarrierApps()}, should be disabled until + * the correct SIM is inserted into the device. + * @return A map with keys corresponding to package names returned by + * {@link #getDisabledUntilUsedPreinstalledCarrierApps()} and values as lists of package + * names of helper apps. + */ + @RequiresPermission(Manifest.permission.READ_CARRIER_APP_INFO) + public @NonNull Map> + getDisabledUntilUsedPreinstalledCarrierAssociatedApps() { + try { + return (Map>) + mInterface.getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); + } catch (RemoteException e) { + Log.e(TAG, "Caught remote exception"); + return Collections.emptyMap(); + } + } +} diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 7181142440597..490c47796472c 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2234,6 +2234,14 @@ + + + diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index ad99ab3351450..46a7d830ac3d0 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -153,6 +153,7 @@ applications that come with the platform + @@ -311,6 +312,7 @@ applications that come with the platform + diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 1c63efc3b5bcb..fb9bc522f5274 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -221,7 +221,10 @@ - + + + + diff --git a/services/java/com/android/server/SystemConfigService.java b/services/java/com/android/server/SystemConfigService.java new file mode 100644 index 0000000000000..e8ab10124ef8b --- /dev/null +++ b/services/java/com/android/server/SystemConfigService.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2020 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server; + +import android.Manifest; +import android.content.Context; +import android.os.ISystemConfig; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Service class that runs inside the system_server process to handle queries to + * {@link com.android.server.SystemConfig}. + * @hide + */ +public class SystemConfigService extends SystemService { + private final Context mContext; + + private final ISystemConfig.Stub mInterface = new ISystemConfig.Stub() { + @Override + public List getDisabledUntilUsedPreinstalledCarrierApps() { + mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_CARRIER_APP_INFO, + "getDisabledUntilUsedPreInstalledCarrierApps requires READ_CARRIER_APP_INFO"); + return new ArrayList<>( + SystemConfig.getInstance().getDisabledUntilUsedPreinstalledCarrierApps()); + } + + @Override + public Map getDisabledUntilUsedPreinstalledCarrierAssociatedApps() { + mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_CARRIER_APP_INFO, + "getDisabledUntilUsedPreInstalledCarrierAssociatedApps requires" + + " READ_CARRIER_APP_INFO"); + return SystemConfig.getInstance() + .getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); + } + }; + + public SystemConfigService(Context context) { + super(context); + mContext = context; + } + + @Override + public void onStart() { + publishBinderService(Context.SYSTEM_CONFIG_SERVICE, mInterface); + } +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 92bdba03fa093..66d1407677736 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -902,6 +902,11 @@ public final class SystemServer { private void startCoreServices(@NonNull TimingsTraceAndSlog t) { t.traceBegin("startCoreServices"); + // Service for system config + t.traceBegin("StartSystemConfigService"); + mSystemServiceManager.startService(SystemConfigService.class); + t.traceEnd(); + t.traceBegin("StartBatteryService"); // Tracks the battery level. Requires LightService. mSystemServiceManager.startService(BatteryService.class);