Migrate wifi.SdkLevelUtil to com.android.modules.utils.build.SdkLevel

Migrate to standard implementation.

Bug: 170538050
Test: boots up and connects to wifi
Change-Id: I8fca04fa22d6053aff0f58730adfa87f0bafaa3a
This commit is contained in:
David Su
2020-10-26 11:12:04 -07:00
parent aea66d60e7
commit 80417683df
18 changed files with 83 additions and 136 deletions

View File

@@ -75,25 +75,34 @@ test_access_hidden_api_whitelist = [
"//external/sl4a:__subpackages__",
]
// wifi-service needs pre-jarjared version of framework-wifi so it can reference copied utility
// classes before they are renamed.
java_library {
name: "framework-wifi-pre-jarjar",
// defaults shared between `framework-wifi` & `framework-wifi-pre-jarjar`
// java_sdk_library `framework-wifi` needs sources to generate stubs, so it cannot reuse
// `framework-wifi-pre-jarjar`
java_defaults {
name: "framework-wifi-defaults",
defaults: ["wifi-module-sdk-version-defaults"],
sdk_version: "module_current",
static_libs: [
"framework-wifi-util-lib",
"android.hardware.wifi-V1.0-java-constants",
"modules-utils-build",
],
libs: [
"framework-annotations-lib",
"unsupportedappusage", // for android.compat.annotation.UnsupportedAppUsage
],
srcs: [
":framework-wifi-updatable-sources",
":framework-wifi-util-lib-aidls",
],
// java_api_finder must accompany `srcs`
}
// wifi-service needs pre-jarjared version of framework-wifi so it can reference copied utility
// classes before they are renamed.
java_library {
name: "framework-wifi-pre-jarjar",
defaults: ["framework-wifi-defaults"],
sdk_version: "module_current",
libs: ["framework-annotations-lib"],
// java_api_finder must accompany `srcs` (`srcs` defined in `framework-wifi-defaults`)
plugins: ["java_api_finder"],
installable: false,
visibility: [
@@ -107,18 +116,7 @@ java_sdk_library {
name: "framework-wifi",
defaults: [
"framework-module-defaults",
"wifi-module-sdk-version-defaults",
],
static_libs: [
"framework-wifi-util-lib",
"android.hardware.wifi-V1.0-java-constants",
],
libs: [
"unsupportedappusage", // for android.compat.annotation.UnsupportedAppUsage
],
srcs: [
":framework-wifi-updatable-sources",
":framework-wifi-util-lib-aidls",
"framework-wifi-defaults",
],
jarjar_rules: ":wifi-jarjar-rules",

View File

@@ -123,3 +123,4 @@ rule com.android.internal.util.Preconditions* com.android.wifi.x.@0
rule com.android.internal.util.Protocol* com.android.wifi.x.@0
rule com.android.net.module.util.** com.android.wifi.x.@0
rule com.android.modules.utils.** com.android.wifi.x.@0

View File

@@ -21,10 +21,11 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.wifi.SoftApConfiguration.BandType;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.modules.utils.build.SdkLevel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
@@ -176,7 +177,7 @@ public final class SoftApCapability implements Parcelable {
*/
@NonNull
public int[] getSupportedChannelList(@BandType int band) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
switch (band) {

View File

@@ -22,7 +22,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.MacAddress;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -31,6 +30,7 @@ import android.util.SparseIntArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.modules.utils.build.SdkLevel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -499,7 +499,7 @@ public final class SoftApConfiguration implements Parcelable {
*/
@SystemApi
public @NonNull int[] getBands() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
int[] bands = new int[mChannels.size()];
@@ -535,7 +535,7 @@ public final class SoftApConfiguration implements Parcelable {
*/
@SystemApi
public @NonNull SparseIntArray getChannels() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mChannels;
@@ -635,7 +635,7 @@ public final class SoftApConfiguration implements Parcelable {
@SystemApi
@MacRandomizationSetting
public int getMacRandomizationSetting() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mMacRandomizationSetting;
@@ -1219,7 +1219,7 @@ public final class SoftApConfiguration implements Parcelable {
@NonNull
public Builder setMacRandomizationSetting(
@MacRandomizationSetting int macRandomizationSetting) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mMacRandomizationSetting = macRandomizationSetting;

View File

@@ -20,11 +20,11 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.MacAddress;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.Preconditions;
import com.android.modules.utils.build.SdkLevel;
import java.util.Objects;
@@ -141,7 +141,7 @@ public final class SoftApInfo implements Parcelable {
*/
@Nullable
public MacAddress getBssid() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mBssid;
@@ -180,7 +180,7 @@ public final class SoftApInfo implements Parcelable {
* @return valid values from {@link ScanResult}'s {@code WIFI_STANDARD_}
*/
public @WifiAnnotations.WifiStandard int getWifiStandard() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mWifiStandard;

View File

@@ -44,7 +44,6 @@ import android.net.wifi.hotspot2.IProvisioningCallback;
import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.net.wifi.hotspot2.ProvisioningCallback;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -62,6 +61,7 @@ import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.utils.build.SdkLevel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -2493,7 +2493,7 @@ public class WifiManager {
* @return true if this device supports multiple STA concurrency, false otherwise.
*/
public boolean isMultiStaConcurrencySupported() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA);

View File

@@ -26,7 +26,6 @@ import android.annotation.SystemApi;
import android.net.MacAddress;
import android.net.NetworkCapabilities;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.SubscriptionInfo;
@@ -34,6 +33,8 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import com.android.modules.utils.build.SdkLevel;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
@@ -451,7 +452,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
public @NonNull Builder setSubscriptionId(int subId) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mSubscriptionId = subId;
@@ -466,7 +467,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
public @NonNull Builder setPriorityGroup(int priorityGroup) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mPriorityGroup = priorityGroup;
@@ -707,7 +708,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*/
@SystemApi
public @NonNull Builder setOemPaid(boolean isOemPaid) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mIsNetworkOemPaid = isOemPaid;
@@ -1204,7 +1205,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*/
@SystemApi
public boolean isOemPaid() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return wifiConfiguration.oemPaid;
@@ -1242,7 +1243,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @see Builder#setPriorityGroup(int)
*/
public int getPriorityGroup() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return priorityGroup;
@@ -1252,7 +1253,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @see Builder#setSubscriptionId(int)
*/
public int getSubscriptionId() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return wifiConfiguration.subscriptionId;

View File

@@ -17,11 +17,12 @@
package android.net.wifi.aware;
import android.annotation.IntDef;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.modules.utils.build.SdkLevel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -92,7 +93,7 @@ public final class Characteristics implements Parcelable {
* @return True if supported, false otherwise.
*/
public boolean isInstantCommunicationModeSupported() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mCharacteristics.getBoolean(KEY_IS_INSTANT_COMMUNICATION_MODE_SUPPORTED);

View File

@@ -29,7 +29,6 @@ import android.net.ConnectivityManager;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.wifi.util.HexEncoding;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -39,6 +38,8 @@ import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import com.android.modules.utils.build.SdkLevel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -210,7 +211,7 @@ public class WifiAwareManager {
* or not (false).
*/
public boolean isDeviceAttached() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
try {
@@ -229,7 +230,7 @@ public class WifiAwareManager {
*/
@SystemApi
public void enableInstantCommunicationMode(boolean enable) {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
try {
@@ -246,7 +247,7 @@ public class WifiAwareManager {
* @return true if it is enabled, false otherwise.
*/
public boolean isInstantCommunicationModeEnabled() {
if (!SdkLevelUtil.isAtLeastS()) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
try {

View File

@@ -1,68 +0,0 @@
/*
* 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.net.wifi.util;
import android.os.Build;
/**
* Utility to check the SDK version of the device that the code is running on.
*
* This can be used to disable new Wifi APIs added in Mainline updates on older SDK versions.
*
* Note: if certain functionality is gated with SdkLevelUtil, its corresponding unit tests should
* also be gated by the same condition. Then, those unit tests will only be exercised on a base
* system image satisfying that condition.
* Alternatively, it can be tested via static mocking.
*
* @hide
*/
public class SdkLevelUtil {
/** This class is not instantiable. */
private SdkLevelUtil() {}
/** Returns true if the Android platform SDK is at least "S", false otherwise. */
public static boolean isAtLeastS() {
// TODO(b/167575586): after S SDK finalization, this method should just be
// `return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S;`
// at least S: return true
// this condition only evaluates to true after S SDK finalization when VERSION_CODES.S
// is set to something like "31", before SDK finalization the value is "10000"
// Note that Build.VERSION_CODES.S is inlined at compile time. If it's inlined to 10000,
// this condition never evaluates to true.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
return true;
}
// Assume for now that S = R + 1
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
return true;
}
// R: check CODENAME
// Before S SDK finalization, SDK_INT = R = 30 i.e. remains on the previous version
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
// CODENAME = "REL" on R release builds
// CODENAME = "S" on S development builds
return "S".equals(Build.VERSION.CODENAME);
}
// older than R: return false
return false;
}
}

View File

@@ -31,10 +31,11 @@ android_test {
static_libs: [
"androidx.test.rules",
"core-test-rules",
"frameworks-base-testutils",
"guava",
"mockito-target-minus-junit4",
"modules-utils-build",
"net-tests-utils",
"frameworks-base-testutils",
"truth-prebuilt",
],
@@ -47,4 +48,8 @@ android_test {
"device-tests",
"mts",
],
// static libs used by both framework-wifi & FrameworksWifiApiTests. Need to rename test usage
// to a different package name to prevent conflict with the copy in production code.
jarjar_rules: "test-jarjar-rules.txt",
}

View File

@@ -16,14 +16,15 @@
package android.net.wifi;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assume.assumeTrue;
import android.os.Parcel;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
/**
@@ -93,7 +94,7 @@ public class SoftApCapabilityTest {
@Test(expected = IllegalArgumentException.class)
public void testGetSupportedChannelListWithInvalidBand() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
long testSoftApFeature = SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT
| SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD;

View File

@@ -22,12 +22,13 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.net.MacAddress;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import android.util.SparseIntArray;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
import java.util.ArrayList;
@@ -84,7 +85,7 @@ public class SoftApConfigurationTest {
assertThat(original.getChannel()).isEqualTo(0);
assertThat(original.isHiddenSsid()).isEqualTo(false);
assertThat(original.getMaxNumberOfClients()).isEqualTo(0);
if (SdkLevelUtil.isAtLeastS()) {
if (SdkLevel.isAtLeastS()) {
assertThat(original.getMacRandomizationSetting())
.isEqualTo(SoftApConfiguration.RANDOMIZATION_PERSISTENT);
}
@@ -140,7 +141,7 @@ public class SoftApConfigurationTest {
.setClientControlByUserEnabled(true)
.setBlockedClientList(testBlockedClientList)
.setAllowedClientList(testAllowedClientList);
if (SdkLevelUtil.isAtLeastS()) {
if (SdkLevel.isAtLeastS()) {
originalBuilder.setMacRandomizationSetting(SoftApConfiguration.RANDOMIZATION_NONE);
}
SoftApConfiguration original = originalBuilder.build();
@@ -156,7 +157,7 @@ public class SoftApConfigurationTest {
assertThat(original.isClientControlByUserEnabled()).isEqualTo(true);
assertThat(original.getBlockedClientList()).isEqualTo(testBlockedClientList);
assertThat(original.getAllowedClientList()).isEqualTo(testAllowedClientList);
if (SdkLevelUtil.isAtLeastS()) {
if (SdkLevel.isAtLeastS()) {
assertThat(original.getMacRandomizationSetting())
.isEqualTo(SoftApConfiguration.RANDOMIZATION_NONE);
}

View File

@@ -16,14 +16,15 @@
package android.net.wifi;
import android.net.MacAddress;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import static org.junit.Assert.assertEquals;
import android.net.MacAddress;
import android.os.Parcel;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
/**
@@ -84,7 +85,7 @@ public class SoftApInfoTest {
SoftApInfo info = new SoftApInfo();
assertEquals(info.getFrequency(), 0);
assertEquals(info.getBandwidth(), SoftApInfo.CHANNEL_WIDTH_INVALID);
if (SdkLevelUtil.isAtLeastS()) {
if (SdkLevel.isAtLeastS()) {
assertEquals(info.getBssid(), null);
assertEquals(info.getWifiStandard(), ScanResult.WIFI_STANDARD_UNKNOWN);
}

View File

@@ -86,7 +86,6 @@ import android.net.wifi.WifiManager.SoftApCallback;
import android.net.wifi.WifiManager.SuggestionConnectionStatusListener;
import android.net.wifi.WifiManager.TrafficStateCallback;
import android.net.wifi.WifiManager.WifiConnectedNetworkScorer;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerExecutor;
@@ -98,6 +97,8 @@ import android.util.SparseArray;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -1729,7 +1730,7 @@ public class WifiManagerTest {
*/
@Test
public void testIsMultiStaConcurrencyOpenSupported() throws Exception {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
when(mWifiService.getSupportedFeatures())
.thenReturn(new Long(WIFI_FEATURE_ADDITIONAL_STA));

View File

@@ -27,11 +27,12 @@ import static org.junit.Assume.assumeTrue;
import android.net.MacAddress;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.net.wifi.hotspot2.PasspointTestUtils;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Parcel;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
import java.security.cert.X509Certificate;
@@ -198,7 +199,7 @@ public class WifiNetworkSuggestionTest {
*/
@Test
public void testWifiNetworkSuggestionBuilderForOemPaidEnhancedOpenNetworkWithBssid() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
@@ -953,7 +954,7 @@ public class WifiNetworkSuggestionTest {
*/
@Test
public void testSimCredentialNetworkWithSubId() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
@@ -1254,7 +1255,7 @@ public class WifiNetworkSuggestionTest {
*/
@Test
public void testSetIsNetworkAsOemPaid() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
@@ -1272,7 +1273,7 @@ public class WifiNetworkSuggestionTest {
*/
@Test
public void testSetIsNetworkAsOemPaidOnPasspointNetwork() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
@@ -1307,7 +1308,7 @@ public class WifiNetworkSuggestionTest {
*/
@Test(expected = IllegalStateException.class)
public void testSetCredentialSharedWithUserWithSetIsNetworkAsOemPaid() {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)

View File

@@ -39,7 +39,6 @@ import android.content.pm.PackageManager;
import android.net.MacAddress;
import android.net.wifi.RttManager;
import android.net.wifi.util.HexEncoding;
import android.net.wifi.util.SdkLevelUtil;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
@@ -48,6 +47,8 @@ import android.os.test.TestLooper;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -164,7 +165,7 @@ public class WifiAwareManagerTest {
*/
@Test
public void testEnableInstantCommunicationMode() throws Exception {
assumeTrue(SdkLevelUtil.isAtLeastS());
assumeTrue(SdkLevel.isAtLeastS());
mDut.isInstantCommunicationModeEnabled();
verify(mockAwareService).isInstantCommunicationModeEnabled();
mDut.enableInstantCommunicationMode(true);

View File

@@ -0,0 +1 @@
rule com.android.modules.utils.** com.android.wifi.test.x.@0