diff options
7 files changed, 362 insertions, 0 deletions
diff --git a/apishim/29/com/android/networkstack/apishim/api29/CaptivePortalDataShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/CaptivePortalDataShimImpl.java new file mode 100644 index 0000000..d6e6b53 --- /dev/null +++ b/apishim/29/com/android/networkstack/apishim/api29/CaptivePortalDataShimImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim.api29; + +import androidx.annotation.NonNull; + +import com.android.networkstack.apishim.CaptivePortalDataShim; +import com.android.networkstack.apishim.UnsupportedApiLevelException; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Compatibility implementation of {@link CaptivePortalDataShim}. + * + * <p>Use {@link com.android.networkstack.apishim.CaptivePortalDataShimImpl} instead of this + * fallback implementation. + */ +public abstract class CaptivePortalDataShimImpl implements CaptivePortalDataShim { + protected CaptivePortalDataShimImpl() {} + + /** + * Parse a {@link android.net.CaptivePortalData} from JSON. + * + * <p>Use + * {@link com.android.networkstack.apishim.CaptivePortalDataShimImpl#fromJson(JSONObject)} + * instead of this API 29 compatibility version. + */ + @NonNull + public static CaptivePortalDataShim fromJson(JSONObject object) throws JSONException, + UnsupportedApiLevelException { + // Data class not supported in API 29 + throw new UnsupportedApiLevelException("CaptivePortalData not supported on API 29"); + } +} diff --git a/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java new file mode 100644 index 0000000..a500a71 --- /dev/null +++ b/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim.api29; + +import android.net.LinkProperties; +import android.net.NetworkCapabilities; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.networkstack.apishim.NetworkInformationShim; + +/** + * Compatibility implementation of {@link NetworkInformationShim}. + * + * <p>Use {@link com.android.networkstack.apishim.NetworkInformationShimImpl} instead of this + * fallback implementation. + */ +public class NetworkInformationShimImpl implements NetworkInformationShim { + protected NetworkInformationShimImpl() {} + + /** + * Get a new instance of {@link NetworkInformationShim}. + * + * <p>Use com.android.networkstack.apishim.LinkPropertiesShimImpl#newInstance() + * (non-API29 version) instead, to use the correct shims depending on build SDK. + */ + public static NetworkInformationShim newInstance() { + return new NetworkInformationShimImpl(); + } + + @Nullable + @Override + public Uri getCaptivePortalApiUrl(@Nullable LinkProperties lp) { + // Not supported on this API level + return null; + } + + @Override + public void setCaptivePortalApiUrl(@NonNull LinkProperties lp, @Nullable Uri url) { + // Not supported on this API level: no-op + } + + @Nullable + @Override + public String getSSID(@Nullable NetworkCapabilities nc) { + // Not supported on this API level + return null; + } +} diff --git a/apishim/30/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java b/apishim/30/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java new file mode 100644 index 0000000..6d3fb88 --- /dev/null +++ b/apishim/30/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim; + +import android.net.CaptivePortalData; +import android.net.INetworkMonitorCallbacks; +import android.net.Uri; +import android.os.Build; +import android.os.RemoteException; + +import androidx.annotation.NonNull; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Compatibility implementation of {@link CaptivePortalDataShim}. + */ +public class CaptivePortalDataShimImpl + extends com.android.networkstack.apishim.api29.CaptivePortalDataShimImpl { + @NonNull + private final CaptivePortalData mData; + + protected CaptivePortalDataShimImpl(@NonNull CaptivePortalData data) { + mData = data; + } + + /** + * Parse a {@link CaptivePortalDataShim} from a JSON object. + * @throws JSONException The JSON is not a representation of correct captive portal data. + * @throws UnsupportedApiLevelException CaptivePortalData is not available on this API level. + */ + @NonNull + public static CaptivePortalDataShim fromJson(JSONObject obj) throws JSONException, + UnsupportedApiLevelException { + if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) { + return com.android.networkstack.apishim.api29.CaptivePortalDataShimImpl.fromJson(obj); + } + + final long refreshTimeMs = System.currentTimeMillis(); + final long secondsRemaining = getLongOrDefault(obj, "seconds-remaining", -1L); + final long millisRemaining = secondsRemaining <= Long.MAX_VALUE / 1000 + ? secondsRemaining * 1000 + : Long.MAX_VALUE; + final long expiryTimeMs = secondsRemaining == -1L ? -1L : + refreshTimeMs + Math.min(Long.MAX_VALUE - refreshTimeMs, millisRemaining); + return new CaptivePortalDataShimImpl(new CaptivePortalData.Builder() + .setRefreshTime(refreshTimeMs) + // captive is mandatory; throws JSONException if absent + .setCaptive(obj.getBoolean("captive")) + .setUserPortalUrl(getUriOrNull(obj, "user-portal-url")) + .setVenueInfoUrl(getUriOrNull(obj, "venue-info-url")) + .setBytesRemaining(getLongOrDefault(obj, "bytes-remaining", -1L)) + .setExpiryTime(expiryTimeMs) + .build()); + } + + private static long getLongOrDefault(JSONObject o, String key, long def) throws JSONException { + if (!o.has(key)) return def; + return o.getLong(key); + } + + private static Uri getUriOrNull(JSONObject o, String key) throws JSONException { + if (!o.has(key)) return null; + return Uri.parse(o.getString(key)); + } + + @Override + public boolean isCaptive() { + return mData.isCaptive(); + } + + @Override + public Uri getUserPortalUrl() { + return mData.getUserPortalUrl(); + } + + @Override + public void notifyChanged(INetworkMonitorCallbacks cb) throws RemoteException { + cb.notifyCaptivePortalDataChanged(mData); + } +} diff --git a/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java b/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java new file mode 100644 index 0000000..785f5c4 --- /dev/null +++ b/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim; + +import android.net.LinkProperties; +import android.net.NetworkCapabilities; +import android.net.Uri; +import android.os.Build; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +/** + * Compatibility implementation of {@link NetworkInformationShim}. + */ +public class NetworkInformationShimImpl extends + com.android.networkstack.apishim.api29.NetworkInformationShimImpl { + protected NetworkInformationShimImpl() {} + + /** + * Get a new instance of {@link NetworkInformationShim}. + */ + public static NetworkInformationShim newInstance() { + if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) { + return com.android.networkstack.apishim.api29.NetworkInformationShimImpl.newInstance(); + } + return new NetworkInformationShimImpl(); + } + + @Nullable + @Override + public Uri getCaptivePortalApiUrl(@Nullable LinkProperties lp) { + if (lp == null) return null; + return lp.getCaptivePortalApiUrl(); + } + + @Override + public void setCaptivePortalApiUrl(@NonNull LinkProperties lp, @Nullable Uri url) { + lp.setCaptivePortalApiUrl(url); + } + + @Nullable + @Override + public String getSSID(@Nullable NetworkCapabilities nc) { + if (nc == null) return null; + return nc.getSSID(); + } +} diff --git a/apishim/common/com/android/networkstack/apishim/CaptivePortalDataShim.java b/apishim/common/com/android/networkstack/apishim/CaptivePortalDataShim.java new file mode 100644 index 0000000..e460155 --- /dev/null +++ b/apishim/common/com/android/networkstack/apishim/CaptivePortalDataShim.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim; + +import android.net.INetworkMonitorCallbacks; +import android.net.Uri; +import android.os.RemoteException; + +/** + * Compatibility interface for {@link android.net.CaptivePortalData}. + */ +public interface CaptivePortalDataShim { + /** + * @see android.net.CaptivePortalData#isCaptive() + */ + boolean isCaptive(); + + /** + * @see android.net.CaptivePortalData#getUserPortalUrl() + */ + Uri getUserPortalUrl(); + + /** + * @see INetworkMonitorCallbacks#notifyCaptivePortalDataChanged(android.net.CaptivePortalData) + */ + void notifyChanged(INetworkMonitorCallbacks cb) throws RemoteException; +} diff --git a/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java b/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java new file mode 100644 index 0000000..9018888 --- /dev/null +++ b/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2019 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 com.android.networkstack.apishim; + +import android.net.LinkProperties; +import android.net.NetworkCapabilities; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +/** + * Compatibility interface for network info classes such as {@link LinkProperties} and + * {@link NetworkCapabilities}. + */ +public interface NetworkInformationShim { + /** + * @see LinkProperties#getCaptivePortalApiUrl() + */ + @Nullable + Uri getCaptivePortalApiUrl(@Nullable LinkProperties lp); + + /** + * @see LinkProperties#setCaptivePortalApiUrl(Uri) + */ + void setCaptivePortalApiUrl(@NonNull LinkProperties lp, @Nullable Uri url); + + /** + * @see NetworkCapabilities#getSSID() + */ + @Nullable + String getSSID(@Nullable NetworkCapabilities nc); +} diff --git a/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl b/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl index e2901dd..f57a8f7 100644 --- a/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl +++ b/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl @@ -16,6 +16,7 @@ package android.net; +import android.net.CaptivePortalData; import android.net.INetworkMonitor; import android.net.PrivateDnsConfigParcel; @@ -33,4 +34,5 @@ oneway interface INetworkMonitorCallbacks { long timestampMillis, in PersistableBundle extras); void notifyDataStallSuspected(long timestampMillis, int detectionMethod, in PersistableBundle extras); + void notifyCaptivePortalDataChanged(in CaptivePortalData data); }
\ No newline at end of file |