Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e811f5a5 authored by Yan Yan's avatar Yan Yan Committed by Gerrit Code Review
Browse files

Merge "Register VcnManager with VcnFrameworkInitializer" into main

parents d7ebfd83 6a699a44
Loading
Loading
Loading
Loading
+3 −67
Original line number Diff line number Diff line
@@ -66,8 +66,6 @@ import android.companion.ICompanionDeviceManager;
import android.companion.virtual.IVirtualDeviceManager;
import android.companion.virtual.VirtualDeviceManager;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.content.ClipboardManager;
import android.content.ContentCaptureOptions;
import android.content.Context;
@@ -162,8 +160,7 @@ import android.net.NetworkWatchlistManager;
import android.net.PacProxyManager;
import android.net.TetheringManager;
import android.net.VpnManager;
import android.net.vcn.IVcnManagementService;
import android.net.vcn.VcnManager;
import android.net.vcn.VcnFrameworkInitializer;
import android.net.wifi.WifiFrameworkInitializer;
import android.net.wifi.nl80211.WifiNl80211Manager;
import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager;
@@ -198,7 +195,6 @@ import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.StatsFrameworkInitializer;
import android.os.SystemConfigManager;
import android.os.SystemProperties;
import android.os.SystemUpdateManager;
import android.os.SystemVibrator;
import android.os.SystemVibratorManager;
@@ -289,28 +285,6 @@ public final class SystemServiceRegistry {
    /** @hide */
    public static boolean sEnableServiceNotFoundWtf = false;

    /**
     * Starting with {@link VANILLA_ICE_CREAM}, Telephony feature flags
     * (e.g. {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}) are being checked before
     * returning managers that depend on them. If the feature is missing,
     * {@link Context#getSystemService} will return null.
     *
     * This change is specific to VcnManager.
     */
    @ChangeId
    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
    static final long ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN = 330902016;

    /**
     * The corresponding vendor API for Android V
     *
     * <p>Starting with Android V, the vendor API format has switched to YYYYMM.
     *
     * @see <a href="https://preview.source.android.com/docs/core/architecture/api-flags">Vendor API
     *     level</a>
     */
    private static final int VENDOR_API_FOR_ANDROID_V = 202404;

    // Service registry information.
    // This information is never changed once static initialization has completed.
    private static final Map<Class<?>, String> SYSTEM_SERVICE_NAMES =
@@ -472,22 +446,6 @@ public final class SystemServiceRegistry {
                return new VpnManager(ctx, service);
            }});

        registerService(Context.VCN_MANAGEMENT_SERVICE, VcnManager.class,
                new CachedServiceFetcher<VcnManager>() {
            @Override
            public VcnManager createService(ContextImpl ctx) throws ServiceNotFoundException {
                final String telephonyFeatureToCheck = getVcnFeatureDependency();

                if (telephonyFeatureToCheck != null
                    && !ctx.getPackageManager().hasSystemFeature(telephonyFeatureToCheck)) {
                    return null;
                }

                IBinder b = ServiceManager.getService(Context.VCN_MANAGEMENT_SERVICE);
                IVcnManagementService service = IVcnManagementService.Stub.asInterface(b);
                return new VcnManager(ctx, service);
            }});

        registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
                new StaticServiceFetcher<CountryDetector>() {
            @Override
@@ -1721,6 +1679,8 @@ public final class SystemServiceRegistry {
            OnDevicePersonalizationFrameworkInitializer.registerServiceWrappers();
            DeviceLockFrameworkInitializer.registerServiceWrappers();
            VirtualizationFrameworkInitializer.registerServiceWrappers();
            VcnFrameworkInitializer.registerServiceWrappers();

            if (com.android.server.telecom.flags.Flags.telecomMainlineBlockedNumbersManager()) {
                ProviderFrameworkInitializer.registerServiceWrappers();
            }
@@ -1782,30 +1742,6 @@ public final class SystemServiceRegistry {
        return manager.hasSystemFeature(featureName);
    }

    // Suppressing AndroidFrameworkCompatChange because we're querying vendor
    // partition SDK level, not application's target SDK version (which BTW we
    // also check through Compatibility framework a few lines below).
    @SuppressWarnings("AndroidFrameworkCompatChange")
    @Nullable
    private static String getVcnFeatureDependency() {
        // Check SDK version of the client app. Apps targeting pre-V SDK might
        // have not checked for existence of these features.
        if (!Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN)) {
            return null;
        }

        // Check SDK version of the vendor partition. Pre-V devices might have
        // incorrectly under-declared telephony features.
        final int vendorApiLevel = SystemProperties.getInt(
                "ro.vendor.api_level", Build.VERSION.DEVICE_INITIAL_SDK_INT);
        if (vendorApiLevel < VENDOR_API_FOR_ANDROID_V) {
            return PackageManager.FEATURE_TELEPHONY;
        } else {
            return PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION;
        }

    }

    /**
     * Gets a system service from a given context.
     * @hide
+106 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.net.vcn;

import android.annotation.Nullable;
import android.app.SystemServiceRegistry;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.SystemProperties;

/**
 * Class for performing registration for VCN service.
 *
 * @hide
 */
// TODO: Expose it as @SystemApi(client = MODULE_LIBRARIES)
public final class VcnFrameworkInitializer {
    /**
     * Starting with {@link VANILLA_ICE_CREAM}, Telephony feature flags (e.g. {@link
     * PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}) are being checked before returning managers
     * that depend on them. If the feature is missing, {@link Context#getSystemService} will return
     * null.
     *
     * <p>This change is specific to VcnManager.
     */
    @ChangeId
    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
    private static final long ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN = 330902016;

    /**
     * The corresponding vendor API for Android V
     *
     * <p>Starting with Android V, the vendor API format has switched to YYYYMM.
     *
     * @see <a href="https://preview.source.android.com/docs/core/architecture/api-flags">Vendor API
     *     level</a>
     */
    private static final int VENDOR_API_FOR_ANDROID_V = 202404;

    private VcnFrameworkInitializer() {}

    // Suppressing AndroidFrameworkCompatChange because we're querying vendor
    // partition SDK level, not application's target SDK version (which BTW we
    // also check through Compatibility framework a few lines below).
    @Nullable
    private static String getVcnFeatureDependency() {
        // Check SDK version of the client app. Apps targeting pre-V SDK might
        // have not checked for existence of these features.
        if (!Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN)) {
            return null;
        }

        // Check SDK version of the vendor partition. Pre-V devices might have
        // incorrectly under-declared telephony features.
        final int vendorApiLevel =
                SystemProperties.getInt(
                        "ro.vendor.api_level", Build.VERSION.DEVICE_INITIAL_SDK_INT);
        if (vendorApiLevel < VENDOR_API_FOR_ANDROID_V) {
            return PackageManager.FEATURE_TELEPHONY;
        } else {
            return PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION;
        }
    }

    /**
     * Register VCN service to {@link Context}, so that {@link Context#getSystemService} can return
     * a VcnManager.
     *
     * @throws IllegalStateException if this is called anywhere besides {@link
     *     SystemServiceRegistry}.
     */
    public static void registerServiceWrappers() {
        SystemServiceRegistry.registerContextAwareService(
                VcnManager.VCN_MANAGEMENT_SERVICE_STRING,
                VcnManager.class,
                (context, serviceBinder) -> {
                    final String telephonyFeatureToCheck = getVcnFeatureDependency();
                    if (telephonyFeatureToCheck != null
                            && !context.getPackageManager()
                                    .hasSystemFeature(telephonyFeatureToCheck)) {
                        return null;
                    }
                    IVcnManagementService service =
                            IVcnManagementService.Stub.asInterface(serviceBinder);
                    return new VcnManager(context, service);
                });
    }
}