Added network objects to ConnectionStatus classes.

Fixed parceling issues across all classes.

Bug: 268748251
API-Coverage-Bug: 265968015
Test: atest TetherNetworkConnectionStatusTest KnownNetworkConnectionStatusTest
Change-Id: I1a5f33d638137d6131261b30f24d71ef5720690d
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index b804149..2d7be50 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -9999,6 +9999,7 @@
   public final class KnownNetworkConnectionStatus implements android.os.Parcelable {
     method public int describeContents();
     method @NonNull public android.os.Bundle getExtras();
+    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork getKnownNetwork();
     method public int getStatus();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int CONNECTION_STATUS_SAVED = 1; // 0x1
@@ -10011,6 +10012,7 @@
     ctor public KnownNetworkConnectionStatus.Builder();
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus build();
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setExtras(@NonNull android.os.Bundle);
+    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setStatus(int);
   }
 
@@ -10079,6 +10081,7 @@
     method public int describeContents();
     method @NonNull public android.os.Bundle getExtras();
     method public int getStatus();
+    method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetwork getTetherNetwork();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED = 9; // 0x9
     field public static final int CONNECTION_STATUS_ENABLING_HOTSPOT = 1; // 0x1
@@ -10098,6 +10101,7 @@
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus build();
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setExtras(@NonNull android.os.Bundle);
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setStatus(int);
+    method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
   }
 
 }
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
index 9aad9aa..52abf33 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
@@ -270,12 +270,22 @@
         return 0;
     }
 
+    /**
+     * Creates a {@link DeviceInfo} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static DeviceInfo readFromParcel(@NonNull Parcel in) {
+        return new DeviceInfo(in.readInt(), in.readString(), in.readString(), in.readInt(),
+                in.readInt());
+    }
+
     @NonNull
     public static final Creator<DeviceInfo> CREATOR = new Creator<DeviceInfo>() {
         @Override
         public DeviceInfo createFromParcel(Parcel in) {
-            return new DeviceInfo(in.readInt(), in.readString(), in.readString(), in.readInt(),
-                    in.readInt());
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
index b219e86..161c83c 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
@@ -228,15 +228,25 @@
         dest.writeInt(mNetworkSource);
         dest.writeString(mSsid);
         dest.writeIntArray(mSecurityTypes);
-        dest.writeTypedObject(mDeviceInfo, 0);
+        mDeviceInfo.writeToParcel(dest, flags);
+    }
+
+    /**
+     * Creates a {@link KnownNetwork} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static KnownNetwork readFromParcel(@NonNull Parcel in) {
+        return new KnownNetwork(in.readInt(), in.readString(), in.createIntArray(),
+                DeviceInfo.readFromParcel(in));
     }
 
     @NonNull
     public static final Creator<KnownNetwork> CREATOR = new Creator<>() {
         @Override
         public KnownNetwork createFromParcel(Parcel in) {
-            return new KnownNetwork(in.readInt(), in.readString(), in.createIntArray(),
-                    in.readTypedObject(DeviceInfo.CREATOR));
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
index 2cefb8e..b2f04ff 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
@@ -63,6 +63,7 @@
     public @interface ConnectionStatus {}
 
     @ConnectionStatus private final int mStatus;
+    private final KnownNetwork mKnownNetwork;
     private final Bundle mExtras;
 
     /**
@@ -70,6 +71,7 @@
      */
     public static final class Builder {
         @ConnectionStatus private int mStatus;
+        private KnownNetwork mKnownNetwork;
         private Bundle mExtras;
 
         public Builder() {}
@@ -86,6 +88,17 @@
         }
 
         /**
+         * Sets the {@link KnownNetwork} object of the connection.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setKnownNetwork(@NonNull KnownNetwork knownNetwork) {
+            mKnownNetwork = knownNetwork;
+            return this;
+        }
+
+        /**
          * Sets the extras bundle
          *
          * @return Returns the Builder object.
@@ -103,12 +116,14 @@
          */
         @NonNull
         public KnownNetworkConnectionStatus build() {
-            return new KnownNetworkConnectionStatus(mStatus, mExtras);
+            return new KnownNetworkConnectionStatus(mStatus, mKnownNetwork, mExtras);
         }
     }
 
