Loading api/current.txt +20 −13 Original line number Diff line number Diff line Loading @@ -9824,6 +9824,7 @@ package android.content { field public static final String CARRIER_CONFIG_SERVICE = "carrier_config"; field public static final String CLIPBOARD_SERVICE = "clipboard"; field public static final String COMPANION_DEVICE_SERVICE = "companiondevice"; field public static final String CONNECTIVITY_DIAGNOSTICS_SERVICE = "connectivity_diagnostics"; field public static final String CONNECTIVITY_SERVICE = "connectivity"; field public static final String CONSUMER_IR_SERVICE = "consumer_ir"; field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2 Loading Loading @@ -28691,8 +28692,6 @@ package android.net { public class ConnectivityDiagnosticsManager { method public void registerConnectivityDiagnosticsCallback(@NonNull android.net.NetworkRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback); method public void unregisterConnectivityDiagnosticsCallback(@NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback); field public static final int DETECTION_METHOD_DNS_EVENTS = 1; // 0x1 field public static final int DETECTION_METHOD_TCP_METRICS = 2; // 0x2 } public abstract static class ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback { Loading @@ -28702,21 +28701,29 @@ package android.net { method public void onNetworkConnectivityReported(@NonNull android.net.Network, boolean); } public static class ConnectivityDiagnosticsManager.ConnectivityReport { public static final class ConnectivityDiagnosticsManager.ConnectivityReport implements android.os.Parcelable { ctor public ConnectivityDiagnosticsManager.ConnectivityReport(@NonNull android.net.Network, long, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkCapabilities, @NonNull android.os.PersistableBundle); field @NonNull public final android.os.PersistableBundle additionalInfo; field @NonNull public final android.net.LinkProperties linkProperties; field @NonNull public final android.net.Network network; field @NonNull public final android.net.NetworkCapabilities networkCapabilities; field public final long reportTimestamp; method public int describeContents(); method @NonNull public android.os.PersistableBundle getAdditionalInfo(); method @NonNull public android.net.LinkProperties getLinkProperties(); method @NonNull public android.net.Network getNetwork(); method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities(); method public long getReportTimestamp(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.ConnectivityReport> CREATOR; } public static class ConnectivityDiagnosticsManager.DataStallReport { public static final class ConnectivityDiagnosticsManager.DataStallReport implements android.os.Parcelable { ctor public ConnectivityDiagnosticsManager.DataStallReport(@NonNull android.net.Network, long, int, @NonNull android.os.PersistableBundle); field public final int detectionMethod; field @NonNull public final android.net.Network network; field public final long reportTimestamp; field @NonNull public final android.os.PersistableBundle stallDetails; method public int describeContents(); method public int getDetectionMethod(); method @NonNull public android.net.Network getNetwork(); method public long getReportTimestamp(); method @NonNull public android.os.PersistableBundle getStallDetails(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.DataStallReport> CREATOR; field public static final int DETECTION_METHOD_DNS_EVENTS = 1; // 0x1 field public static final int DETECTION_METHOD_TCP_METRICS = 2; // 0x2 } public class ConnectivityManager { core/java/android/app/SystemServiceRegistry.java +13 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ import android.media.session.MediaSessionManager; import android.media.soundtrigger.SoundTriggerManager; import android.media.tv.ITvInputManager; import android.media.tv.TvInputManager; import android.net.ConnectivityDiagnosticsManager; import android.net.ConnectivityManager; import android.net.ConnectivityThread; import android.net.EthernetManager; Loading Loading @@ -369,6 +370,18 @@ final class SystemServiceRegistry { return new IpSecManager(ctx, service); }}); registerService(Context.CONNECTIVITY_DIAGNOSTICS_SERVICE, ConnectivityDiagnosticsManager.class, new CachedServiceFetcher<ConnectivityDiagnosticsManager>() { @Override public ConnectivityDiagnosticsManager createService(ContextImpl ctx) throws ServiceNotFoundException { // ConnectivityDiagnosticsManager is backed by ConnectivityService IBinder b = ServiceManager.getServiceOrThrow(Context.CONNECTIVITY_SERVICE); IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); return new ConnectivityDiagnosticsManager(ctx, service); }}); registerService( Context.TEST_NETWORK_SERVICE, TestNetworkManager.class, Loading core/java/android/content/Context.java +10 −0 Original line number Diff line number Diff line Loading @@ -3879,6 +3879,16 @@ public abstract class Context { */ public static final String IPSEC_SERVICE = "ipsec"; /** * Use with {@link #getSystemService(String)} to retrieve a {@link * android.net.ConnectivityDiagnosticsManager} for performing network connectivity diagnostics * as well as receiving network connectivity information from the system. * * @see #getSystemService(String) * @see android.net.ConnectivityDiagnosticsManager */ public static final String CONNECTIVITY_DIAGNOSTICS_SERVICE = "connectivity_diagnostics"; /** * Use with {@link #getSystemService(String)} to retrieve a {@link * android.net.TestNetworkManager} for building TUNs and limited-use Networks Loading core/java/android/net/ConnectivityDiagnosticsManager.aidl 0 → 100644 +21 −0 Original line number Diff line number Diff line /** * * 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; parcelable ConnectivityDiagnosticsManager.ConnectivityReport; parcelable ConnectivityDiagnosticsManager.DataStallReport; No newline at end of file core/java/android/net/ConnectivityDiagnosticsManager.java +253 −28 Original line number Diff line number Diff line Loading @@ -18,10 +18,18 @@ package android.net; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; import java.util.concurrent.Executor; /** Loading @@ -47,38 +55,47 @@ import java.util.concurrent.Executor; * </ul> */ public class ConnectivityDiagnosticsManager { public static final int DETECTION_METHOD_DNS_EVENTS = 1; public static final int DETECTION_METHOD_TCP_METRICS = 2; private final Context mContext; private final IConnectivityManager mService; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"DETECTION_METHOD_"}, value = {DETECTION_METHOD_DNS_EVENTS, DETECTION_METHOD_TCP_METRICS}) public @interface DetectionMethod {} public ConnectivityDiagnosticsManager(Context context, IConnectivityManager service) { mContext = Preconditions.checkNotNull(context, "missing context"); mService = Preconditions.checkNotNull(service, "missing IConnectivityManager"); } /** @hide */ public ConnectivityDiagnosticsManager() {} @VisibleForTesting public static boolean persistableBundleEquals( @Nullable PersistableBundle a, @Nullable PersistableBundle b) { if (a == b) return true; if (a == null || b == null) return false; if (!Objects.equals(a.keySet(), b.keySet())) return false; for (String key : a.keySet()) { if (!Objects.equals(a.get(key), b.get(key))) return false; } return true; } /** Class that includes connectivity information for a specific Network at a specific time. */ public static class ConnectivityReport { public static final class ConnectivityReport implements Parcelable { /** The Network for which this ConnectivityReport applied */ @NonNull public final Network network; @NonNull private final Network mNetwork; /** * The timestamp for the report. The timestamp is taken from {@link * System#currentTimeMillis}. */ public final long reportTimestamp; private final long mReportTimestamp; /** LinkProperties available on the Network at the reported timestamp */ @NonNull public final LinkProperties linkProperties; @NonNull private final LinkProperties mLinkProperties; /** NetworkCapabilities available on the Network at the reported timestamp */ @NonNull public final NetworkCapabilities networkCapabilities; @NonNull private final NetworkCapabilities mNetworkCapabilities; /** PersistableBundle that may contain additional info about the report */ @NonNull public final PersistableBundle additionalInfo; @NonNull private final PersistableBundle mAdditionalInfo; /** * Constructor for ConnectivityReport. Loading @@ -101,30 +118,148 @@ public class ConnectivityDiagnosticsManager { @NonNull LinkProperties linkProperties, @NonNull NetworkCapabilities networkCapabilities, @NonNull PersistableBundle additionalInfo) { this.network = network; this.reportTimestamp = reportTimestamp; this.linkProperties = linkProperties; this.networkCapabilities = networkCapabilities; this.additionalInfo = additionalInfo; mNetwork = network; mReportTimestamp = reportTimestamp; mLinkProperties = linkProperties; mNetworkCapabilities = networkCapabilities; mAdditionalInfo = additionalInfo; } /** * Returns the Network for this ConnectivityReport. * * @return The Network for which this ConnectivityReport applied */ @NonNull public Network getNetwork() { return mNetwork; } /** * Returns the epoch timestamp (milliseconds) for when this report was taken. * * @return The timestamp for the report. Taken from {@link System#currentTimeMillis}. */ public long getReportTimestamp() { return mReportTimestamp; } /** * Returns the LinkProperties available when this report was taken. * * @return LinkProperties available on the Network at the reported timestamp */ @NonNull public LinkProperties getLinkProperties() { return new LinkProperties(mLinkProperties); } /** * Returns the NetworkCapabilities when this report was taken. * * @return NetworkCapabilities available on the Network at the reported timestamp */ @NonNull public NetworkCapabilities getNetworkCapabilities() { return new NetworkCapabilities(mNetworkCapabilities); } /** * Returns a PersistableBundle with additional info for this report. * * @return PersistableBundle that may contain additional info about the report */ @NonNull public PersistableBundle getAdditionalInfo() { return new PersistableBundle(mAdditionalInfo); } @Override public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof ConnectivityReport)) return false; final ConnectivityReport that = (ConnectivityReport) o; // PersistableBundle is optimized to avoid unparcelling data unless fields are // referenced. Because of this, use {@link ConnectivityDiagnosticsManager#equals} over // {@link PersistableBundle#kindofEquals}. return mReportTimestamp == that.mReportTimestamp && mNetwork.equals(that.mNetwork) && mLinkProperties.equals(that.mLinkProperties) && mNetworkCapabilities.equals(that.mNetworkCapabilities) && persistableBundleEquals(mAdditionalInfo, that.mAdditionalInfo); } @Override public int hashCode() { return Objects.hash( mNetwork, mReportTimestamp, mLinkProperties, mNetworkCapabilities, mAdditionalInfo); } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeParcelable(mNetwork, flags); dest.writeLong(mReportTimestamp); dest.writeParcelable(mLinkProperties, flags); dest.writeParcelable(mNetworkCapabilities, flags); dest.writeParcelable(mAdditionalInfo, flags); } /** Implement the Parcelable interface */ public static final @NonNull Creator<ConnectivityReport> CREATOR = new Creator<>() { public ConnectivityReport createFromParcel(Parcel in) { return new ConnectivityReport( in.readParcelable(null), in.readLong(), in.readParcelable(null), in.readParcelable(null), in.readParcelable(null)); } public ConnectivityReport[] newArray(int size) { return new ConnectivityReport[size]; } }; } /** Class that includes information for a suspected data stall on a specific Network */ public static class DataStallReport { public static final class DataStallReport implements Parcelable { public static final int DETECTION_METHOD_DNS_EVENTS = 1; public static final int DETECTION_METHOD_TCP_METRICS = 2; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"DETECTION_METHOD_"}, value = {DETECTION_METHOD_DNS_EVENTS, DETECTION_METHOD_TCP_METRICS}) public @interface DetectionMethod {} /** The Network for which this DataStallReport applied */ @NonNull public final Network network; @NonNull private final Network mNetwork; /** * The timestamp for the report. The timestamp is taken from {@link * System#currentTimeMillis}. */ public final long reportTimestamp; private long mReportTimestamp; /** The detection method used to identify the suspected data stall */ @DetectionMethod public final int detectionMethod; @DetectionMethod private final int mDetectionMethod; /** PersistableBundle that may contain additional information on the suspected data stall */ @NonNull public final PersistableBundle stallDetails; @NonNull private final PersistableBundle mStallDetails; /** * Constructor for DataStallReport. Loading @@ -143,11 +278,101 @@ public class ConnectivityDiagnosticsManager { long reportTimestamp, @DetectionMethod int detectionMethod, @NonNull PersistableBundle stallDetails) { this.network = network; this.reportTimestamp = reportTimestamp; this.detectionMethod = detectionMethod; this.stallDetails = stallDetails; mNetwork = network; mReportTimestamp = reportTimestamp; mDetectionMethod = detectionMethod; mStallDetails = stallDetails; } /** * Returns the Network for this DataStallReport. * * @return The Network for which this DataStallReport applied */ @NonNull public Network getNetwork() { return mNetwork; } /** * Returns the epoch timestamp (milliseconds) for when this report was taken. * * @return The timestamp for the report. Taken from {@link System#currentTimeMillis}. */ public long getReportTimestamp() { return mReportTimestamp; } /** * Returns the detection method used to identify this suspected data stall. * * @return The detection method used to identify the suspected data stall */ public int getDetectionMethod() { return mDetectionMethod; } /** * Returns a PersistableBundle with additional info for this report. * * @return PersistableBundle that may contain additional information on the suspected data * stall */ @NonNull public PersistableBundle getStallDetails() { return new PersistableBundle(mStallDetails); } @Override public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof DataStallReport)) return false; final DataStallReport that = (DataStallReport) o; // PersistableBundle is optimized to avoid unparcelling data unless fields are // referenced. Because of this, use {@link ConnectivityDiagnosticsManager#equals} over // {@link PersistableBundle#kindofEquals}. return mReportTimestamp == that.mReportTimestamp && mDetectionMethod == that.mDetectionMethod && mNetwork.equals(that.mNetwork) && persistableBundleEquals(mStallDetails, that.mStallDetails); } @Override public int hashCode() { return Objects.hash(mNetwork, mReportTimestamp, mDetectionMethod, mStallDetails); } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeParcelable(mNetwork, flags); dest.writeLong(mReportTimestamp); dest.writeInt(mDetectionMethod); dest.writeParcelable(mStallDetails, flags); } /** Implement the Parcelable interface */ public static final @NonNull Creator<DataStallReport> CREATOR = new Creator<DataStallReport>() { public DataStallReport createFromParcel(Parcel in) { return new DataStallReport( in.readParcelable(null), in.readLong(), in.readInt(), in.readParcelable(null)); } public DataStallReport[] newArray(int size) { return new DataStallReport[size]; } }; } /** Loading Loading
api/current.txt +20 −13 Original line number Diff line number Diff line Loading @@ -9824,6 +9824,7 @@ package android.content { field public static final String CARRIER_CONFIG_SERVICE = "carrier_config"; field public static final String CLIPBOARD_SERVICE = "clipboard"; field public static final String COMPANION_DEVICE_SERVICE = "companiondevice"; field public static final String CONNECTIVITY_DIAGNOSTICS_SERVICE = "connectivity_diagnostics"; field public static final String CONNECTIVITY_SERVICE = "connectivity"; field public static final String CONSUMER_IR_SERVICE = "consumer_ir"; field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2 Loading Loading @@ -28691,8 +28692,6 @@ package android.net { public class ConnectivityDiagnosticsManager { method public void registerConnectivityDiagnosticsCallback(@NonNull android.net.NetworkRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback); method public void unregisterConnectivityDiagnosticsCallback(@NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback); field public static final int DETECTION_METHOD_DNS_EVENTS = 1; // 0x1 field public static final int DETECTION_METHOD_TCP_METRICS = 2; // 0x2 } public abstract static class ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback { Loading @@ -28702,21 +28701,29 @@ package android.net { method public void onNetworkConnectivityReported(@NonNull android.net.Network, boolean); } public static class ConnectivityDiagnosticsManager.ConnectivityReport { public static final class ConnectivityDiagnosticsManager.ConnectivityReport implements android.os.Parcelable { ctor public ConnectivityDiagnosticsManager.ConnectivityReport(@NonNull android.net.Network, long, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkCapabilities, @NonNull android.os.PersistableBundle); field @NonNull public final android.os.PersistableBundle additionalInfo; field @NonNull public final android.net.LinkProperties linkProperties; field @NonNull public final android.net.Network network; field @NonNull public final android.net.NetworkCapabilities networkCapabilities; field public final long reportTimestamp; method public int describeContents(); method @NonNull public android.os.PersistableBundle getAdditionalInfo(); method @NonNull public android.net.LinkProperties getLinkProperties(); method @NonNull public android.net.Network getNetwork(); method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities(); method public long getReportTimestamp(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.ConnectivityReport> CREATOR; } public static class ConnectivityDiagnosticsManager.DataStallReport { public static final class ConnectivityDiagnosticsManager.DataStallReport implements android.os.Parcelable { ctor public ConnectivityDiagnosticsManager.DataStallReport(@NonNull android.net.Network, long, int, @NonNull android.os.PersistableBundle); field public final int detectionMethod; field @NonNull public final android.net.Network network; field public final long reportTimestamp; field @NonNull public final android.os.PersistableBundle stallDetails; method public int describeContents(); method public int getDetectionMethod(); method @NonNull public android.net.Network getNetwork(); method public long getReportTimestamp(); method @NonNull public android.os.PersistableBundle getStallDetails(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.DataStallReport> CREATOR; field public static final int DETECTION_METHOD_DNS_EVENTS = 1; // 0x1 field public static final int DETECTION_METHOD_TCP_METRICS = 2; // 0x2 } public class ConnectivityManager {
core/java/android/app/SystemServiceRegistry.java +13 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ import android.media.session.MediaSessionManager; import android.media.soundtrigger.SoundTriggerManager; import android.media.tv.ITvInputManager; import android.media.tv.TvInputManager; import android.net.ConnectivityDiagnosticsManager; import android.net.ConnectivityManager; import android.net.ConnectivityThread; import android.net.EthernetManager; Loading Loading @@ -369,6 +370,18 @@ final class SystemServiceRegistry { return new IpSecManager(ctx, service); }}); registerService(Context.CONNECTIVITY_DIAGNOSTICS_SERVICE, ConnectivityDiagnosticsManager.class, new CachedServiceFetcher<ConnectivityDiagnosticsManager>() { @Override public ConnectivityDiagnosticsManager createService(ContextImpl ctx) throws ServiceNotFoundException { // ConnectivityDiagnosticsManager is backed by ConnectivityService IBinder b = ServiceManager.getServiceOrThrow(Context.CONNECTIVITY_SERVICE); IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); return new ConnectivityDiagnosticsManager(ctx, service); }}); registerService( Context.TEST_NETWORK_SERVICE, TestNetworkManager.class, Loading
core/java/android/content/Context.java +10 −0 Original line number Diff line number Diff line Loading @@ -3879,6 +3879,16 @@ public abstract class Context { */ public static final String IPSEC_SERVICE = "ipsec"; /** * Use with {@link #getSystemService(String)} to retrieve a {@link * android.net.ConnectivityDiagnosticsManager} for performing network connectivity diagnostics * as well as receiving network connectivity information from the system. * * @see #getSystemService(String) * @see android.net.ConnectivityDiagnosticsManager */ public static final String CONNECTIVITY_DIAGNOSTICS_SERVICE = "connectivity_diagnostics"; /** * Use with {@link #getSystemService(String)} to retrieve a {@link * android.net.TestNetworkManager} for building TUNs and limited-use Networks Loading
core/java/android/net/ConnectivityDiagnosticsManager.aidl 0 → 100644 +21 −0 Original line number Diff line number Diff line /** * * 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; parcelable ConnectivityDiagnosticsManager.ConnectivityReport; parcelable ConnectivityDiagnosticsManager.DataStallReport; No newline at end of file
core/java/android/net/ConnectivityDiagnosticsManager.java +253 −28 Original line number Diff line number Diff line Loading @@ -18,10 +18,18 @@ package android.net; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; import java.util.concurrent.Executor; /** Loading @@ -47,38 +55,47 @@ import java.util.concurrent.Executor; * </ul> */ public class ConnectivityDiagnosticsManager { public static final int DETECTION_METHOD_DNS_EVENTS = 1; public static final int DETECTION_METHOD_TCP_METRICS = 2; private final Context mContext; private final IConnectivityManager mService; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"DETECTION_METHOD_"}, value = {DETECTION_METHOD_DNS_EVENTS, DETECTION_METHOD_TCP_METRICS}) public @interface DetectionMethod {} public ConnectivityDiagnosticsManager(Context context, IConnectivityManager service) { mContext = Preconditions.checkNotNull(context, "missing context"); mService = Preconditions.checkNotNull(service, "missing IConnectivityManager"); } /** @hide */ public ConnectivityDiagnosticsManager() {} @VisibleForTesting public static boolean persistableBundleEquals( @Nullable PersistableBundle a, @Nullable PersistableBundle b) { if (a == b) return true; if (a == null || b == null) return false; if (!Objects.equals(a.keySet(), b.keySet())) return false; for (String key : a.keySet()) { if (!Objects.equals(a.get(key), b.get(key))) return false; } return true; } /** Class that includes connectivity information for a specific Network at a specific time. */ public static class ConnectivityReport { public static final class ConnectivityReport implements Parcelable { /** The Network for which this ConnectivityReport applied */ @NonNull public final Network network; @NonNull private final Network mNetwork; /** * The timestamp for the report. The timestamp is taken from {@link * System#currentTimeMillis}. */ public final long reportTimestamp; private final long mReportTimestamp; /** LinkProperties available on the Network at the reported timestamp */ @NonNull public final LinkProperties linkProperties; @NonNull private final LinkProperties mLinkProperties; /** NetworkCapabilities available on the Network at the reported timestamp */ @NonNull public final NetworkCapabilities networkCapabilities; @NonNull private final NetworkCapabilities mNetworkCapabilities; /** PersistableBundle that may contain additional info about the report */ @NonNull public final PersistableBundle additionalInfo; @NonNull private final PersistableBundle mAdditionalInfo; /** * Constructor for ConnectivityReport. Loading @@ -101,30 +118,148 @@ public class ConnectivityDiagnosticsManager { @NonNull LinkProperties linkProperties, @NonNull NetworkCapabilities networkCapabilities, @NonNull PersistableBundle additionalInfo) { this.network = network; this.reportTimestamp = reportTimestamp; this.linkProperties = linkProperties; this.networkCapabilities = networkCapabilities; this.additionalInfo = additionalInfo; mNetwork = network; mReportTimestamp = reportTimestamp; mLinkProperties = linkProperties; mNetworkCapabilities = networkCapabilities; mAdditionalInfo = additionalInfo; } /** * Returns the Network for this ConnectivityReport. * * @return The Network for which this ConnectivityReport applied */ @NonNull public Network getNetwork() { return mNetwork; } /** * Returns the epoch timestamp (milliseconds) for when this report was taken. * * @return The timestamp for the report. Taken from {@link System#currentTimeMillis}. */ public long getReportTimestamp() { return mReportTimestamp; } /** * Returns the LinkProperties available when this report was taken. * * @return LinkProperties available on the Network at the reported timestamp */ @NonNull public LinkProperties getLinkProperties() { return new LinkProperties(mLinkProperties); } /** * Returns the NetworkCapabilities when this report was taken. * * @return NetworkCapabilities available on the Network at the reported timestamp */ @NonNull public NetworkCapabilities getNetworkCapabilities() { return new NetworkCapabilities(mNetworkCapabilities); } /** * Returns a PersistableBundle with additional info for this report. * * @return PersistableBundle that may contain additional info about the report */ @NonNull public PersistableBundle getAdditionalInfo() { return new PersistableBundle(mAdditionalInfo); } @Override public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof ConnectivityReport)) return false; final ConnectivityReport that = (ConnectivityReport) o; // PersistableBundle is optimized to avoid unparcelling data unless fields are // referenced. Because of this, use {@link ConnectivityDiagnosticsManager#equals} over // {@link PersistableBundle#kindofEquals}. return mReportTimestamp == that.mReportTimestamp && mNetwork.equals(that.mNetwork) && mLinkProperties.equals(that.mLinkProperties) && mNetworkCapabilities.equals(that.mNetworkCapabilities) && persistableBundleEquals(mAdditionalInfo, that.mAdditionalInfo); } @Override public int hashCode() { return Objects.hash( mNetwork, mReportTimestamp, mLinkProperties, mNetworkCapabilities, mAdditionalInfo); } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeParcelable(mNetwork, flags); dest.writeLong(mReportTimestamp); dest.writeParcelable(mLinkProperties, flags); dest.writeParcelable(mNetworkCapabilities, flags); dest.writeParcelable(mAdditionalInfo, flags); } /** Implement the Parcelable interface */ public static final @NonNull Creator<ConnectivityReport> CREATOR = new Creator<>() { public ConnectivityReport createFromParcel(Parcel in) { return new ConnectivityReport( in.readParcelable(null), in.readLong(), in.readParcelable(null), in.readParcelable(null), in.readParcelable(null)); } public ConnectivityReport[] newArray(int size) { return new ConnectivityReport[size]; } }; } /** Class that includes information for a suspected data stall on a specific Network */ public static class DataStallReport { public static final class DataStallReport implements Parcelable { public static final int DETECTION_METHOD_DNS_EVENTS = 1; public static final int DETECTION_METHOD_TCP_METRICS = 2; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"DETECTION_METHOD_"}, value = {DETECTION_METHOD_DNS_EVENTS, DETECTION_METHOD_TCP_METRICS}) public @interface DetectionMethod {} /** The Network for which this DataStallReport applied */ @NonNull public final Network network; @NonNull private final Network mNetwork; /** * The timestamp for the report. The timestamp is taken from {@link * System#currentTimeMillis}. */ public final long reportTimestamp; private long mReportTimestamp; /** The detection method used to identify the suspected data stall */ @DetectionMethod public final int detectionMethod; @DetectionMethod private final int mDetectionMethod; /** PersistableBundle that may contain additional information on the suspected data stall */ @NonNull public final PersistableBundle stallDetails; @NonNull private final PersistableBundle mStallDetails; /** * Constructor for DataStallReport. Loading @@ -143,11 +278,101 @@ public class ConnectivityDiagnosticsManager { long reportTimestamp, @DetectionMethod int detectionMethod, @NonNull PersistableBundle stallDetails) { this.network = network; this.reportTimestamp = reportTimestamp; this.detectionMethod = detectionMethod; this.stallDetails = stallDetails; mNetwork = network; mReportTimestamp = reportTimestamp; mDetectionMethod = detectionMethod; mStallDetails = stallDetails; } /** * Returns the Network for this DataStallReport. * * @return The Network for which this DataStallReport applied */ @NonNull public Network getNetwork() { return mNetwork; } /** * Returns the epoch timestamp (milliseconds) for when this report was taken. * * @return The timestamp for the report. Taken from {@link System#currentTimeMillis}. */ public long getReportTimestamp() { return mReportTimestamp; } /** * Returns the detection method used to identify this suspected data stall. * * @return The detection method used to identify the suspected data stall */ public int getDetectionMethod() { return mDetectionMethod; } /** * Returns a PersistableBundle with additional info for this report. * * @return PersistableBundle that may contain additional information on the suspected data * stall */ @NonNull public PersistableBundle getStallDetails() { return new PersistableBundle(mStallDetails); } @Override public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof DataStallReport)) return false; final DataStallReport that = (DataStallReport) o; // PersistableBundle is optimized to avoid unparcelling data unless fields are // referenced. Because of this, use {@link ConnectivityDiagnosticsManager#equals} over // {@link PersistableBundle#kindofEquals}. return mReportTimestamp == that.mReportTimestamp && mDetectionMethod == that.mDetectionMethod && mNetwork.equals(that.mNetwork) && persistableBundleEquals(mStallDetails, that.mStallDetails); } @Override public int hashCode() { return Objects.hash(mNetwork, mReportTimestamp, mDetectionMethod, mStallDetails); } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeParcelable(mNetwork, flags); dest.writeLong(mReportTimestamp); dest.writeInt(mDetectionMethod); dest.writeParcelable(mStallDetails, flags); } /** Implement the Parcelable interface */ public static final @NonNull Creator<DataStallReport> CREATOR = new Creator<DataStallReport>() { public DataStallReport createFromParcel(Parcel in) { return new DataStallReport( in.readParcelable(null), in.readLong(), in.readInt(), in.readParcelable(null)); } public DataStallReport[] newArray(int size) { return new DataStallReport[size]; } }; } /** Loading