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