Merge changes I34ef76ec,Icf686c3d am: 7f60b13ff5 am: 7d8db6692d
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1597313 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ia85c2c51f678fc72afb4ca7ad457c56f36425ca9
This commit is contained in:
@@ -17,8 +17,9 @@
|
|||||||
package android.net.vcn;
|
package android.net.vcn;
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
interface IVcnStatusCallback {
|
oneway interface IVcnStatusCallback {
|
||||||
void onEnteredSafeMode();
|
void onEnteredSafeMode();
|
||||||
|
void onVcnStatusChanged(int statusCode);
|
||||||
void onGatewayConnectionError(
|
void onGatewayConnectionError(
|
||||||
in int[] gatewayNetworkCapabilities,
|
in int[] gatewayNetworkCapabilities,
|
||||||
int errorCode,
|
int errorCode,
|
||||||
|
|||||||
@@ -346,6 +346,56 @@ public class VcnManager {
|
|||||||
policy.isTeardownRequested(), policy.getMergedNetworkCapabilities());
|
policy.isTeardownRequested(), policy.getMergedNetworkCapabilities());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntDef({
|
||||||
|
VCN_STATUS_CODE_NOT_CONFIGURED,
|
||||||
|
VCN_STATUS_CODE_INACTIVE,
|
||||||
|
VCN_STATUS_CODE_ACTIVE,
|
||||||
|
VCN_STATUS_CODE_SAFE_MODE
|
||||||
|
})
|
||||||
|
public @interface VcnStatusCode {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value indicating that the VCN for the subscription group is not configured, or that the
|
||||||
|
* callback is not privileged for the subscription group.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int VCN_STATUS_CODE_NOT_CONFIGURED = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value indicating that the VCN for the subscription group is inactive.
|
||||||
|
*
|
||||||
|
* <p>A VCN is inactive if a {@link VcnConfig} is present for the subscription group, but the
|
||||||
|
* provisioning package is not privileged.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int VCN_STATUS_CODE_INACTIVE = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value indicating that the VCN for the subscription group is active.
|
||||||
|
*
|
||||||
|
* <p>A VCN is active if a {@link VcnConfig} is present for the subscription, the provisioning
|
||||||
|
* package is privileged, and the VCN is not in Safe Mode. In other words, a VCN is considered
|
||||||
|
* active while it is connecting, fully connected, and disconnecting.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int VCN_STATUS_CODE_ACTIVE = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value indicating that the VCN for the subscription group is in Safe Mode.
|
||||||
|
*
|
||||||
|
* <p>A VCN will be put into Safe Mode if any of the gateway connections were unable to
|
||||||
|
* establish a connection within a system-determined timeout (while underlying networks were
|
||||||
|
* available).
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int VCN_STATUS_CODE_SAFE_MODE = 3;
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@IntDef({
|
@IntDef({
|
||||||
@@ -403,8 +453,18 @@ public class VcnManager {
|
|||||||
*
|
*
|
||||||
* <p>A VCN-configuring app may opt to exit safe mode by (re)setting the VCN configuration
|
* <p>A VCN-configuring app may opt to exit safe mode by (re)setting the VCN configuration
|
||||||
* via {@link #setVcnConfig(ParcelUuid, VcnConfig)}.
|
* via {@link #setVcnConfig(ParcelUuid, VcnConfig)}.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public abstract void onEnteredSafeMode();
|
public void onEnteredSafeMode() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when status of the VCN for this callback's subscription group changes.
|
||||||
|
*
|
||||||
|
* @param statusCode the code for the status change encountered by this {@link
|
||||||
|
* VcnStatusCallback}'s subscription group.
|
||||||
|
*/
|
||||||
|
public abstract void onVcnStatusChanged(@VcnStatusCode int statusCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoked when a VCN Gateway Connection corresponding to this callback's subscription
|
* Invoked when a VCN Gateway Connection corresponding to this callback's subscription
|
||||||
@@ -436,6 +496,11 @@ public class VcnManager {
|
|||||||
* <p>A {@link VcnStatusCallback} will only be invoked if the registering package has carrier
|
* <p>A {@link VcnStatusCallback} will only be invoked if the registering package has carrier
|
||||||
* privileges for the specified subscription at the time of invocation.
|
* privileges for the specified subscription at the time of invocation.
|
||||||
*
|
*
|
||||||
|
* <p>{@link VcnStatusCallback#onVcnStatusChanged(int)} will be invoked on registration with the
|
||||||
|
* current status for the specified subscription group's VCN. If the registrant is not
|
||||||
|
* privileged for this subscription group, {@link #VCN_STATUS_CODE_NOT_CONFIGURED} will be
|
||||||
|
* returned.
|
||||||
|
*
|
||||||
* @param subscriptionGroup The subscription group to match for callbacks
|
* @param subscriptionGroup The subscription group to match for callbacks
|
||||||
* @param executor The {@link Executor} to be used for invoking callbacks
|
* @param executor The {@link Executor} to be used for invoking callbacks
|
||||||
* @param callback The VcnStatusCallback to be registered
|
* @param callback The VcnStatusCallback to be registered
|
||||||
@@ -539,6 +604,12 @@ public class VcnManager {
|
|||||||
() -> mExecutor.execute(() -> mCallback.onEnteredSafeMode()));
|
() -> mExecutor.execute(() -> mCallback.onEnteredSafeMode()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVcnStatusChanged(@VcnStatusCode int statusCode) {
|
||||||
|
Binder.withCleanCallingIdentity(
|
||||||
|
() -> mExecutor.execute(() -> mCallback.onVcnStatusChanged(statusCode)));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(b/180521637): use ServiceSpecificException for safer Exception 'parceling'
|
// TODO(b/180521637): use ServiceSpecificException for safer Exception 'parceling'
|
||||||
@Override
|
@Override
|
||||||
public void onGatewayConnectionError(
|
public void onGatewayConnectionError(
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server;
|
package com.android.server;
|
||||||
|
|
||||||
|
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
|
||||||
|
|
||||||
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
|
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
|
||||||
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionTrackerCallback;
|
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionTrackerCallback;
|
||||||
|
|
||||||
@@ -837,7 +839,10 @@ public class VcnManagementService extends IVcnManagementService.Stub {
|
|||||||
// Notify all registered StatusCallbacks for this subGroup
|
// Notify all registered StatusCallbacks for this subGroup
|
||||||
for (VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) {
|
for (VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) {
|
||||||
if (isCallbackPermissioned(cbInfo)) {
|
if (isCallbackPermissioned(cbInfo)) {
|
||||||
Binder.withCleanCallingIdentity(() -> cbInfo.mCallback.onEnteredSafeMode());
|
Binder.withCleanCallingIdentity(
|
||||||
|
() ->
|
||||||
|
cbInfo.mCallback.onVcnStatusChanged(
|
||||||
|
VCN_STATUS_CODE_SAFE_MODE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package android.net.vcn;
|
package android.net.vcn;
|
||||||
|
|
||||||
|
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
|
||||||
|
|
||||||
import static androidx.test.InstrumentationRegistry.getContext;
|
import static androidx.test.InstrumentationRegistry.getContext;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -204,6 +206,9 @@ public class VcnManagerTest {
|
|||||||
cbBinder.onEnteredSafeMode();
|
cbBinder.onEnteredSafeMode();
|
||||||
verify(mMockStatusCallback).onEnteredSafeMode();
|
verify(mMockStatusCallback).onEnteredSafeMode();
|
||||||
|
|
||||||
|
cbBinder.onVcnStatusChanged(VCN_STATUS_CODE_ACTIVE);
|
||||||
|
verify(mMockStatusCallback).onVcnStatusChanged(VCN_STATUS_CODE_ACTIVE);
|
||||||
|
|
||||||
cbBinder.onGatewayConnectionError(
|
cbBinder.onGatewayConnectionError(
|
||||||
UNDERLYING_NETWORK_CAPABILITIES,
|
UNDERLYING_NETWORK_CAPABILITIES,
|
||||||
VcnManager.VCN_ERROR_CODE_NETWORK_ERROR,
|
VcnManager.VCN_ERROR_CODE_NETWORK_ERROR,
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ import static org.mockito.Mockito.doThrow;
|
|||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@@ -59,6 +58,7 @@ import android.net.vcn.IVcnStatusCallback;
|
|||||||
import android.net.vcn.IVcnUnderlyingNetworkPolicyListener;
|
import android.net.vcn.IVcnUnderlyingNetworkPolicyListener;
|
||||||
import android.net.vcn.VcnConfig;
|
import android.net.vcn.VcnConfig;
|
||||||
import android.net.vcn.VcnConfigTest;
|
import android.net.vcn.VcnConfigTest;
|
||||||
|
import android.net.vcn.VcnManager;
|
||||||
import android.net.vcn.VcnUnderlyingNetworkPolicy;
|
import android.net.vcn.VcnUnderlyingNetworkPolicy;
|
||||||
import android.net.wifi.WifiInfo;
|
import android.net.wifi.WifiInfo;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -783,7 +783,7 @@ public class VcnManagementServiceTest {
|
|||||||
true /* hasPermissionsforSubGroup */,
|
true /* hasPermissionsforSubGroup */,
|
||||||
true /* hasLocationPermission */);
|
true /* hasLocationPermission */);
|
||||||
|
|
||||||
verify(mMockStatusCallback, times(1)).onEnteredSafeMode();
|
verify(mMockStatusCallback).onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -795,7 +795,8 @@ public class VcnManagementServiceTest {
|
|||||||
false /* hasPermissionsforSubGroup */,
|
false /* hasPermissionsforSubGroup */,
|
||||||
true /* hasLocationPermission */);
|
true /* hasLocationPermission */);
|
||||||
|
|
||||||
verify(mMockStatusCallback, never()).onEnteredSafeMode();
|
verify(mMockStatusCallback, never())
|
||||||
|
.onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -807,7 +808,8 @@ public class VcnManagementServiceTest {
|
|||||||
true /* hasPermissionsforSubGroup */,
|
true /* hasPermissionsforSubGroup */,
|
||||||
false /* hasLocationPermission */);
|
false /* hasLocationPermission */);
|
||||||
|
|
||||||
verify(mMockStatusCallback, never()).onEnteredSafeMode();
|
verify(mMockStatusCallback, never())
|
||||||
|
.onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user