Make DataStallReport Parcelable.

DataStallReport is defined inside ConnectivityDiagnosticsManager. In
order for DataStallReport to be used in aidls, it must implement the
Parcelable interface.

Bug: 143187964
Test: compiles
Test: atest FrameworksNetTests
Change-Id: Idbb4885e2f67fb3f85d406a622ae45d34492dca4
This commit is contained in:
Cody Kesting
2019-12-17 09:28:06 -08:00
parent beb41b5457
commit 3d97b5e635
2 changed files with 147 additions and 19 deletions

View File

@@ -53,16 +53,6 @@ import java.util.concurrent.Executor;
* </ul> * </ul>
*/ */
public class ConnectivityDiagnosticsManager { public class ConnectivityDiagnosticsManager {
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 {}
/** @hide */ /** @hide */
public ConnectivityDiagnosticsManager() {} public ConnectivityDiagnosticsManager() {}
@@ -237,21 +227,31 @@ public class ConnectivityDiagnosticsManager {
} }
/** Class that includes information for a suspected data stall on a specific Network */ /** 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 */ /** 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 * The timestamp for the report. The timestamp is taken from {@link
* System#currentTimeMillis}. * System#currentTimeMillis}.
*/ */
public final long reportTimestamp; private long mReportTimestamp;
/** The detection method used to identify the suspected data stall */ /** 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 */ /** PersistableBundle that may contain additional information on the suspected data stall */
@NonNull public final PersistableBundle stallDetails; @NonNull private final PersistableBundle mStallDetails;
/** /**
* Constructor for DataStallReport. * Constructor for DataStallReport.
@@ -270,11 +270,101 @@ public class ConnectivityDiagnosticsManager {
long reportTimestamp, long reportTimestamp,
@DetectionMethod int detectionMethod, @DetectionMethod int detectionMethod,
@NonNull PersistableBundle stallDetails) { @NonNull PersistableBundle stallDetails) {
this.network = network; mNetwork = network;
this.reportTimestamp = reportTimestamp; mReportTimestamp = reportTimestamp;
this.detectionMethod = detectionMethod; mDetectionMethod = detectionMethod;
this.stallDetails = stallDetails; 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];
}
};
} }
/** /**

View File

@@ -17,6 +17,7 @@
package android.net; package android.net;
import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport; import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport;
import static android.net.ConnectivityDiagnosticsManager.DataStallReport;
import static com.android.testutils.ParcelUtilsKt.assertParcelSane; import static com.android.testutils.ParcelUtilsKt.assertParcelSane;
@@ -34,6 +35,7 @@ import org.junit.runners.JUnit4;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class ConnectivityDiagnosticsManagerTest { public class ConnectivityDiagnosticsManagerTest {
private static final int NET_ID = 1; private static final int NET_ID = 1;
private static final int DETECTION_METHOD = 2;
private static final long TIMESTAMP = 10L; private static final long TIMESTAMP = 10L;
private static final String INTERFACE_NAME = "interface"; private static final String INTERFACE_NAME = "interface";
private static final String BUNDLE_KEY = "key"; private static final String BUNDLE_KEY = "key";
@@ -155,4 +157,40 @@ public class ConnectivityDiagnosticsManagerTest {
public void testConnectivityReportParcelUnparcel() { public void testConnectivityReportParcelUnparcel() {
assertParcelSane(createSampleConnectivityReport(), 5); assertParcelSane(createSampleConnectivityReport(), 5);
} }
private DataStallReport createSampleDataStallReport() {
final PersistableBundle bundle = new PersistableBundle();
bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
return new DataStallReport(new Network(NET_ID), TIMESTAMP, DETECTION_METHOD, bundle);
}
private DataStallReport createDefaultDataStallReport() {
return new DataStallReport(new Network(0), 0L, 0, PersistableBundle.EMPTY);
}
@Test
public void testDataStallReportEquals() {
assertEquals(createSampleDataStallReport(), createSampleDataStallReport());
assertEquals(createDefaultDataStallReport(), createDefaultDataStallReport());
final PersistableBundle bundle = new PersistableBundle();
bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
assertNotEquals(
createDefaultDataStallReport(),
new DataStallReport(new Network(NET_ID), 0L, 0, PersistableBundle.EMPTY));
assertNotEquals(
createDefaultDataStallReport(),
new DataStallReport(new Network(0), TIMESTAMP, 0, PersistableBundle.EMPTY));
assertNotEquals(
createDefaultDataStallReport(),
new DataStallReport(new Network(0), 0L, DETECTION_METHOD, PersistableBundle.EMPTY));
assertNotEquals(
createDefaultDataStallReport(), new DataStallReport(new Network(0), 0L, 0, bundle));
}
@Test
public void testDataStallReportParcelUnparcel() {
assertParcelSane(createSampleDataStallReport(), 4);
}
} }