-    private KnownNetworkConnectionStatus(@ConnectionStatus int status, Bundle extras) {
+    private KnownNetworkConnectionStatus(@ConnectionStatus int status, KnownNetwork knownNetwork,
+            Bundle extras) {
         mStatus = status;
+        mKnownNetwork = knownNetwork;
         mExtras = extras;
     }
 
@@ -123,6 +138,16 @@
     }
 
     /**
+     * Gets the {@link KnownNetwork} object of the connection.
+     *
+     * @return Returns a KnownNetwork object.
+     */
+    @NonNull
+    public KnownNetwork getKnownNetwork() {
+        return mKnownNetwork;
+    }
+
+    /**
      * Gets the extras Bundle.
      *
      * @return Returns a Bundle object.
@@ -136,12 +161,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof KnownNetworkConnectionStatus)) return false;
         KnownNetworkConnectionStatus other = (KnownNetworkConnectionStatus) obj;
-        return mStatus == other.getStatus();
+        return mStatus == other.getStatus()
+                && Objects.equals(mKnownNetwork, other.getKnownNetwork());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mStatus);
+        return Objects.hash(mStatus, mKnownNetwork);
     }
 
     @Override
@@ -152,15 +178,27 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeInt(mStatus);
+        mKnownNetwork.writeToParcel(dest, flags);
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link KnownNetworkConnectionStatus} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static KnownNetworkConnectionStatus readFromParcel(@NonNull Parcel in) {
+        return new KnownNetworkConnectionStatus(in.readInt(),
+                KnownNetwork.readFromParcel(in),
+                in.readBundle());
+    }
+
     @NonNull
     public static final Creator<KnownNetworkConnectionStatus> CREATOR = new Creator<>() {
                 @Override
                 public KnownNetworkConnectionStatus createFromParcel(Parcel in) {
-                    return new KnownNetworkConnectionStatus(in.readInt(),
-                            in.readBundle(getClass().getClassLoader()));
+                    return readFromParcel(in);
                 }
 
                 @Override
@@ -173,6 +211,7 @@
     public String toString() {
         return new StringBuilder("KnownNetworkConnectionStatus[")
                 .append("status=").append(mStatus)
+                .append("known network=").append(mKnownNetwork.toString())
                 .append("extras=").append(mExtras.toString())
                 .append("]").toString();
     }
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
index 87f5efd..4809bef 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
@@ -128,12 +128,22 @@
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link SharedConnectivitySettingsState} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static SharedConnectivitySettingsState readFromParcel(@NonNull Parcel in) {
+        return new SharedConnectivitySettingsState(in.readBoolean(),
+                in.readBundle());
+    }
+
     @NonNull
     public static final Creator<SharedConnectivitySettingsState> CREATOR = new Creator<>() {
                 @Override
                 public SharedConnectivitySettingsState createFromParcel(Parcel in) {
-                    return new SharedConnectivitySettingsState(in.readBoolean(),
-                            in.readBundle(getClass().getClassLoader()));
+                    return readFromParcel(in);
                 }
 
                 @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
index 3eff724..af4fd4a 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
@@ -328,7 +328,7 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeLong(mDeviceId);
-        dest.writeTypedObject(mDeviceInfo, 0);
+        mDeviceInfo.writeToParcel(dest, flags);
         dest.writeInt(mNetworkType);
         dest.writeString(mNetworkName);
         dest.writeString(mHotspotSsid);
@@ -336,14 +336,23 @@
         dest.writeIntArray(mHotspotSecurityTypes);
     }
 
+    /**
+     * Creates a {@link TetherNetwork} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static TetherNetwork readFromParcel(@NonNull Parcel in) {
+        return new TetherNetwork(in.readLong(), DeviceInfo.readFromParcel(in),
+                in.readInt(), in.readString(), in.readString(), in.readString(),
+                in.createIntArray());
+    }
+
     @NonNull
     public static final Creator<TetherNetwork> CREATOR = new Creator<>() {
         @Override
         public TetherNetwork createFromParcel(Parcel in) {
-            return new TetherNetwork(in.readLong(), in.readTypedObject(
-                    android.net.wifi.sharedconnectivity.app.DeviceInfo.CREATOR),
-                    in.readInt(), in.readString(), in.readString(), in.readString(),
-                    in.createIntArray());
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
index 86202bb..3cf44ed 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
@@ -105,6 +105,7 @@
     public @interface ConnectionStatus {}
 
     @ConnectionStatus private final int mStatus;
+    private final TetherNetwork mTetherNetwork;
     private final Bundle mExtras;
 
     /**
@@ -112,6 +113,7 @@
      */
     public static final class Builder {
         @ConnectionStatus private int mStatus;
+        private TetherNetwork mTetherNetwork;
         private Bundle mExtras;
 
         public Builder() {}
@@ -128,6 +130,17 @@
         }
 
         /**
+         * Sets the {@link TetherNetwork} object of the connection.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setTetherNetwork(@NonNull TetherNetwork tetherNetwork) {
+            mTetherNetwork = tetherNetwork;
+            return this;
+        }
+
+        /**
          * Sets the extras bundle
          *
          * @return Returns the Builder object.
@@ -145,12 +158,14 @@
          */
         @NonNull
         public TetherNetworkConnectionStatus build() {
-            return new TetherNetworkConnectionStatus(mStatus, mExtras);
+            return new TetherNetworkConnectionStatus(mStatus, mTetherNetwork, mExtras);
         }
     }
 
