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