102b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak/*
202b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * Copyright (C) 2016 The Android Open Source Project
302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak *
402b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * Licensed under the Apache License, Version 2.0 (the "License");
502b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * you may not use this file except in compliance with the License.
602b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * You may obtain a copy of the License at
702b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak *
802b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak *      http://www.apache.org/licenses/LICENSE-2.0
902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak *
1002b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * Unless required by applicable law or agreed to in writing, software
1102b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * distributed under the License is distributed on an "AS IS" BASIS,
1202b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * See the License for the specific language governing permissions and
1402b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak * limitations under the License.
1502b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak */
1602b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
1702b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiakpackage android.net;
1802b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
1902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiakimport android.os.Parcel;
2002b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiakimport android.os.Parcelable;
21a365bace7a8e3e6da016531e26a6046a827acaa5Hugo Benichiimport com.android.internal.util.BitUtils;
2202b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
23946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi/**
24946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi * Represents a core networking event defined in package android.net.metrics.
25946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi * Logged by IpConnectivityLog and managed by ConnectivityMetrics service.
26946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi * {@hide}
27946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi * */
2850d1c044b5ce4b6fef532dc6e083cef903f554b2Jeff Sharkeypublic final class ConnectivityMetricsEvent implements Parcelable {
2902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
30946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    /** Time when this event was collected, as returned by System.currentTimeMillis(). */
31ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi    public long timestamp;
32946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    /** Transports of the network associated with the event, as defined in NetworkCapabilities. */
33946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    public long transports;
34946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    /** Network id of the network associated with the event, or 0 if unspecified. */
35946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    public int netId;
36946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    /** Name of the network interface associated with the event, or null if unspecified. */
37946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    public String ifname;
3802b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    /** Opaque event-specific data. */
39ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi    public Parcelable data;
40ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi
41ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi    public ConnectivityMetricsEvent() {
42ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi    }
4302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
44946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi    private ConnectivityMetricsEvent(Parcel in) {
45ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi        timestamp = in.readLong();
46946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        transports = in.readLong();
47946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        netId = in.readInt();
48946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        ifname = in.readString();
49ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi        data = in.readParcelable(null);
5002b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    }
5102b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
5202b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    /** Implement the Parcelable interface */
5302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    public static final Parcelable.Creator<ConnectivityMetricsEvent> CREATOR
5402b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak            = new Parcelable.Creator<ConnectivityMetricsEvent> (){
5502b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        public ConnectivityMetricsEvent createFromParcel(Parcel source) {
56ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi            return new ConnectivityMetricsEvent(source);
5702b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        }
5802b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
5902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        public ConnectivityMetricsEvent[] newArray(int size) {
6002b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak            return new ConnectivityMetricsEvent[size];
6102b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        }
6202b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    };
6302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
6402b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    @Override
6502b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    public int describeContents() {
6602b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        return 0;
6702b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    }
6802b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
6902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    @Override
7002b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    public void writeToParcel(Parcel dest, int flags) {
7102b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        dest.writeLong(timestamp);
72946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        dest.writeLong(transports);
73946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        dest.writeInt(netId);
74946b7e424e0e4d5bffc65ef405f32b966d192d3cHugo Benichi        dest.writeString(ifname);
7502b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak        dest.writeParcelable(data, 0);
7602b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    }
7702b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak
78ec27c4d9f33615be1f94d6bb5c5fd1358580ac05Hugo Benichi    @Override
7902b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    public String toString() {
80948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        StringBuilder buffer = new StringBuilder("ConnectivityMetricsEvent(");
81948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        buffer.append(String.format("%tT.%tL", timestamp, timestamp));
82f927f0c52e7df5b057e7d28888c3cfed164d241aHugo Benichi        if (netId != 0) {
83f927f0c52e7df5b057e7d28888c3cfed164d241aHugo Benichi            buffer.append(", ").append(netId);
84f927f0c52e7df5b057e7d28888c3cfed164d241aHugo Benichi        }
85948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        if (ifname != null) {
86948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi            buffer.append(", ").append(ifname);
87948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        }
88a365bace7a8e3e6da016531e26a6046a827acaa5Hugo Benichi        for (int t : BitUtils.unpackBits(transports)) {
89a365bace7a8e3e6da016531e26a6046a827acaa5Hugo Benichi            buffer.append(", ").append(NetworkCapabilities.transportNameOf(t));
90a365bace7a8e3e6da016531e26a6046a827acaa5Hugo Benichi        }
91948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        buffer.append("): ").append(data.toString());
92948a85948dcccea4aaa9d70a74405308581b0925Hugo Benichi        return buffer.toString();
9302b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak    }
9402b3e6bfc5bbd5f1a8ce1ce68976e59142073b6fPavel Zhamaitsiak}
95