Merge "[SP02] Add provider interfaces to system API"
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user