-    private TetherNetworkConnectionStatus(@ConnectionStatus int status, Bundle extras) {
+    private TetherNetworkConnectionStatus(@ConnectionStatus int status, TetherNetwork tetherNetwork,
+            Bundle extras) {
         mStatus = status;
+        mTetherNetwork = tetherNetwork;
         mExtras = extras;
     }
 
@@ -165,6 +180,16 @@
     }
 
     /**
+     * Gets the {@link TetherNetwork} object of the connection.
+     *
+     * @return Returns a TetherNetwork object.
+     */
+    @NonNull
+    public TetherNetwork getTetherNetwork() {
+        return mTetherNetwork;
+    }
+
+    /**
      * Gets the extras Bundle.
      *
      * @return Returns a Bundle object.
@@ -178,12 +203,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof TetherNetworkConnectionStatus)) return false;
         TetherNetworkConnectionStatus other = (TetherNetworkConnectionStatus) obj;
-        return mStatus == other.getStatus();
+        return mStatus == other.getStatus()
+                && Objects.equals(mTetherNetwork, other.getTetherNetwork());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mStatus);
+        return Objects.hash(mStatus, mTetherNetwork);
     }
 
     @Override
@@ -194,27 +220,39 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeInt(mStatus);
+        mTetherNetwork.writeToParcel(dest, flags);
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link TetherNetworkConnectionStatus} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static TetherNetworkConnectionStatus readFromParcel(@NonNull Parcel in) {
+        return new TetherNetworkConnectionStatus(in.readInt(),
+                TetherNetwork.readFromParcel(in), in.readBundle());
+    }
+
     @NonNull
     public static final Creator<TetherNetworkConnectionStatus> CREATOR = new Creator<>() {
-                @Override
-                public TetherNetworkConnectionStatus createFromParcel(Parcel in) {
-                    return new TetherNetworkConnectionStatus(in.readInt(),
-                            in.readBundle(getClass().getClassLoader()));
-                }
+        @Override
+        public TetherNetworkConnectionStatus createFromParcel(Parcel in) {
+            return readFromParcel(in);
+        }
 
-                @Override
-                public TetherNetworkConnectionStatus[] newArray(int size) {
-                    return new TetherNetworkConnectionStatus[size];
-                }
-            };
+        @Override
+        public TetherNetworkConnectionStatus[] newArray(int size) {
+            return new TetherNetworkConnectionStatus[size];
+        }
+    };
 
     @Override
     public String toString() {
         return new StringBuilder("TetherNetworkConnectionStatus[")
                 .append("status=").append(mStatus)
+                .append("tether network=").append(mTetherNetwork.toString())
                 .append("extras=").append(mExtras.toString())
                 .append("]").toString();
     }
diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java
new file mode 100644
index 0000000..37dca8d
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2023 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.wifi.sharedconnectivity.app;
+
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP;
+import static android.net.wifi.sharedconnectivity.app.DeviceInfo.DEVICE_TYPE_TABLET;
+import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF;
+import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED;
+import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVE_FAILED;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Bundle;
+import android.os.Parcel;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus}.
+ */
+@SmallTest
+public class KnownNetworkConnectionStatusTest {
+    private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF;
+    private static final String SSID = "TEST_SSID";
+    private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP};
+    private static final DeviceInfo DEVICE_INFO = new DeviceInfo.Builder()
+            .setDeviceType(DEVICE_TYPE_TABLET).setDeviceName("TEST_NAME").setModelName("TEST_MODEL")
+            .setConnectionStrength(2).setBatteryPercentage(50).build();
+    private static final String SSID_1 = "TEST_SSID1";
+    private static final String BUNDLE_KEY = "INT-KEY";
+
+    /**
+     * Verifies parcel serialization/deserialization.
+     */
+    @Test
+    public void testParcelOperation() {
+        KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+
+        Parcel parcelW = Parcel.obtain();
+        status.writeToParcel(parcelW, 0);
+        byte[] bytes = parcelW.marshall();
+        parcelW.recycle();
+
+        Parcel parcelR = Parcel.obtain();
+        parcelR.unmarshall(bytes, 0, bytes.length);
+        parcelR.setDataPosition(0);
+        KnownNetworkConnectionStatus fromParcel =
+                KnownNetworkConnectionStatus.CREATOR.createFromParcel(parcelR);
+
+        assertEquals(status, fromParcel);
+        assertEquals(status.hashCode(), fromParcel.hashCode());
+    }
+
+    /**
+     * Verifies the Equals operation
+     */
+    @Test
+    public void testEqualsOperation() {
+        KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build();
+        KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build();
+        assertEquals(status2, status2);
+
+        KnownNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder()
+                .setStatus(CONNECTION_STATUS_SAVE_FAILED);
+        assertNotEquals(status1, builder.build());
+
+        builder = buildConnectionStatusBuilder()
+                .setKnownNetwork(buildKnownNetworkBuilder().setSsid(SSID_1).build());
+        assertNotEquals(status1, builder.build());
+    }
+
+    /**
+     * Verifies the get methods return the expected data.
+     */
+    @Test
+    public void testGetMethods() {
+        KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+        assertEquals(status.getStatus(), CONNECTION_STATUS_SAVED);
+        assertEquals(status.getKnownNetwork(), buildKnownNetworkBuilder().build());
+        assertEquals(status.getExtras().getInt(BUNDLE_KEY), buildBundle().getInt(BUNDLE_KEY));
+    }
+
+    private KnownNetworkConnectionStatus.Builder buildConnectionStatusBuilder() {
+        return new KnownNetworkConnectionStatus.Builder()
+                .setStatus(CONNECTION_STATUS_SAVED)
+                .setKnownNetwork(buildKnownNetworkBuilder().build())
+                .setExtras(buildBundle());
+    }
+
+    private Bundle buildBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putInt(BUNDLE_KEY, 1);
+        return bundle;
+    }
+
+    private KnownNetwork.Builder buildKnownNetworkBuilder() {
+        return new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE).setSsid(SSID)
+                .setSecurityTypes(SECURITY_TYPES).setDeviceInfo(DEVICE_INFO);
+    }
+
+}
diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java
new file mode 100644
index 0000000..1d9c2e6
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2023 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.wifi.sharedconnectivity.app;
+
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP;
+import static android.net.wifi.sharedconnectivity.app.DeviceInfo.DEVICE_TYPE_TABLET;
+import static android.net.wifi.sharedconnectivity.app.TetherNetwork.NETWORK_TYPE_CELLULAR;
+import static android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT;
+import static android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Bundle;
+import android.os.Parcel;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus}.
+ */
+@SmallTest
+public class TetherNetworkConnectionStatusTest {
+    private static final long DEVICE_ID = 11L;
+    private static final DeviceInfo DEVICE_INFO = new DeviceInfo.Builder()
+            .setDeviceType(DEVICE_TYPE_TABLET).setDeviceName("TEST_NAME").setModelName("TEST_MODEL")
+            .setConnectionStrength(2).setBatteryPercentage(50).build();
+    private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR;
+    private static final String NETWORK_NAME = "TEST_NETWORK";
+    private static final String HOTSPOT_SSID = "TEST_SSID";
+    private static final String HOTSPOT_BSSID = "TEST _BSSID";
+    private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP};
+    private static final long DEVICE_ID_1 = 111L;
+    private static final String BUNDLE_KEY = "INT-KEY";
+
+    /**
+     * Verifies parcel serialization/deserialization.
+     */
+    @Test
+    public void testParcelOperation() {
+        TetherNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+
+        Parcel parcelW = Parcel.obtain();
+        status.writeToParcel(parcelW, 0);
+        byte[] bytes = parcelW.marshall();
+        parcelW.recycle();
+
+        Parcel parcelR = Parcel.obtain();
+        parcelR.unmarshall(bytes, 0, bytes.length);
+        parcelR.setDataPosition(0);
+        TetherNetworkConnectionStatus fromParcel =
+                TetherNetworkConnectionStatus.CREATOR.createFromParcel(parcelR);
+
+        assertEquals(status, fromParcel);
+        assertEquals(status.hashCode(), fromParcel.hashCode());
+    }
+
+    /**
+     * Verifies the Equals operation
+     */
+    @Test
+    public void testEqualsOperation() {
+        TetherNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build();
+        TetherNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build();
+        assertEquals(status2, status2);
+
+        TetherNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder()
+                .setStatus(CONNECTION_STATUS_TETHERING_TIMEOUT);
+        assertNotEquals(status1, builder.build());
+
+        builder = buildConnectionStatusBuilder()
+                .setTetherNetwork(buildTetherNetworkBuilder().setDeviceId(DEVICE_ID_1).build());
+        assertNotEquals(status1, builder.build());
+    }
+
+    /**
+     * Verifies the get methods return the expected data.
+     */
+    @Test
+    public void testGetMethods() {
+        TetherNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+        assertEquals(status.getStatus(), CONNECTION_STATUS_ENABLING_HOTSPOT);
+        assertEquals(status.getTetherNetwork(), buildTetherNetworkBuilder().build());
+        assertEquals(status.getExtras().getInt(BUNDLE_KEY), buildBundle().getInt(BUNDLE_KEY));
+    }
+
+    private TetherNetworkConnectionStatus.Builder buildConnectionStatusBuilder() {
+
+        return new TetherNetworkConnectionStatus.Builder()
+                .setStatus(CONNECTION_STATUS_ENABLING_HOTSPOT)
+                .setTetherNetwork(buildTetherNetworkBuilder().build())
+                .setExtras(buildBundle());
+    }
+
+    private Bundle buildBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putInt(BUNDLE_KEY, 1);
+        return bundle;
+    }
+
+    private TetherNetwork.Builder buildTetherNetworkBuilder() {
+        return new TetherNetwork.Builder()
+                .setDeviceId(DEVICE_ID)
+                .setDeviceInfo(DEVICE_INFO)
+                .setNetworkType(NETWORK_TYPE)
+                .setNetworkName(NETWORK_NAME)
+                .setHotspotSsid(HOTSPOT_SSID)
+                .setHotspotBssid(HOTSPOT_BSSID)
+                .setHotspotSecurityTypes(HOTSPOT_SECURITY_TYPES);
+    }
+}