Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6487568 authored by Junyu Lai's avatar Junyu Lai Committed by android-build-merger
Browse files

Merge "[SP02] Add provider interfaces to system API"

am: 2220f75c

Change-Id: I3ca829dc6577355e0b13c2fa2f683a8bb9b6c582
parents 2173a4d0 2220f75c
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -5076,6 +5076,25 @@ package android.net.metrics {
}
package android.net.netstats.provider {
  public abstract class AbstractNetworkStatsProvider {
    ctor public AbstractNetworkStatsProvider();
    method public abstract void requestStatsUpdate(int);
    method public abstract void setAlert(long);
    method public abstract void setLimit(@NonNull String, long);
    field public static final int QUOTA_UNLIMITED = -1; // 0xffffffff
  }
  public class NetworkStatsProviderCallback {
    method public void onAlertReached();
    method public void onLimitReached();
    method public void onStatsUpdated(int, @NonNull android.net.NetworkStats, @NonNull android.net.NetworkStats);
    method public void unregister();
  }
}
package android.net.util {
  public final class SocketUtils {
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.net.netstats.provider;

import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.net.NetworkStats;

/**
 * A base class that allows external modules to implement a custom network statistics provider.
 * @hide
 */
@SystemApi
public abstract class AbstractNetworkStatsProvider {
    /**
     * A value used by {@link #setLimit} and {@link #setAlert} indicates there is no limit.
     */
    public static final int QUOTA_UNLIMITED = -1;

    /**
     * Called by {@code NetworkStatsService} when global polling is needed. Custom
     * implementation of providers MUST respond to it by calling
     * {@link NetworkStatsProviderCallback#onStatsUpdated} within one minute. Responding
     * later than this may cause the stats to be dropped.
     *
     * @param token a positive number identifying the new state of the system under which
     *              {@link NetworkStats} have to be gathered from now on. When this is called,
     *              custom implementations of providers MUST report the latest stats with the
     *              previous token, under which stats were being gathered so far.
     */
    public abstract void requestStatsUpdate(int token);

    /**
     * Called by {@code NetworkStatsService} when setting the interface quota for the specified
     * upstream interface. When this is called, the custom implementation should block all egress
     * packets on the {@code iface} associated with the provider when {@code quotaBytes} bytes have
     * been reached, and MUST respond to it by calling
     * {@link NetworkStatsProviderCallback#onLimitReached()}.
     *
     * @param iface the interface requiring the operation.
     * @param quotaBytes the quota defined as the number of bytes, starting from zero and counting
     *                   from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no limit.
     */
    public abstract void setLimit(@NonNull String iface, long quotaBytes);

    /**
     * Called by {@code NetworkStatsService} when setting the alert bytes. Custom implementations
     * MUST call {@link NetworkStatsProviderCallback#onAlertReached()} when {@code quotaBytes} bytes
     * have been reached. Unlike {@link #setLimit(String, long)}, the custom implementation should
     * not block all egress packets.
     *
     * @param quotaBytes the quota defined as the number of bytes, starting from zero and counting
     *                   from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no alert.
     */
    public abstract void setAlert(long quotaBytes);
}
+28 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.net.netstats.provider;

/**
 * Interface for NetworkStatsService to query network statistics and set data limits.
 *
 * @hide
 */
oneway interface INetworkStatsProvider {
    void requestStatsUpdate(int token);
    void setLimit(String iface, long quotaBytes);
    void setAlert(long quotaBytes);
}
+31 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.net.netstats.provider;

import android.net.NetworkStats;

/**
 * Interface for implementor of {@link INetworkStatsProviderCallback} to push events
 * such as network statistics update or notify limit reached.
 * @hide
 */
oneway interface INetworkStatsProviderCallback {
    void onStatsUpdated(int token, in NetworkStats ifaceStats, in NetworkStats uidStats);
    void onAlertReached();
    void onLimitReached();
    void unregister();
}
+98 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.net.netstats.provider;

import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.net.NetworkStats;
import android.os.RemoteException;

/**
 * A callback class that allows callers to report events to the system.
 * @hide
 */
@SystemApi
@SuppressLint("CallbackMethodName")
public class NetworkStatsProviderCallback {
    @NonNull private final INetworkStatsProviderCallback mBinder;

    /** @hide */
    public NetworkStatsProviderCallback(@NonNull INetworkStatsProviderCallback binder) {
        mBinder = binder;
    }

    /**
     * Notify the system of new network statistics.
     *
     * Send the network statistics recorded since the last call to {@link #onStatsUpdated}. Must be
     * called within one minute of {@link AbstractNetworkStatsProvider#requestStatsUpdate(int)}
     * being called. The provider can also call this whenever it wants to reports new stats for any
     * reason. Note that the system will not necessarily immediately propagate the statistics to
     * reflect the update.
     *
     * @param token the token under which these stats were gathered. Providers can call this method
     *              with the current token as often as they want, until the token changes.
     *              {@see AbstractNetworkStatsProvider#requestStatsUpdate()}
     * @param ifaceStats the {@link NetworkStats} per interface to be reported.
     *                   The provider should not include any traffic that is already counted by
     *                   kernel interface counters.
     * @param uidStats the same stats as above, but counts {@link NetworkStats}
     *                 per uid.
     */
    public void onStatsUpdated(int token, @NonNull NetworkStats ifaceStats,
            @NonNull NetworkStats uidStats) {
        try {
            mBinder.onStatsUpdated(token, ifaceStats, uidStats);
        } catch (RemoteException e) {
            e.rethrowAsRuntimeException();
        }
    }

    /**
     * Notify system that the quota set by {@code setAlert} has been reached.
     */
    public void onAlertReached() {
        try {
            mBinder.onAlertReached();
        } catch (RemoteException e) {
            e.rethrowAsRuntimeException();
        }
    }

    /**
     * Notify system that the quota set by {@code setLimit} has been reached.
     */
    public void onLimitReached() {
        try {
            mBinder.onLimitReached();
        } catch (RemoteException e) {
            e.rethrowAsRuntimeException();
        }
    }

    /**
     * Unregister the provider and the referencing callback.
     */
    public void unregister() {
        try {
            mBinder.unregister();
        } catch (RemoteException e) {
            // Ignore error.
        }
    }
}
Loading