155618be44c5d2a7db3cf23881cace15108f07557Pierre Imai/*
255618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * Copyright (C) 2016 The Android Open Source Project
355618be44c5d2a7db3cf23881cace15108f07557Pierre Imai *
455618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * Licensed under the Apache License, Version 2.0 (the "License");
555618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * you may not use this file except in compliance with the License.
655618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * You may obtain a copy of the License at
755618be44c5d2a7db3cf23881cace15108f07557Pierre Imai *
855618be44c5d2a7db3cf23881cace15108f07557Pierre Imai *      http://www.apache.org/licenses/LICENSE-2.0
955618be44c5d2a7db3cf23881cace15108f07557Pierre Imai *
1055618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * Unless required by applicable law or agreed to in writing, software
1155618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * distributed under the License is distributed on an "AS IS" BASIS,
1255618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * See the License for the specific language governing permissions and
1455618be44c5d2a7db3cf23881cace15108f07557Pierre Imai * limitations under the License.
1555618be44c5d2a7db3cf23881cace15108f07557Pierre Imai */
1655618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
1755618be44c5d2a7db3cf23881cace15108f07557Pierre Imaipackage android.net.metrics;
1855618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
194b6dfc2ef54723768a67887ce2a42d4f8f64d0f4Hugo Benichiimport android.annotation.SystemApi;
205df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport android.net.NetworkCapabilities;
2155618be44c5d2a7db3cf23881cace15108f07557Pierre Imaiimport android.os.Parcel;
2255618be44c5d2a7db3cf23881cace15108f07557Pierre Imaiimport android.os.Parcelable;
2355618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
24bc9cc50947c129d11a282198ac458ffb82fef5bdPierre Imai/**
25cf6b12f50aa3251a3fc9929c565f8a19eaaac49eHugo Benichi * An event recorded by ConnectivityService when there is a change in the default network.
26bc9cc50947c129d11a282198ac458ffb82fef5bdPierre Imai * {@hide}
27bc9cc50947c129d11a282198ac458ffb82fef5bdPierre Imai */
284b6dfc2ef54723768a67887ce2a42d4f8f64d0f4Hugo Benichi@SystemApi
29cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichipublic final class DefaultNetworkEvent implements Parcelable {
306b4e15b1558e13cb9d9b3975412c4c6bda6e0c37Pierre Imai    // The ID of the network that has become the new default or NETID_UNSET if none.
31627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public final int netId;
326b4e15b1558e13cb9d9b3975412c4c6bda6e0c37Pierre Imai    // The list of transport types of the new default network, for example TRANSPORT_WIFI, as
336b4e15b1558e13cb9d9b3975412c4c6bda6e0c37Pierre Imai    // defined in NetworkCapabilities.java.
34627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public final int[] transportTypes;
3548f12f2ad6e59484f528978ce3627c16be3bf10dErik Kline    // The ID of the network that was the default before or NETID_UNSET if none.
36627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public final int prevNetId;
3748f12f2ad6e59484f528978ce3627c16be3bf10dErik Kline    // Whether the previous network had IPv4/IPv6 connectivity.
38627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public final boolean prevIPv4;
39627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public final boolean prevIPv6;
4055618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
41cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi    /** {@hide} */
42cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi    public DefaultNetworkEvent(int netId, int[] transportTypes,
4348f12f2ad6e59484f528978ce3627c16be3bf10dErik Kline                int prevNetId, boolean prevIPv4, boolean prevIPv6) {
44627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.netId = netId;
45627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.transportTypes = transportTypes;
46627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevNetId = prevNetId;
47627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevIPv4 = prevIPv4;
48627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevIPv6 = prevIPv6;
4955618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    }
5055618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
515f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi    private DefaultNetworkEvent(Parcel in) {
52627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.netId = in.readInt();
53627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.transportTypes = in.createIntArray();
54627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevNetId = in.readInt();
55627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevIPv4 = (in.readByte() > 0);
56627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        this.prevIPv6 = (in.readByte() > 0);
5755618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    }
5855618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
59cf6b12f50aa3251a3fc9929c565f8a19eaaac49eHugo Benichi    @Override
6055618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    public void writeToParcel(Parcel out, int flags) {
61627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        out.writeInt(netId);
62627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        out.writeIntArray(transportTypes);
63627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        out.writeInt(prevNetId);
64627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        out.writeByte(prevIPv4 ? (byte) 1 : (byte) 0);
65627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        out.writeByte(prevIPv6 ? (byte) 1 : (byte) 0);
66627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    }
67627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi
68cf6b12f50aa3251a3fc9929c565f8a19eaaac49eHugo Benichi    @Override
69627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi    public int describeContents() {
70627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi        return 0;
7155618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    }
7255618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
735df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    @Override
745df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    public String toString() {
751654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      String prevNetwork = String.valueOf(prevNetId);
761654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      String newNetwork = String.valueOf(netId);
771654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      if (prevNetId != 0) {
781654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi          prevNetwork += ":" + ipSupport();
791654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      }
801654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      if (netId != 0) {
811654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi          newNetwork += ":" + NetworkCapabilities.transportNamesOf(transportTypes);
821654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      }
831654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi      return String.format("DefaultNetworkEvent(%s -> %s)", prevNetwork, newNetwork);
841654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi    }
851654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi
861654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi    private String ipSupport() {
871654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        if (prevIPv4 && prevIPv6) {
881654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi            return "DUAL";
891654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        }
901654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        if (prevIPv6) {
911654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi            return "IPv6";
921654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        }
931654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        if (prevIPv4) {
941654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi            return "IPv4";
951654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        }
961654b1d11c3f4195d6f691bd1b6eb5aa672ffc94Hugo Benichi        return "NONE";
975df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    }
985df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi
995f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi    public static final Parcelable.Creator<DefaultNetworkEvent> CREATOR
1005f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi        = new Parcelable.Creator<DefaultNetworkEvent>() {
1015f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi        public DefaultNetworkEvent createFromParcel(Parcel in) {
1025f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi            return new DefaultNetworkEvent(in);
10355618be44c5d2a7db3cf23881cace15108f07557Pierre Imai        }
10455618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
1055f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi        public DefaultNetworkEvent[] newArray(int size) {
1065f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi            return new DefaultNetworkEvent[size];
10755618be44c5d2a7db3cf23881cace15108f07557Pierre Imai        }
10855618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    };
10955618be44c5d2a7db3cf23881cace15108f07557Pierre Imai
1105f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi    public static void logEvent(
1115f16f760ad2469c8d5636f45974a2f725ef289beHugo Benichi            int netId, int[] transports, int prevNetId, boolean hadIPv4, boolean hadIPv6) {
11255618be44c5d2a7db3cf23881cace15108f07557Pierre Imai    }
113cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi}
114