diff options
22 files changed, 414 insertions, 159 deletions
diff --git a/api/current.txt b/api/current.txt index 36567ecc1a72..51641f23a49e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -29481,6 +29481,7 @@ package android.net { method public android.net.NetworkRequest.Builder addCapability(int); method public android.net.NetworkRequest.Builder addTransportType(int); method public android.net.NetworkRequest build(); + method @NonNull public android.net.NetworkRequest.Builder clearCapabilities(); method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(String); diff --git a/api/system-current.txt b/api/system-current.txt index 1146522dafea..41ded16bff08 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4823,6 +4823,7 @@ package android.net { public final class MatchAllNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { ctor public MatchAllNetworkSpecifier(); method public int describeContents(); + method public boolean satisfiedBy(android.net.NetworkSpecifier); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.MatchAllNetworkSpecifier> CREATOR; } @@ -4886,6 +4887,12 @@ package android.net { method public void updateScores(@NonNull java.util.List<android.net.ScoredNetwork>); } + public abstract class NetworkSpecifier { + method public void assertValidFromUid(int); + method @Nullable public android.net.NetworkSpecifier redact(); + method public abstract boolean satisfiedBy(@Nullable android.net.NetworkSpecifier); + } + public class NetworkStack { field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK"; } @@ -4956,6 +4963,7 @@ package android.net { public final class StringNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { ctor public StringNetworkSpecifier(@NonNull String); method public int describeContents(); + method public boolean satisfiedBy(android.net.NetworkSpecifier); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.StringNetworkSpecifier> CREATOR; field @NonNull public final String specifier; @@ -5739,6 +5747,7 @@ package android.net.wifi { field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApCapability> CREATOR; field public static final int SOFTAP_FEATURE_ACS_OFFLOAD = 1; // 0x1 field public static final int SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 2; // 0x2 + field public static final int SOFTAP_FEATURE_WPA3_SAE = 4; // 0x4 } public final class SoftApConfiguration implements android.os.Parcelable { @@ -5747,6 +5756,7 @@ package android.net.wifi { method @Nullable public android.net.MacAddress getBssid(); method public int getChannel(); method public int getMaxNumberOfClients(); + method @Nullable public String getPassphrase(); method public int getSecurityType(); method @Nullable public String getSsid(); method @Nullable public String getWpa2Passphrase(); @@ -5759,6 +5769,8 @@ package android.net.wifi { field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApConfiguration> CREATOR; field public static final int SECURITY_TYPE_OPEN = 0; // 0x0 field public static final int SECURITY_TYPE_WPA2_PSK = 1; // 0x1 + field public static final int SECURITY_TYPE_WPA3_SAE = 3; // 0x3 + field public static final int SECURITY_TYPE_WPA3_SAE_TRANSITION = 2; // 0x2 } public static final class SoftApConfiguration.Builder { @@ -5770,6 +5782,7 @@ package android.net.wifi { method @NonNull public android.net.wifi.SoftApConfiguration.Builder setChannel(int, int); method @NonNull public android.net.wifi.SoftApConfiguration.Builder setHiddenSsid(boolean); method @NonNull public android.net.wifi.SoftApConfiguration.Builder setMaxNumberOfClients(int); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setPassphrase(@Nullable String, int); method @NonNull public android.net.wifi.SoftApConfiguration.Builder setSsid(@Nullable String); method @NonNull public android.net.wifi.SoftApConfiguration.Builder setWpa2Passphrase(@Nullable String); } @@ -6068,6 +6081,10 @@ package android.net.wifi { field public int numUsage; } + public final class WifiNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { + method public boolean satisfiedBy(android.net.NetworkSpecifier); + } + public static final class WifiNetworkSuggestion.Builder { method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierId(int); } @@ -6254,6 +6271,10 @@ package android.net.wifi.aware { method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]); } + public final class WifiAwareNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { + method public boolean satisfiedBy(android.net.NetworkSpecifier); + } + public class WifiAwareSession implements java.lang.AutoCloseable { method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]); } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index 431773dc2622..9731f3ca186d 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -247,9 +247,8 @@ public class NetworkRequest implements Parcelable { * removing even the capabilities that are set by default when the object is constructed. * * @return The builder to facilitate chaining. - * @hide */ - @UnsupportedAppUsage + @NonNull public Builder clearCapabilities() { mNetworkCapabilities.clearAll(); return this; diff --git a/core/java/android/net/NetworkSpecifier.java b/core/java/android/net/NetworkSpecifier.java index 2bc3eb56ec2d..cf31d217c967 100644 --- a/core/java/android/net/NetworkSpecifier.java +++ b/core/java/android/net/NetworkSpecifier.java @@ -16,6 +16,9 @@ package android.net; +import android.annotation.Nullable; +import android.annotation.SystemApi; + /** * Describes specific properties of a requested network for use in a {@link NetworkRequest}. * @@ -31,7 +34,8 @@ public abstract class NetworkSpecifier { * * @hide */ - public abstract boolean satisfiedBy(NetworkSpecifier other); + @SystemApi + public abstract boolean satisfiedBy(@Nullable NetworkSpecifier other); /** * Optional method which can be overridden by concrete implementations of NetworkSpecifier to @@ -45,6 +49,7 @@ public abstract class NetworkSpecifier { * * @hide */ + @SystemApi public void assertValidFromUid(int requestorUid) { // empty } @@ -68,6 +73,8 @@ public abstract class NetworkSpecifier { * * @hide */ + @SystemApi + @Nullable public NetworkSpecifier redact() { // TODO (b/122160111): convert default to null once all platform NetworkSpecifiers // implement this method. diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index d5a3b5e91151..b83b31c1303a 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -702,6 +702,12 @@ enum Action { // CATEGORY: SETTINGS // OS: R ACTION_DASHBOARD_VISIBLE_TIME = 1729; + + // ACTION: Allow "Access all files" for an app + APP_SPECIAL_PERMISSION_MANAGE_EXT_STRG_ALLOW = 1730; + + // ACTION: Deny "Access all files" for an app + APP_SPECIAL_PERMISSION_MANAGE_EXT_STRG_DENY = 1731; } /** @@ -2542,4 +2548,9 @@ enum PageId { // OS: R FUELGAUGE_BATTERY_SHARE = 1821; + // OPEN: Settings -> Apps & Notifications -> Special App Access + // CATEGORY: SETTINGS + // OS: R + MANAGE_EXTERNAL_STORAGE = 1822; + } diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 506d6165bbfa..4e6b4af56597 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -156,8 +156,6 @@ public final class MediaRoute2Info implements Parcelable { @Nullable final Bundle mExtras; - private final String mUniqueId; - MediaRoute2Info(@NonNull Builder builder) { mId = builder.mId; mProviderId = builder.mProviderId; @@ -172,7 +170,6 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = builder.mVolumeHandling; mDeviceType = builder.mDeviceType; mExtras = builder.mExtras; - mUniqueId = createUniqueId(); } MediaRoute2Info(@NonNull Parcel in) { @@ -189,18 +186,12 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = in.readInt(); mDeviceType = in.readInt(); mExtras = in.readBundle(); - mUniqueId = createUniqueId(); - } - - private String createUniqueId() { - String uniqueId = null; - if (mProviderId != null) { - uniqueId = toUniqueId(mProviderId, mId); - } - return uniqueId; } - static String toUniqueId(String providerId, String routeId) { + /** + * @hide + */ + public static String toUniqueId(String providerId, String routeId) { return providerId + ":" + routeId; } @@ -251,25 +242,30 @@ public final class MediaRoute2Info implements Parcelable { } /** - * Gets the id of the route. - * Use {@link #getUniqueId()} if you need a unique identifier. + * Gets the id of the route. The routes which are given by {@link MediaRouter2} will have + * unique IDs. + * <p> + * In order to ensure uniqueness in {@link MediaRouter2} side, the value of this method + * can be different from what was set in {@link MediaRoute2ProviderService}. * - * @see #getUniqueId() + * @see Builder#setId(String) */ @NonNull public String getId() { - return mId; + if (mProviderId != null) { + return toUniqueId(mProviderId, mId); + } else { + return mId; + } } /** - * Gets the unique id of the route. A route obtained from - * {@link com.android.server.media.MediaRouterService} always has a unique id. - * - * @return unique id of the route or null if it has no unique id. + * Gets the original id set by {@link Builder#setId(String)}. + * @hide */ - @Nullable - public String getUniqueId() { - return mUniqueId; + @NonNull + public String getOriginalId() { + return mId; } /** @@ -499,7 +495,15 @@ public final class MediaRoute2Info implements Parcelable { } /** - * Sets the unique id of the route. + * Sets the unique id of the route. The value given here must be unique for each of your + * route. + * <p> + * In order to ensure uniqueness in {@link MediaRouter2} side, the value of + * {@link MediaRoute2Info#getId()} can be different from what was set in + * {@link MediaRoute2ProviderService}. + * </p> + * + * @see MediaRoute2Info#getId() */ @NonNull public Builder setId(@NonNull String id) { diff --git a/media/java/android/media/MediaRoute2ProviderInfo.java b/media/java/android/media/MediaRoute2ProviderInfo.java index 7078d4a0b568..e2f246cae8c2 100644 --- a/media/java/android/media/MediaRoute2ProviderInfo.java +++ b/media/java/android/media/MediaRoute2ProviderInfo.java @@ -25,6 +25,7 @@ import android.util.ArrayMap; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import java.util.Objects; /** @@ -161,14 +162,17 @@ public final class MediaRoute2ProviderInfo implements Parcelable { return this; } mUniqueId = uniqueId; - final int count = mRoutes.size(); - for (int i = 0; i < count; i++) { - MediaRoute2Info route = mRoutes.valueAt(i); - mRoutes.setValueAt(i, new MediaRoute2Info.Builder(route) + + final ArrayMap<String, MediaRoute2Info> newRoutes = new ArrayMap<>(); + for (Map.Entry<String, MediaRoute2Info> entry : mRoutes.entrySet()) { + MediaRoute2Info routeWithProviderId = new MediaRoute2Info.Builder(entry.getValue()) .setProviderId(mUniqueId) - .build()); + .build(); + newRoutes.put(routeWithProviderId.getId(), routeWithProviderId); } + mRoutes.clear(); + mRoutes.putAll(newRoutes); return this; } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index f5cfde4b968b..bddfa6930b11 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -177,9 +177,9 @@ public class MediaRouter2 { * @hide */ public static boolean checkRouteListContainsRouteId(@NonNull List<MediaRoute2Info> routeList, - @NonNull String uniqueRouteId) { + @NonNull String routeId) { for (MediaRoute2Info info : routeList) { - if (TextUtils.equals(uniqueRouteId, info.getUniqueId())) { + if (TextUtils.equals(routeId, info.getId())) { return true; } } @@ -499,7 +499,7 @@ public class MediaRouter2 { List<MediaRoute2Info> addedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); if (route.supportsControlCategories(mControlCategories)) { addedRoutes.add(route); } @@ -515,7 +515,7 @@ public class MediaRouter2 { List<MediaRoute2Info> removedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.remove(route.getUniqueId()); + mRoutes.remove(route.getId()); if (route.supportsControlCategories(mControlCategories)) { removedRoutes.add(route); } @@ -531,7 +531,7 @@ public class MediaRouter2 { List<MediaRoute2Info> changedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); if (route.supportsControlCategories(mControlCategories)) { changedRoutes.add(route); } @@ -935,13 +935,13 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring selecting a route that is already selected. route=" + route); return; } List<MediaRoute2Info> selectableRoutes = getSelectableRoutes(); - if (!checkRouteListContainsRouteId(selectableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(selectableRoutes, route.getId())) { Log.w(TAG, "Ignoring selecting a non-selectable route=" + route); return; } @@ -982,13 +982,13 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (!checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring deselecting a route that is not selected. route=" + route); return; } List<MediaRoute2Info> deselectableRoutes = getDeselectableRoutes(); - if (!checkRouteListContainsRouteId(deselectableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(deselectableRoutes, route.getId())) { Log.w(TAG, "Ignoring deselecting a non-deselectable route=" + route); return; } @@ -1029,14 +1029,14 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring transferring to a route that is already added. route=" + route); return; } List<MediaRoute2Info> transferrableRoutes = getTransferrableRoutes(); - if (!checkRouteListContainsRouteId(transferrableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(transferrableRoutes, route.getId())) { Log.w(TAG, "Ignoring transferring to a non-transferrable route=" + route); return; } @@ -1084,8 +1084,12 @@ public class MediaRouter2 { } } + /** + * TODO: Change this to package private. (Hidden for debugging purposes) + * @hide + */ @NonNull - RouteSessionInfo getRouteSessionInfo() { + public RouteSessionInfo getRouteSessionInfo() { synchronized (mControllerLock) { return mSessionInfo; } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 2e68e42e714f..3cbbea1f3c07 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -295,7 +295,7 @@ public class MediaRouter2Manager { void addRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); } } if (routes.size() > 0) { @@ -306,7 +306,7 @@ public class MediaRouter2Manager { void removeRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.remove(route.getUniqueId()); + mRoutes.remove(route.getId()); } } if (routes.size() > 0) { @@ -317,7 +317,7 @@ public class MediaRouter2Manager { void changeRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); } } if (routes.size() > 0) { diff --git a/media/java/android/media/RouteSessionInfo.java b/media/java/android/media/RouteSessionInfo.java index 2d7bc24ae7a2..4a9298ac64be 100644 --- a/media/java/android/media/RouteSessionInfo.java +++ b/media/java/android/media/RouteSessionInfo.java @@ -327,14 +327,30 @@ public class RouteSessionInfo implements Parcelable { } /** - * Sets the provider id of the session. + * Sets the provider ID of the session. + * Also, calling this method will make all type of route IDs be unique by adding + * {@code providerId:} as a prefix. So do NOT call this method twice on same instance. + * + * @hide */ @NonNull public Builder setProviderId(String providerId) { mProviderId = providerId; + convertToUniqueRouteIds(providerId, mSelectedRoutes); + convertToUniqueRouteIds(providerId, mSelectableRoutes); + convertToUniqueRouteIds(providerId, mDeselectableRoutes); + convertToUniqueRouteIds(providerId, mTransferrableRoutes); return this; } + private void convertToUniqueRouteIds(@NonNull String providerId, + @NonNull List<String> routeIds) { + for (int i = 0; i < routeIds.size(); i++) { + String routeId = routeIds.get(i); + routeIds.set(i, MediaRoute2Info.toUniqueId(providerId, routeId)); + } + } + /** * Clears the selected routes. */ diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java index 6fe847bf5f3a..86b9706bf590 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java @@ -701,7 +701,6 @@ public class MediaRouter2Test { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { - // intentionally not using route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; @@ -741,7 +740,7 @@ public class MediaRouter2Test { } /** - * Returns a list of IDs (not uniqueId) of the given route list. + * Returns a list of IDs of the given route list. */ List<String> getRouteIds(@NonNull List<MediaRoute2Info> routes) { List<String> result = new ArrayList<>(); diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java index 83c7c173e8e8..1fd014113299 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java @@ -57,30 +57,37 @@ import java.util.function.Predicate; public class MediaRouterManagerTest { private static final String TAG = "MediaRouterManagerTest"; - // Must be the same as SampleMediaRoute2ProviderService - public static final String ROUTE_ID1 = "route_id1"; + public static final String SAMPLE_PROVIDER_ROUTES_ID_PREFIX = + "com.android.mediarouteprovider.example/.SampleMediaRoute2ProviderService:"; + + // Must be the same as SampleMediaRoute2ProviderService except the prefix of IDs. + public static final String ROUTE_ID1 = SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id1"; public static final String ROUTE_NAME1 = "Sample Route 1"; - public static final String ROUTE_ID2 = "route_id2"; + public static final String ROUTE_ID2 = SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id2"; public static final String ROUTE_NAME2 = "Sample Route 2"; public static final String ROUTE_ID3_SESSION_CREATION_FAILED = - "route_id3_session_creation_failed"; + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id3_session_creation_failed"; public static final String ROUTE_NAME3 = "Sample Route 3 - Session creation failed"; public static final String ROUTE_ID4_TO_SELECT_AND_DESELECT = - "route_id4_to_select_and_deselect"; + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id4_to_select_and_deselect"; public static final String ROUTE_NAME4 = "Sample Route 4 - Route to select and deselect"; - public static final String ROUTE_ID5_TO_TRANSFER_TO = "route_id5_to_transfer_to"; + public static final String ROUTE_ID5_TO_TRANSFER_TO = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id5_to_transfer_to"; public static final String ROUTE_NAME5 = "Sample Route 5 - Route to transfer to"; - public static final String ROUTE_ID_SPECIAL_CATEGORY = "route_special_category"; + public static final String ROUTE_ID_SPECIAL_CATEGORY = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_special_category"; public static final String ROUTE_NAME_SPECIAL_CATEGORY = "Special Category Route"; public static final String SYSTEM_PROVIDER_ID = "com.android.server.media/.SystemMediaRoute2Provider"; public static final int VOLUME_MAX = 100; - public static final String ROUTE_ID_FIXED_VOLUME = "route_fixed_volume"; + public static final String ROUTE_ID_FIXED_VOLUME = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_fixed_volume"; public static final String ROUTE_NAME_FIXED_VOLUME = "Fixed Volume Route"; - public static final String ROUTE_ID_VARIABLE_VOLUME = "route_variable_volume"; + public static final String ROUTE_ID_VARIABLE_VOLUME = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_variable_volume"; public static final String ROUTE_NAME_VARIABLE_VOLUME = "Variable Volume Route"; public static final String ACTION_REMOVE_ROUTE = @@ -430,7 +437,6 @@ public class MediaRouterManagerTest { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { - // intentionally not using route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; diff --git a/services/core/java/com/android/server/media/MediaRoute2Provider.java b/services/core/java/com/android/server/media/MediaRoute2Provider.java index 115155ce24b5..55c4e21dd830 100644 --- a/services/core/java/com/android/server/media/MediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/MediaRoute2Provider.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Intent; -import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import android.media.RouteSessionInfo; @@ -50,13 +49,13 @@ abstract class MediaRoute2Provider { String controlCategory, long requestId); public abstract void releaseSession(int sessionId); - public abstract void selectRoute(int sessionId, MediaRoute2Info route); - public abstract void deselectRoute(int sessionId, MediaRoute2Info route); - public abstract void transferToRoute(int sessionId, MediaRoute2Info route); + public abstract void selectRoute(int sessionId, String routeId); + public abstract void deselectRoute(int sessionId, String routeId); + public abstract void transferToRoute(int sessionId, String routeId); - public abstract void sendControlRequest(MediaRoute2Info route, Intent request); - public abstract void requestSetVolume(MediaRoute2Info route, int volume); - public abstract void requestUpdateVolume(MediaRoute2Info route, int delta); + public abstract void sendControlRequest(String routeId, Intent request); + public abstract void requestSetVolume(String routeId, int volume); + public abstract void requestUpdateVolume(String routeId, int delta); @NonNull public String getUniqueId() { diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java index f8d8f9fd5fbd..28bb034b33f7 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.media.IMediaRoute2Provider; import android.media.IMediaRoute2ProviderClient; -import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import android.media.MediaRoute2ProviderService; import android.media.RouteSessionInfo; @@ -95,46 +94,46 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv } @Override - public void selectRoute(int sessionId, MediaRoute2Info route) { + public void selectRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.selectRoute(sessionId, route.getId()); + mActiveConnection.selectRoute(sessionId, routeId); } } @Override - public void deselectRoute(int sessionId, MediaRoute2Info route) { + public void deselectRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.deselectRoute(sessionId, route.getId()); + mActiveConnection.deselectRoute(sessionId, routeId); } } @Override - public void transferToRoute(int sessionId, MediaRoute2Info route) { + public void transferToRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.transferToRoute(sessionId, route.getId()); + mActiveConnection.transferToRoute(sessionId, routeId); } } @Override - public void sendControlRequest(MediaRoute2Info route, Intent request) { + public void sendControlRequest(String routeId, Intent request) { if (mConnectionReady) { - mActiveConnection.sendControlRequest(route.getId(), request); + mActiveConnection.sendControlRequest(routeId, request); updateBinding(); } } @Override - public void requestSetVolume(MediaRoute2Info route, int volume) { + public void requestSetVolume(String routeId, int volume) { if (mConnectionReady) { - mActiveConnection.requestSetVolume(route.getId(), volume); + mActiveConnection.requestSetVolume(routeId, volume); updateBinding(); } } @Override - public void requestUpdateVolume(MediaRoute2Info route, int delta) { + public void requestUpdateVolume(String routeId, int delta) { if (mConnectionReady) { - mActiveConnection.requestUpdateVolume(route.getId(), delta); + mActiveConnection.requestUpdateVolume(routeId, delta); updateBinding(); } } diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 562a7200fb38..a5ffbb8f60e4 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -983,7 +983,7 @@ class MediaRouter2ServiceImpl { clientRecord, route, controlCategory, requestId); mSessionCreationRequests.add(request); - provider.requestCreateSession(clientRecord.mPackageName, route.getId(), + provider.requestCreateSession(clientRecord.mPackageName, route.getOriginalId(), controlCategory, requestId); } @@ -1000,7 +1000,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.selectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.selectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private void deselectRouteOnHandler(@NonNull Client2Record clientRecord, @@ -1016,7 +1017,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.deselectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.deselectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private void transferToRouteOnHandler(@NonNull Client2Record clientRecord, @@ -1032,7 +1034,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.transferToRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.transferToRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private boolean checkArgumentsForSessionControl(@NonNull Client2Record clientRecord, @@ -1239,21 +1242,21 @@ class MediaRouter2ServiceImpl { private void sendControlRequest(MediaRoute2Info route, Intent request) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.sendControlRequest(route, request); + provider.sendControlRequest(route.getOriginalId(), request); } } private void requestSetVolume(MediaRoute2Info route, int volume) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.requestSetVolume(route, volume); + provider.requestSetVolume(route.getOriginalId(), volume); } } private void requestUpdateVolume(MediaRoute2Info route, int delta) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.requestUpdateVolume(route, delta); + provider.requestUpdateVolume(route.getOriginalId(), delta); } } diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 8fdfcbfb2ad9..53027655390b 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -102,33 +102,33 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } @Override - public void selectRoute(int sessionId, MediaRoute2Info route) { + public void selectRoute(int sessionId, String routeId) { //TODO: implement method } @Override - public void deselectRoute(int sessionId, MediaRoute2Info route) { + public void deselectRoute(int sessionId, String routeId) { //TODO: implement method } @Override - public void transferToRoute(int sessionId, MediaRoute2Info route) { + public void transferToRoute(int sessionId, String routeId) { //TODO: implement method } //TODO: implement method @Override - public void sendControlRequest(@NonNull MediaRoute2Info route, @NonNull Intent request) { + public void sendControlRequest(@NonNull String routeId, @NonNull Intent request) { } //TODO: implement method @Override - public void requestSetVolume(MediaRoute2Info route, int volume) { + public void requestSetVolume(String routeId, int volume) { } //TODO: implement method @Override - public void requestUpdateVolume(MediaRoute2Info route, int delta) { + public void requestUpdateVolume(String routeId, int delta) { } void initializeRoutes() { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 70550ee27b8e..6bd9c4847a77 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -13452,9 +13452,7 @@ public class PackageManagerService extends IPackageManager.Stub // Okay! targetPackageSetting.setInstallerPackageName(installerPackageName); - if (installerPackageName != null) { - mSettings.mInstallerPackages.add(installerPackageName); - } + mSettings.addInstallerPackageNames(targetPackageSetting.installSource); scheduleWriteSettingsLocked(); } } @@ -15160,7 +15158,8 @@ public class PackageManagerService extends IPackageManager.Stub Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "updateSettings"); final String pkgName = pkg.getPackageName(); - final String installerPackageName = installArgs.installSource.installerPackageName; + final InstallSource installSource = installArgs.installSource; + final String installerPackageName = installSource.installerPackageName; final int[] installedForUsers = res.origUsers; final int installReason = installArgs.installReason; @@ -15171,7 +15170,7 @@ public class PackageManagerService extends IPackageManager.Stub // For system-bundled packages, we assume that installing an upgraded version // of the package implies that the user actually wants to run that new code, // so we enable the package. - PackageSetting ps = mSettings.mPackages.get(pkgName); + final PackageSetting ps = mSettings.mPackages.get(pkgName); final int userId = installArgs.user.getIdentifier(); if (ps != null) { if (isSystemApp(pkg)) { @@ -15208,8 +15207,8 @@ public class PackageManagerService extends IPackageManager.Stub ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, userId, installerPackageName); } - ps.setInstallSource(installArgs.installSource); - + ps.setInstallSource(installSource); + mSettings.addInstallerPackageNames(installSource); // When replacing an existing package, preserve the original install reason for all // users that had the package installed before. @@ -15239,7 +15238,6 @@ public class PackageManagerService extends IPackageManager.Stub res.name = pkgName; res.uid = pkg.getUid(); res.pkg = pkg; - mSettings.setInstallerPackageName(pkgName, installerPackageName); res.setReturnCode(PackageManager.INSTALL_SUCCEEDED); //to update install status Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings"); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 9642a1a21cf3..f9a336166825 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -280,8 +280,11 @@ public final class Settings { /** Map from package name to settings */ final ArrayMap<String, PackageSetting> mPackages = new ArrayMap<>(); - /** List of packages that installed other packages */ - final ArraySet<String> mInstallerPackages = new ArraySet<>(); + /** + * List of packages that were involved in installing other packages, i.e. are listed + * in at least one app's InstallSource. + */ + private final ArraySet<String> mInstallerPackages = new ArraySet<>(); /** Map from package name to appId and excluded userids */ private final ArrayMap<String, KernelPackageState> mKernelMapping = new ArrayMap<>(); @@ -441,16 +444,6 @@ public final class Settings { return mPermissions.canPropagatePermissionToInstantApp(permName); } - void setInstallerPackageName(String pkgName, String installerPkgName) { - PackageSetting p = mPackages.get(pkgName); - if (p != null) { - p.setInstallerPackageName(installerPkgName); - if (installerPkgName != null) { - mInstallerPackages.add(installerPkgName); - } - } - } - /** Gets and optionally creates a new shared user id. */ SharedUserSetting getSharedUserLPw(String name, int pkgFlags, int pkgPrivateFlags, boolean create) throws PackageManagerException { @@ -3777,9 +3770,10 @@ public final class Settings { } if (packageSetting != null) { packageSetting.uidError = "true".equals(uidError); - packageSetting.installSource = InstallSource.create( + InstallSource installSource = InstallSource.create( installInitiatingPackageName, installOriginatingPackageName, installerPackageName, "true".equals(isOrphaned)); + packageSetting.installSource = installSource; packageSetting.volumeUuid = volumeUuid; packageSetting.categoryHint = categoryHint; packageSetting.legacyNativeLibraryPathString = legacyNativeLibraryPathStr; @@ -3809,9 +3803,7 @@ public final class Settings { packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null); } - if (installerPackageName != null) { - mInstallerPackages.add(installerPackageName); - } + addInstallerPackageNames(installSource); int outerDepth = parser.getDepth(); int type; @@ -3870,6 +3862,18 @@ public final class Settings { } } + void addInstallerPackageNames(InstallSource installSource) { + if (installSource.installerPackageName != null) { + mInstallerPackages.add(installSource.installerPackageName); + } + if (installSource.initiatingPackageName != null) { + mInstallerPackages.add(installSource.initiatingPackageName); + } + if (installSource.originatingPackageName != null) { + mInstallerPackages.add(installSource.originatingPackageName); + } + } + private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser, int userId) throws IOException, XmlPullParserException { int outerDepth = parser.getDepth(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 4e768da18041..96bc8e963b38 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -792,8 +792,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mSeq = seq; mPowerManagerWrapper = powerManagerWrapper; mForceSeamlesslyRotate = token.mRoundedCornerOverlay; - mRequestedInsetsState = - getDisplayContent().getInsetsPolicy().getInsetsForDispatch(this); + mRequestedInsetsState = new InsetsState( + getDisplayContent().getInsetsPolicy().getInsetsForDispatch(this), + true /* copySources */); if (DEBUG) { Slog.v(TAG, "Window " + this + " client=" + c.asBinder() + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a); diff --git a/wifi/java/android/net/wifi/SoftApCapability.java b/wifi/java/android/net/wifi/SoftApCapability.java index c4474e2bc9cc..2bbe7d2aa4ec 100644 --- a/wifi/java/android/net/wifi/SoftApCapability.java +++ b/wifi/java/android/net/wifi/SoftApCapability.java @@ -61,11 +61,20 @@ public final class SoftApCapability implements Parcelable { */ public static final int SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 1 << 1; + + /** + * Support for WPA3 Simultaneous Authentication of Equals (WPA3-SAE). + * + * flag when {@link config_wifi_softap_sae_supported)} is true. + */ + public static final int SOFTAP_FEATURE_WPA3_SAE = 1 << 2; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(flag = true, prefix = { "SOFTAP_FEATURE_" }, value = { SOFTAP_FEATURE_ACS_OFFLOAD, SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT, + SOFTAP_FEATURE_WPA3_SAE, }) public @interface HotspotFeatures {} diff --git a/wifi/java/android/net/wifi/SoftApConfiguration.java b/wifi/java/android/net/wifi/SoftApConfiguration.java index 05e245b8eabc..65e9b7910e5e 100644 --- a/wifi/java/android/net/wifi/SoftApConfiguration.java +++ b/wifi/java/android/net/wifi/SoftApConfiguration.java @@ -25,6 +25,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; @@ -55,6 +56,11 @@ import java.util.concurrent.Executor; @SystemApi public final class SoftApConfiguration implements Parcelable { + @VisibleForTesting + static final int PSK_MIN_LEN = 8; + @VisibleForTesting + static final int PSK_MAX_LEN = 63; + /** * 2GHz band. * @hide @@ -142,9 +148,10 @@ public final class SoftApConfiguration implements Parcelable { private final @Nullable MacAddress mBssid; /** - * Pre-shared key for WPA2-PSK encryption (non-null enables WPA2-PSK). + * Pre-shared key for WPA2-PSK or WPA3-SAE-Transition or WPA3-SAE encryption which depends on + * the security type. */ - private final @Nullable String mWpa2Passphrase; + private final @Nullable String mPassphrase; /** * This is a network that does not broadcast its SSID, so an @@ -186,20 +193,30 @@ public final class SoftApConfiguration implements Parcelable { public static final int SECURITY_TYPE_WPA2_PSK = 1; /** @hide */ + @SystemApi + public static final int SECURITY_TYPE_WPA3_SAE_TRANSITION = 2; + + /** @hide */ + @SystemApi + public static final int SECURITY_TYPE_WPA3_SAE = 3; + + /** @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "SECURITY_TYPE" }, value = { + @IntDef(prefix = { "SECURITY_TYPE_" }, value = { SECURITY_TYPE_OPEN, SECURITY_TYPE_WPA2_PSK, + SECURITY_TYPE_WPA3_SAE_TRANSITION, + SECURITY_TYPE_WPA3_SAE, }) public @interface SecurityType {} /** Private constructor for Builder and Parcelable implementation. */ private SoftApConfiguration(@Nullable String ssid, @Nullable MacAddress bssid, - @Nullable String wpa2Passphrase, boolean hiddenSsid, @BandType int band, int channel, + @Nullable String passphrase, boolean hiddenSsid, @BandType int band, int channel, @SecurityType int securityType, int maxNumberOfClients) { mSsid = ssid; mBssid = bssid; - mWpa2Passphrase = wpa2Passphrase; + mPassphrase = passphrase; mHiddenSsid = hiddenSsid; mBand = band; mChannel = channel; @@ -218,7 +235,7 @@ public final class SoftApConfiguration implements Parcelable { SoftApConfiguration other = (SoftApConfiguration) otherObj; return Objects.equals(mSsid, other.mSsid) && Objects.equals(mBssid, other.mBssid) - && Objects.equals(mWpa2Passphrase, other.mWpa2Passphrase) + && Objects.equals(mPassphrase, other.mPassphrase) && mHiddenSsid == other.mHiddenSsid && mBand == other.mBand && mChannel == other.mChannel @@ -228,7 +245,7 @@ public final class SoftApConfiguration implements Parcelable { @Override public int hashCode() { - return Objects.hash(mSsid, mBssid, mWpa2Passphrase, mHiddenSsid, + return Objects.hash(mSsid, mBssid, mPassphrase, mHiddenSsid, mBand, mChannel, mSecurityType, mMaxNumberOfClients); } @@ -237,8 +254,8 @@ public final class SoftApConfiguration implements Parcelable { StringBuilder sbuf = new StringBuilder(); sbuf.append("ssid=").append(mSsid); if (mBssid != null) sbuf.append(" \n bssid=").append(mBssid.toString()); - sbuf.append(" \n Wpa2Passphrase =").append( - TextUtils.isEmpty(mWpa2Passphrase) ? "<empty>" : "<non-empty>"); + sbuf.append(" \n Passphrase =").append( + TextUtils.isEmpty(mPassphrase) ? "<empty>" : "<non-empty>"); sbuf.append(" \n HiddenSsid =").append(mHiddenSsid); sbuf.append(" \n Band =").append(mBand); sbuf.append(" \n Channel =").append(mChannel); @@ -251,7 +268,7 @@ public final class SoftApConfiguration implements Parcelable { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(mSsid); dest.writeParcelable(mBssid, flags); - dest.writeString(mWpa2Passphrase); + dest.writeString(mPassphrase); dest.writeBoolean(mHiddenSsid); dest.writeInt(mBand); dest.writeInt(mChannel); @@ -299,13 +316,26 @@ public final class SoftApConfiguration implements Parcelable { return mBssid; } + // TODO: Remove it after update the caller /** * Returns String set to be passphrase for the WPA2-PSK AP. - * {@link Builder#setWpa2Passphrase(String)}. + * {@link #setWpa2Passphrase(String)}. */ @Nullable public String getWpa2Passphrase() { - return mWpa2Passphrase; + if (mSecurityType == SECURITY_TYPE_WPA2_PSK) { + return mPassphrase; + } + return null; + } + + /** + * Returns String set to be passphrase for current AP. + * {@link #setPassphrase(String, @SecurityType int)}. + */ + @Nullable + public String getPassphrase() { + return mPassphrase; } /** @@ -360,23 +390,12 @@ public final class SoftApConfiguration implements Parcelable { public static final class Builder { private String mSsid; private MacAddress mBssid; - private String mWpa2Passphrase; + private String mPassphrase; private boolean mHiddenSsid; private int mBand; private int mChannel; private int mMaxNumberOfClients; - - private int setSecurityType() { - int securityType = SECURITY_TYPE_OPEN; - if (!TextUtils.isEmpty(mWpa2Passphrase)) { // WPA2-PSK network. - securityType = SECURITY_TYPE_WPA2_PSK; - } - return securityType; - } - - private void clearAllPassphrase() { - mWpa2Passphrase = null; - } + private int mSecurityType; /** * Constructs a Builder with default values (see {@link Builder}). @@ -384,11 +403,12 @@ public final class SoftApConfiguration implements Parcelable { public Builder() { mSsid = null; mBssid = null; - mWpa2Passphrase = null; + mPassphrase = null; mHiddenSsid = false; mBand = BAND_2GHZ; mChannel = 0; mMaxNumberOfClients = 0; + mSecurityType = SECURITY_TYPE_OPEN; } /** @@ -399,11 +419,12 @@ public final class SoftApConfiguration implements Parcelable { mSsid = other.mSsid; mBssid = other.mBssid; - mWpa2Passphrase = other.mWpa2Passphrase; + mPassphrase = other.mPassphrase; mHiddenSsid = other.mHiddenSsid; mBand = other.mBand; mChannel = other.mChannel; mMaxNumberOfClients = other.mMaxNumberOfClients; + mSecurityType = other.mSecurityType; } /** @@ -413,8 +434,8 @@ public final class SoftApConfiguration implements Parcelable { */ @NonNull public SoftApConfiguration build() { - return new SoftApConfiguration(mSsid, mBssid, mWpa2Passphrase, - mHiddenSsid, mBand, mChannel, setSecurityType(), mMaxNumberOfClients); + return new SoftApConfiguration(mSsid, mBssid, mPassphrase, + mHiddenSsid, mBand, mChannel, mSecurityType, mMaxNumberOfClients); } /** @@ -461,6 +482,7 @@ public final class SoftApConfiguration implements Parcelable { return this; } + // TODO: Remove it after update the caller /** * Specifies that this AP should use WPA2-PSK with the given ASCII WPA2 passphrase. * When set to null, an open network is created. @@ -473,15 +495,47 @@ public final class SoftApConfiguration implements Parcelable { */ @NonNull public Builder setWpa2Passphrase(@Nullable String passphrase) { - if (passphrase != null) { + return setPassphrase(passphrase, SECURITY_TYPE_WPA2_PSK); + } + + /** + * Specifies that this AP should use specific security type with the given ASCII passphrase. + * + * @param securityType one of the security types from {@link @SecurityType}. + * @param passphrase The passphrase to use for sepcific {@link @SecurityType} configuration + * or null with {@link @SecurityType#SECURITY_TYPE_OPEN}. + * + * @return Builder for chaining. + * @throws IllegalArgumentException when the passphrase length is invalid and + * {@code securityType} is not {@link @SecurityType#SECURITY_TYPE_OPEN} + * or non-null passphrase and {@code securityType} is + * {@link @SecurityType#SECURITY_TYPE_OPEN}. + */ + @NonNull + public Builder setPassphrase(@Nullable String passphrase, @SecurityType int securityType) { + if (securityType == SECURITY_TYPE_OPEN) { + if (passphrase != null) { + throw new IllegalArgumentException( + "passphrase should be null when security type is open"); + } + } else { + Preconditions.checkStringNotEmpty(passphrase); final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder(); if (!asciiEncoder.canEncode(passphrase)) { throw new IllegalArgumentException("passphrase not ASCII encodable"); } - Preconditions.checkStringNotEmpty(passphrase); + if (securityType == SECURITY_TYPE_WPA2_PSK + || securityType == SECURITY_TYPE_WPA3_SAE_TRANSITION) { + if (passphrase.length() < PSK_MIN_LEN || passphrase.length() > PSK_MAX_LEN) { + throw new IllegalArgumentException( + "Password size must be at least " + PSK_MIN_LEN + + " and no more than " + PSK_MAX_LEN + + " for WPA2_PSK and WPA3_SAE_TRANSITION Mode"); + } + } } - clearAllPassphrase(); - mWpa2Passphrase = passphrase; + mSecurityType = securityType; + mPassphrase = passphrase; return this; } diff --git a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java index 1f601036a718..acd334355806 100644 --- a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java @@ -25,8 +25,12 @@ import androidx.test.filters.SmallTest; import org.junit.Test; +import java.util.Random; + @SmallTest public class SoftApConfigurationTest { + private static final String TEST_CHAR_SET_AS_STRING = "abcdefghijklmnopqrstuvwxyz0123456789"; + private SoftApConfiguration parcelUnparcel(SoftApConfiguration configIn) { Parcel parcel = Parcel.obtain(); parcel.writeParcelable(configIn, 0); @@ -37,6 +41,25 @@ public class SoftApConfigurationTest { return configOut; } + /** + * Helper method to generate random string. + * + * Note: this method has limited use as a random string generator. + * The characters used in this method do no not cover all valid inputs. + * @param length number of characters to generate for the string + * @return String generated string of random characters + */ + private String generateRandomString(int length) { + Random random = new Random(); + StringBuilder stringBuilder = new StringBuilder(length); + int index = -1; + while (stringBuilder.length() < length) { + index = random.nextInt(TEST_CHAR_SET_AS_STRING.length()); + stringBuilder.append(TEST_CHAR_SET_AS_STRING.charAt(index)); + } + return stringBuilder.toString(); + } + @Test public void testBasicSettings() { SoftApConfiguration original = new SoftApConfiguration.Builder() @@ -45,7 +68,7 @@ public class SoftApConfigurationTest { .build(); assertThat(original.getSsid()).isEqualTo("ssid"); assertThat(original.getBssid()).isEqualTo(MacAddress.fromString("11:22:33:44:55:66")); - assertThat(original.getWpa2Passphrase()).isNull(); + assertThat(original.getPassphrase()).isNull(); assertThat(original.getSecurityType()).isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN); assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_2GHZ); assertThat(original.getChannel()).isEqualTo(0); @@ -66,9 +89,9 @@ public class SoftApConfigurationTest { @Test public void testWpa2() { SoftApConfiguration original = new SoftApConfiguration.Builder() - .setWpa2Passphrase("secretsecret") + .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) .build(); - assertThat(original.getWpa2Passphrase()).isEqualTo("secretsecret"); + assertThat(original.getPassphrase()).isEqualTo("secretsecret"); assertThat(original.getSecurityType()).isEqualTo( SoftApConfiguration.SECURITY_TYPE_WPA2_PSK); assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_2GHZ); @@ -90,13 +113,12 @@ public class SoftApConfigurationTest { @Test public void testWpa2WithAllFieldCustomized() { SoftApConfiguration original = new SoftApConfiguration.Builder() - .setWpa2Passphrase("secretsecret") - .setBand(SoftApConfiguration.BAND_ANY) + .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) .setChannel(149, SoftApConfiguration.BAND_5GHZ) .setHiddenSsid(true) .setMaxNumberOfClients(10) .build(); - assertThat(original.getWpa2Passphrase()).isEqualTo("secretsecret"); + assertThat(original.getPassphrase()).isEqualTo("secretsecret"); assertThat(original.getSecurityType()).isEqualTo( SoftApConfiguration.SECURITY_TYPE_WPA2_PSK); assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ); @@ -114,4 +136,98 @@ public class SoftApConfigurationTest { assertThat(copy).isEqualTo(original); assertThat(copy.hashCode()).isEqualTo(original.hashCode()); } + + @Test + public void testWpa3Sae() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA3_SAE) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + assertThat(original.getPassphrase()).isEqualTo("secretsecret"); + assertThat(original.getSecurityType()).isEqualTo( + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE); + assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ); + assertThat(original.getChannel()).isEqualTo(149); + assertThat(original.isHiddenSsid()).isEqualTo(true); + + + SoftApConfiguration unparceled = parcelUnparcel(original); + assertThat(unparceled).isNotSameAs(original); + assertThat(unparceled).isEqualTo(original); + assertThat(unparceled.hashCode()).isEqualTo(original.hashCode()); + + SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build(); + assertThat(copy).isNotSameAs(original); + assertThat(copy).isEqualTo(original); + assertThat(copy.hashCode()).isEqualTo(original.hashCode()); + } + + @Test + public void testWpa3SaeTransition() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase("secretsecret", + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + assertThat(original.getSecurityType()).isEqualTo( + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION); + assertThat(original.getPassphrase()).isEqualTo("secretsecret"); + assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ); + assertThat(original.getChannel()).isEqualTo(149); + assertThat(original.isHiddenSsid()).isEqualTo(true); + + + SoftApConfiguration unparceled = parcelUnparcel(original); + assertThat(unparceled).isNotSameAs(original); + assertThat(unparceled).isEqualTo(original); + assertThat(unparceled.hashCode()).isEqualTo(original.hashCode()); + + SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build(); + assertThat(copy).isNotSameAs(original); + assertThat(copy).isEqualTo(original); + assertThat(copy.hashCode()).isEqualTo(original.hashCode()); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidShortPasswordLengthForWpa2() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MIN_LEN - 1), + SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidLongPasswordLengthForWpa2() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MAX_LEN + 1), + SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidShortPasswordLengthForWpa3SaeTransition() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MIN_LEN - 1), + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidLongPasswordLengthForWpa3SaeTransition() { + SoftApConfiguration original = new SoftApConfiguration.Builder() + .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MAX_LEN + 1), + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) + .setChannel(149, SoftApConfiguration.BAND_5GHZ) + .setHiddenSsid(true) + .build(); + } + } |