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

Commit 842b3e6a authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by Automerger Merge Worker
Browse files

Migrate framework-connectivity internal resources am: 4f808486 am: 2c1e6d83

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1641905

Change-Id: If36c3148d1a8c487ca3f25fa65e9b593f4e4d19d
parents e8f1c936 2c1e6d83
Loading
Loading
Loading
Loading
+35 −10
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.server.connectivity;
package android.net;

import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;

@@ -27,13 +27,14 @@ import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.util.Log;

import com.android.server.ConnectivityService;
import com.android.internal.annotations.VisibleForTesting;

import java.util.List;

/**
 * Utility to obtain the {@link ConnectivityService} {@link Resources}, in the
 * Utility to obtain the {@link com.android.server.ConnectivityService} {@link Resources}, in the
 * ServiceConnectivityResources APK.
 * @hide
 */
public class ConnectivityResources {
    private static final String RESOURCES_APK_INTENT =
@@ -44,18 +45,35 @@ public class ConnectivityResources {
    private final Context mContext;

    @Nullable
    private Resources mResources = null;
    private Context mResourcesContext = null;

    @Nullable
    private static Context sTestResourcesContext = null;

    public ConnectivityResources(Context context) {
        mContext = context;
    }

    /**
     * Get the {@link Resources} of the ServiceConnectivityResources APK.
     * Convenience method to mock all resources for the duration of a test.
     *
     * Call with a null context to reset after the test.
     */
    @VisibleForTesting
    public static void setResourcesContextForTest(@Nullable Context testContext) {
        sTestResourcesContext = testContext;
    }

    /**
     * Get the {@link Context} of the resources package.
     */
    public synchronized Resources get() {
        if (mResources != null) {
            return mResources;
    public synchronized Context getResourcesContext() {
        if (sTestResourcesContext != null) {
            return sTestResourcesContext;
        }

        if (mResourcesContext != null) {
            return mResourcesContext;
        }

        final List<ResolveInfo> pkgs = mContext.getPackageManager()
@@ -77,7 +95,14 @@ public class ConnectivityResources {
            throw new IllegalStateException("Resolved package not found", e);
        }

        mResources = pkgContext.getResources();
        return mResources;
        mResourcesContext = pkgContext;
        return pkgContext;
    }

    /**
     * Get the {@link Resources} of the ServiceConnectivityResources APK.
     */
    public Resources get() {
        return getResourcesContext().getResources();
    }
}
+44 −4
Original line number Diff line number Diff line
@@ -19,12 +19,12 @@ package android.net.apf;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityResources;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.R;

/**
 * APF program support capabilities. APF stands for Android Packet Filtering and it is a flexible
 * way to drop unwanted network packets to save power.
@@ -36,6 +36,8 @@ import com.android.internal.R;
 */
@SystemApi
public final class ApfCapabilities implements Parcelable {
    private static ConnectivityResources sResources;

    /**
     * Version of APF instruction set supported for packet filtering. 0 indicates no support for
     * packet filtering using APF programs.
@@ -65,6 +67,14 @@ public final class ApfCapabilities implements Parcelable {
        apfPacketFormat = in.readInt();
    }

    @NonNull
    private static synchronized ConnectivityResources getResources(@NonNull Context ctx) {
        if (sResources == null)  {
            sResources = new ConnectivityResources(ctx);
        }
        return sResources;
    }


    @Override
    public int describeContents() {
@@ -121,13 +131,43 @@ public final class ApfCapabilities implements Parcelable {
     * @return Whether the APF Filter in the device should filter out IEEE 802.3 Frames.
     */
    public static boolean getApfDrop8023Frames() {
        return Resources.getSystem().getBoolean(R.bool.config_apfDrop802_3Frames);
        // TODO(b/183076074): remove reading resources from system resources
        final Resources systemRes = Resources.getSystem();
        final int id = systemRes.getIdentifier("config_apfDrop802_3Frames", "bool", "android");
        return systemRes.getBoolean(id);
    }

    /**
     * @return Whether the APF Filter in the device should filter out IEEE 802.3 Frames.
     * @hide
     */
    public static boolean getApfDrop8023Frames(@NonNull Context context) {
        final ConnectivityResources res = getResources(context);
        // TODO(b/183076074): use R.bool.config_apfDrop802_3Frames directly
        final int id = res.get().getIdentifier("config_apfDrop802_3Frames", "bool",
                res.getResourcesContext().getPackageName());
        return res.get().getBoolean(id);
    }

    /**
     * @return An array of denylisted EtherType, packets with EtherTypes within it will be dropped.
     */
    public static @NonNull int[] getApfEtherTypeBlackList() {
        return Resources.getSystem().getIntArray(R.array.config_apfEthTypeBlackList);
        // TODO(b/183076074): remove reading resources from system resources
        final Resources systemRes = Resources.getSystem();
        final int id = systemRes.getIdentifier("config_apfEthTypeBlackList", "array", "android");
        return systemRes.getIntArray(id);
    }

    /**
     * @return An array of denylisted EtherType, packets with EtherTypes within it will be dropped.
     * @hide
     */
    public static @NonNull int[] getApfEtherTypeDenyList(@NonNull Context context) {
        final ConnectivityResources res = getResources(context);
        // TODO(b/183076074): use R.array.config_apfEthTypeDenyList directly
        final int id = res.get().getIdentifier("config_apfEthTypeDenyList", "array",
                res.getResourcesContext().getPackageName());
        return res.get().getIntArray(id);
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -19,12 +19,11 @@ package android.net.util;
import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityResources;
import android.net.NetworkCapabilities;
import android.text.TextUtils;
import android.util.AndroidRuntimeException;

import com.android.internal.R;

/**
 * Collection of utilities for socket keepalive offload.
 *
@@ -52,8 +51,11 @@ public final class KeepaliveUtils {
    public static int[] getSupportedKeepalives(@NonNull Context context) {
        String[] res = null;
        try {
            res = context.getResources().getStringArray(
                    R.array.config_networkSupportedKeepaliveCount);
            final ConnectivityResources connRes = new ConnectivityResources(context);
            // TODO: use R.id.config_networkSupportedKeepaliveCount directly
            final int id = connRes.get().getIdentifier("config_networkSupportedKeepaliveCount",
                    "array", connRes.getResourcesContext().getPackageName());
            res = new ConnectivityResources(context).get().getStringArray(id);
        } catch (Resources.NotFoundException unused) {
        }
        if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource");
+13 −5
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.ConnectivityResources;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
@@ -35,7 +36,6 @@ import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.util.Log;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;

import java.util.Arrays;
@@ -64,6 +64,7 @@ public class MultinetworkPolicyTracker {
    private static String TAG = MultinetworkPolicyTracker.class.getSimpleName();

    private final Context mContext;
    private final ConnectivityResources mResources;
    private final Handler mHandler;
    private final Runnable mAvoidBadWifiCallback;
    private final List<Uri> mSettingsUris;
@@ -107,6 +108,7 @@ public class MultinetworkPolicyTracker {

    public MultinetworkPolicyTracker(Context ctx, Handler handler, Runnable avoidBadWifiCallback) {
        mContext = ctx;
        mResources = new ConnectivityResources(ctx);
        mHandler = handler;
        mAvoidBadWifiCallback = avoidBadWifiCallback;
        mSettingsUris = Arrays.asList(
@@ -160,12 +162,16 @@ public class MultinetworkPolicyTracker {
     * Whether the device or carrier configuration disables avoiding bad wifi by default.
     */
    public boolean configRestrictsAvoidBadWifi() {
        return (getResourcesForActiveSubId().getInteger(R.integer.config_networkAvoidBadWifi) == 0);
        // TODO: use R.integer.config_networkAvoidBadWifi directly
        final int id = mResources.get().getIdentifier("config_networkAvoidBadWifi",
                "integer", mResources.getResourcesContext().getPackageName());
        return (getResourcesForActiveSubId().getInteger(id) == 0);
    }

    @NonNull
    private Resources getResourcesForActiveSubId() {
        return SubscriptionManager.getResourcesForSubId(mContext, mActiveSubId);
        return SubscriptionManager.getResourcesForSubId(
                mResources.getResourcesContext(), mActiveSubId);
    }

    /**
@@ -205,8 +211,10 @@ public class MultinetworkPolicyTracker {
     * The default (device and carrier-dependent) value for metered multipath preference.
     */
    public int configMeteredMultipathPreference() {
        return mContext.getResources().getInteger(
                R.integer.config_networkMeteredMultipathPreference);
        // TODO: use R.integer.config_networkMeteredMultipathPreference directly
        final int id = mResources.get().getIdentifier("config_networkMeteredMultipathPreference",
                "integer", mResources.getResourcesContext().getPackageName());
        return mResources.get().getInteger(id);
    }

    public void updateMeteredMultipathPreference() {
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ package {

android_app {
    name: "ServiceConnectivityResources",
    sdk_version: "system_current",
    sdk_version: "module_current",
    resource_dirs: [
        "res",
    ],
Loading