/* * 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.FlaggedApi; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.ComponentName; import android.content.Context; import android.content.pm.SignedPackage; import android.content.pm.SignedPackageParcel; import android.util.ArraySet; import android.util.Log; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * 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 @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(); } } /** * 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. * *

TODO(b/159069037) expose this and get rid of the other method that omits SDK version. * * @return A map with keys corresponding to package names returned by * {@link #getDisabledUntilUsedPreinstalledCarrierApps()} and values as lists of package * names of helper apps and the SDK versions when they were first added. * * @hide */ @RequiresPermission(Manifest.permission.READ_CARRIER_APP_INFO) public @NonNull Map> getDisabledUntilUsedPreinstalledCarrierAssociatedAppEntries() { try { return (Map>) mInterface.getDisabledUntilUsedPreinstalledCarrierAssociatedAppEntries(); } catch (RemoteException e) { Log.e(TAG, "Caught remote exception", e); return Collections.emptyMap(); } } /** * Get uids which have been granted given permission in system configuration. * * The uids and assigning permissions are defined on data/etc/platform.xml * * @param permissionName The target permission. * @return The uids have been granted given permission in system configuration. */ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS) @NonNull public int[] getSystemPermissionUids(@NonNull String permissionName) { try { return mInterface.getSystemPermissionUids(permissionName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Get enabled component for a specific package * * @param packageName The target package. * @return The enabled component * {@hide} */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @NonNull public List getEnabledComponentOverrides(@NonNull String packageName) { try { return mInterface.getEnabledComponentOverrides(packageName); } catch (RemoteException e) { 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 getDefaultVrComponents() { try { return mInterface.getDefaultVrComponents(); } catch (RemoteException e) { e.rethrowFromSystemServer(); } return Collections.emptyList(); } /** * Return the packages that are prevented from being disabled, where if * disabled it would result in a non-functioning system or similar. * @hide */ @NonNull public List getPreventUserDisablePackages() { try { return mInterface.getPreventUserDisablePackages(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns a set of signed packages, represented as (packageName, certificateDigest) pairs, that * should be considered "trusted packages" by ECM (Enhanced Confirmation Mode). * *

"Trusted packages" are exempt from ECM (i.e., they will never be considered "restricted"). * *

A package will be considered "trusted package" if and only if it *matches* least one of * the (*packageName*, *certificateDigest*) pairs in this set, where *matches* means satisfying * both of the following: * *

    *
  1. The package's name equals *packageName* *
  2. The package is, or was ever, signed by *certificateDigest*, according to the package's * {@link android.content.pm.SigningDetails} *
* * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @FlaggedApi(android.permission.flags.Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) @RequiresPermission(Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) @NonNull public Set getEnhancedConfirmationTrustedPackages() { try { List parcels = mInterface.getEnhancedConfirmationTrustedPackages(); return parcels.stream().map(SignedPackage::new).collect(Collectors.toSet()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns a set of signed packages, represented as (packageName, certificateDigest) pairs, that * should be considered "trusted installers" by ECM (Enhanced Confirmation Mode). * *

"Trusted installers", and all apps installed by a trusted installer, are exempt from ECM * (i.e., they will never be considered "restricted"). * *

A package will be considered a "trusted installer" if and only if it *matches* least one * of the (*packageName*, *certificateDigest*) pairs in this set, where *matches* means * satisfying both of the following: * *

    *
  1. The package's name equals *packageName* *
  2. The package is, or was ever, signed by *certificateDigest*, according to the package's * {@link android.content.pm.SigningDetails} *
* * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @FlaggedApi(android.permission.flags.Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) @RequiresPermission(Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) @NonNull public Set getEnhancedConfirmationTrustedInstallers() { try { List parcels = mInterface.getEnhancedConfirmationTrustedInstallers(); return parcels.stream().map(SignedPackage::new).collect(Collectors.toSet()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } }