1a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline/*
2a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Copyright (C) 2016 The Android Open Source Project
3a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
4a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Licensed under the Apache License, Version 2.0 (the "License");
5a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * you may not use this file except in compliance with the License.
6a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * You may obtain a copy of the License at
7a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
8a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *      http://www.apache.org/licenses/LICENSE-2.0
9a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
10a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Unless required by applicable law or agreed to in writing, software
11a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * distributed under the License is distributed on an "AS IS" BASIS,
12a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * See the License for the specific language governing permissions and
14a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * limitations under the License.
15a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline */
16a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
17a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klinepackage android.net.metrics;
18a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
19a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klineimport android.annotation.SystemApi;
20a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klineimport android.os.Parcel;
21a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klineimport android.os.Parcelable;
225df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport android.util.SparseArray;
235df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi
245df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport com.android.internal.util.MessageUtils;
25a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
26a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline/**
27a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * {@hide}
28a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline */
29a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline@SystemApi
30cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichipublic final class ValidationProbeEvent extends IpConnectivityEvent implements Parcelable {
31cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi
32c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int PROBE_DNS   = 0;
33c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int PROBE_HTTP  = 1;
34c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int PROBE_HTTPS = 2;
35c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int PROBE_PAC   = 3;
36c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti
37c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int DNS_FAILURE = 0;
38c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static final int DNS_SUCCESS = 1;
39cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi
40a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public final int netId;
41a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public final long durationMs;
42cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi    public final int probeType;
43a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public final int returnCode;
44a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
45cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi    private ValidationProbeEvent(int netId, long durationMs, int probeType, int returnCode) {
46a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        this.netId = netId;
47a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        this.durationMs = durationMs;
48cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        this.probeType = probeType;
49a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        this.returnCode = returnCode;
50a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
51a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
52cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi    private ValidationProbeEvent(Parcel in) {
53a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        netId = in.readInt();
54a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        durationMs = in.readLong();
55cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        probeType = in.readInt();
56a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        returnCode = in.readInt();
57a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
58a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
59a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public void writeToParcel(Parcel out, int flags) {
60a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        out.writeInt(netId);
61a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        out.writeLong(durationMs);
62cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        out.writeInt(probeType);
63a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        out.writeInt(returnCode);
64a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
65a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
66a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public int describeContents() {
67a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return 0;
68a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
69a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
70cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi    public static final Parcelable.Creator<ValidationProbeEvent> CREATOR
71cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        = new Parcelable.Creator<ValidationProbeEvent>() {
72cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        public ValidationProbeEvent createFromParcel(Parcel in) {
73cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi            return new ValidationProbeEvent(in);
74a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        }
75a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
76cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi        public ValidationProbeEvent[] newArray(int size) {
77cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi            return new ValidationProbeEvent[size];
78a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        }
79a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    };
80a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
81c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    /** @hide */
82c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    public static String getProbeName(int probeType) {
83c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti        return Decoder.constants.get(probeType, "PROBE_???");
84c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti    }
85c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti
86cc92c6e87773df9d5a84922066716ae9bb09cd6dHugo Benichi    public static void logEvent(int netId, long durationMs, int probeType, int returnCode) {
8761cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi        logEvent(new ValidationProbeEvent(netId, durationMs, probeType, returnCode));
885df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    }
895df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi
905df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    @Override
915df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    public String toString() {
925df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi        return String.format("ValidationProbeEvent(%d, %s:%d, %dms)",
93c5be12e7ac43cbe8c68219fa702c6fb7f06183c3Lorenzo Colitti                netId, getProbeName(probeType), returnCode, durationMs);
945df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    }
955df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi
965df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi    final static class Decoder {
975df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi        static final SparseArray<String> constants = MessageUtils.findMessageNames(
985df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi                new Class[]{ValidationProbeEvent.class}, new String[]{"PROBE_"});
99a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
100a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline};
101