diff options
| author | Benedict Wong <benedictwong@google.com> | 2022-03-18 21:56:29 +0000 |
|---|---|---|
| committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-03-18 21:56:29 +0000 |
| commit | f1dacac9ea072ab9ca2f51fb6bc9544713348582 (patch) | |
| tree | 82795de39b1ba8c25fce87a6da51f7f737b77f05 /core/java | |
| parent | 9b79ebed9b0c3d20e845d78526a71336711a6c59 (diff) | |
| parent | 7d042ad4024de9bb0783bb192b2f00b181e01e80 (diff) | |
Merge changes I67470903,Ia80da6d4,I332397f4 am: 7d042ad402
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2030266
Change-Id: I175fb96d3f0ac485aa36675d2808c4899ef30d36
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/net/IVpnManager.aidl | 2 | ||||
| -rw-r--r-- | core/java/android/net/VpnManager.java | 32 | ||||
| -rw-r--r-- | core/java/android/net/VpnProfileState.aidl | 19 | ||||
| -rw-r--r-- | core/java/android/net/VpnProfileState.java | 153 |
4 files changed, 206 insertions, 0 deletions
diff --git a/core/java/android/net/IVpnManager.aidl b/core/java/android/net/IVpnManager.aidl index 070efa363cc0..b4647cabe1bc 100644 --- a/core/java/android/net/IVpnManager.aidl +++ b/core/java/android/net/IVpnManager.aidl @@ -17,6 +17,7 @@ package android.net; import android.net.Network; +import android.net.VpnProfileState; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; @@ -40,6 +41,7 @@ interface IVpnManager { void deleteVpnProfile(String packageName); String startVpnProfile(String packageName); void stopVpnProfile(String packageName); + VpnProfileState getProvisionedVpnProfileState(String packageName); /** Always-on VPN APIs */ boolean isAlwaysOnVpnPackageSupported(int userId, String packageName); diff --git a/core/java/android/net/VpnManager.java b/core/java/android/net/VpnManager.java index c51444cd31b6..ae7d91f92cb7 100644 --- a/core/java/android/net/VpnManager.java +++ b/core/java/android/net/VpnManager.java @@ -161,6 +161,23 @@ public class VpnManager { "android.net.category.EVENT_DEACTIVATED_BY_USER"; /** + * The always-on state of this VPN was changed + * + * <p>This may be the result of a user changing VPN settings, or a Device Policy Manager app + * having changed the VPN policy. + */ + @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY) + public static final String CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED = + "android.net.category.EVENT_ALWAYS_ON_STATE_CHANGED"; + + /** + * The VpnProfileState at the time that this event occurred. + * + * <p>This extra may be null if the VPN was revoked by the user, or the profile was deleted. + */ + public static final String EXTRA_VPN_PROFILE_STATE = "android.net.extra.VPN_PROFILE_STATE"; + + /** * The key of the session that experienced this event, as a {@code String}. * * This is the same key that was returned by {@link #startProvisionedVpnProfileSession}. @@ -403,6 +420,21 @@ public class VpnManager { } /** + * Retrieve the VpnProfileState for the profile provisioned by the calling package. + * + * @return the VpnProfileState with current information, or null if there was no profile + * provisioned by the calling package. + */ + @Nullable + public VpnProfileState getProvisionedVpnProfileState() { + try { + return mService.getProvisionedVpnProfileState(mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Resets all VPN settings back to factory defaults. * @hide */ diff --git a/core/java/android/net/VpnProfileState.aidl b/core/java/android/net/VpnProfileState.aidl new file mode 100644 index 000000000000..add6386eda75 --- /dev/null +++ b/core/java/android/net/VpnProfileState.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 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; + +parcelable VpnProfileState;
\ No newline at end of file diff --git a/core/java/android/net/VpnProfileState.java b/core/java/android/net/VpnProfileState.java new file mode 100644 index 000000000000..c69ea1a8c220 --- /dev/null +++ b/core/java/android/net/VpnProfileState.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2022 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; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.Parcel; +import android.os.Parcelable; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Describe the state of VPN. + */ +public final class VpnProfileState implements Parcelable { + /** The VPN has not been started, or some other VPN is active. */ + public static final int STATE_DISCONNECTED = 0; + /** The VPN is attempting to connect, potentially after a failure. */ + public static final int STATE_CONNECTING = 1; + /** The VPN was established successfully. */ + public static final int STATE_CONNECTED = 2; + /** A non-recoverable error has occurred, and will not be retried. */ + public static final int STATE_FAILED = 3; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = {"STATE_"}, value = { + STATE_CONNECTED, + STATE_CONNECTING, + STATE_DISCONNECTED, + STATE_FAILED, + }) + public @interface State {} + + @State private final int mState; + private final String mSessionKey; + private final boolean mAlwaysOn; + private final boolean mLockdown; + + public VpnProfileState(@State int state, @Nullable String sessionKey, boolean alwaysOn, + boolean lockdown) { + mState = state; + mSessionKey = sessionKey; + mAlwaysOn = alwaysOn; + mLockdown = lockdown; + } + + /** + * Returns the state of the Platform VPN + * + * <p>This state represents the internal connection state of the VPN. This state may diverge + * from the VPN Network's state during error and recovery handling. + */ + @State public int getState() { + return mState; + } + + /** + * Retrieves the Session Key + * + * <p>The session key is an ephemeral key uniquely identifying the session for a Platform VPN. + * The lifetime of this key is tied to the lifetime of the VPN session. In other words, + * reprovisioning of the VPN profile, restarting of the device, or manually restarting the + * platform VPN session will result in a new VPN session, and a new key. + * + * @return the unique key for the platform VPN session, or null if it is not running. + */ + @Nullable + public String getSessionId() { + return mSessionKey; + } + + /** + * Returns the always-on status of the PlatformVpnProfile. + * + * <p>If the PlatformVpnProfile is set to be running in always-on mode, the system will ensure + * that the profile is always started, and restarting it when necessary (e.g. after reboot). + * + * <p>Always-on can be set by an appropriately privileged user via the Settings VPN menus, or by + * the Device Policy Manager app programmatically. + * + * See DevicePolicyManager#setAlwaysOnVpnPackage(ComponentName, String, boolean, Set) + */ + public boolean isAlwaysOn() { + return mAlwaysOn; + } + + /** + * Returns the lockdown mode status of the PlatformVpnProfile. + * + * <p>In lockdown mode, the system will ensure that apps are not allowed to bypass the VPN, + * including during startup or failure of the VPN. + * + * <p>Lockdown mode can be set by an appropriately privileged user via the Settings VPN menus, + * or by the Device Policy Manager app programmatically. + * + * See DevicePolicyManager#setAlwaysOnVpnPackage(ComponentName, String, boolean, Set) + */ + public boolean isLockdownEnabled() { + return mLockdown; + } + + /** + * Implement the Parcelable interface + */ + public int describeContents() { + return 0; + } + + /** + * Implement the Parcelable interface + */ + public void writeToParcel(@NonNull Parcel out, int flags) { + out.writeInt(mState); + out.writeString(mSessionKey); + out.writeBoolean(mAlwaysOn); + out.writeBoolean(mLockdown); + } + + @NonNull + public static final Parcelable.Creator<VpnProfileState> CREATOR = + new Parcelable.Creator<VpnProfileState>() { + public VpnProfileState createFromParcel(Parcel in) { + return new VpnProfileState(in); + } + + public VpnProfileState[] newArray(int size) { + return new VpnProfileState[size]; + } + }; + + private VpnProfileState(Parcel in) { + mState = in.readInt(); + mSessionKey = in.readString(); + mAlwaysOn = in.readBoolean(); + mLockdown = in.readBoolean(); + } +} |
