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

This commit is contained in:
Junyu Lai
2020-01-09 14:19:37 +00:00
committed by Gerrit Code Review
6 changed files with 294 additions and 0 deletions

View File

@@ -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 {

View File

@@ -0,0 +1,70 @@
/*
* 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);
}

View File

@@ -0,0 +1,28 @@
/*
* 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);
}

View File

@@ -0,0 +1,31 @@
/*
* 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();
}

View File

@@ -0,0 +1,98 @@
/*
* 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.
}
}
}

View File

@@ -0,0 +1,48 @@
/*
* 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;
/**
* A wrapper class of {@link INetworkStatsProvider} that hides the binder interface from exposing
* to outer world.
*
* @hide
*/
public class NetworkStatsProviderWrapper extends INetworkStatsProvider.Stub {
@NonNull final AbstractNetworkStatsProvider mProvider;
public NetworkStatsProviderWrapper(AbstractNetworkStatsProvider provider) {
mProvider = provider;
}
@Override
public void requestStatsUpdate(int token) {
mProvider.requestStatsUpdate(token);
}
@Override
public void setLimit(@NonNull String iface, long quotaBytes) {
mProvider.setLimit(iface, quotaBytes);
}
@Override
public void setAlert(long quotaBytes) {
mProvider.setAlert(quotaBytes);
}
}