diff options
| author | Remi NGUYEN VAN <reminv@google.com> | 2021-01-15 18:08:24 +0900 |
|---|---|---|
| committer | Remi NGUYEN VAN <reminv@google.com> | 2021-02-01 11:52:14 +0900 |
| commit | a31d72986318194bfdbd7ffefa87b335239cac7e (patch) | |
| tree | 6b477db74c6244c2b285da9591b9cf8ee0bf6481 /core/java/android/net/SocketKeepalive.java | |
| parent | d2d77dba7d21fdcccdc9c36cce41ffa205e30517 (diff) | |
Move module sources to packages/Connectivity
Files that are planned to be part of the connectivity module are grouped
in packages/Connectivity, so they can be built separately and moved in
one operation with their history into packages/modules/Connectivity.
This places the files in the existing framework-connectivity-sources
filegroup instead of the current framework-core-sources filegroup. Both
are used the same way in framework-non-updatable-sources.
Bug: 171540887
Test: m
Change-Id: I62d9d91574ace6f5c4624035d190260c3126b91e
Diffstat (limited to 'core/java/android/net/SocketKeepalive.java')
| -rw-r--r-- | core/java/android/net/SocketKeepalive.java | 301 |
1 files changed, 0 insertions, 301 deletions
diff --git a/core/java/android/net/SocketKeepalive.java b/core/java/android/net/SocketKeepalive.java deleted file mode 100644 index d007a9520cb5..000000000000 --- a/core/java/android/net/SocketKeepalive.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (C) 2019 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; - -import android.annotation.IntDef; -import android.annotation.IntRange; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.os.Binder; -import android.os.ParcelFileDescriptor; -import android.os.RemoteException; - -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.concurrent.Executor; - -/** - * Allows applications to request that the system periodically send specific packets on their - * behalf, using hardware offload to save battery power. - * - * To request that the system send keepalives, call one of the methods that return a - * {@link SocketKeepalive} object, such as {@link ConnectivityManager#createSocketKeepalive}, - * passing in a non-null callback. If the {@link SocketKeepalive} is successfully - * started, the callback's {@code onStarted} method will be called. If an error occurs, - * {@code onError} will be called, specifying one of the {@code ERROR_*} constants in this - * class. - * - * To stop an existing keepalive, call {@link SocketKeepalive#stop}. The system will call - * {@link SocketKeepalive.Callback#onStopped} if the operation was successful or - * {@link SocketKeepalive.Callback#onError} if an error occurred. - * - * For cellular, the device MUST support at least 1 keepalive slot. - * - * For WiFi, the device SHOULD support keepalive offload. If it does not, it MUST reply with - * {@link SocketKeepalive.Callback#onError} with {@code ERROR_UNSUPPORTED} to any keepalive offload - * request. If it does, it MUST support at least 3 concurrent keepalive slots. - */ -public abstract class SocketKeepalive implements AutoCloseable { - static final String TAG = "SocketKeepalive"; - - /** - * No errors. - * @hide - */ - @SystemApi - public static final int SUCCESS = 0; - - /** @hide */ - public static final int NO_KEEPALIVE = -1; - - /** @hide */ - public static final int DATA_RECEIVED = -2; - - /** @hide */ - public static final int BINDER_DIED = -10; - - /** The specified {@code Network} is not connected. */ - public static final int ERROR_INVALID_NETWORK = -20; - /** The specified IP addresses are invalid. For example, the specified source IP address is - * not configured on the specified {@code Network}. */ - public static final int ERROR_INVALID_IP_ADDRESS = -21; - /** The requested port is invalid. */ - public static final int ERROR_INVALID_PORT = -22; - /** The packet length is invalid (e.g., too long). */ - public static final int ERROR_INVALID_LENGTH = -23; - /** The packet transmission interval is invalid (e.g., too short). */ - public static final int ERROR_INVALID_INTERVAL = -24; - /** The target socket is invalid. */ - public static final int ERROR_INVALID_SOCKET = -25; - /** The target socket is not idle. */ - public static final int ERROR_SOCKET_NOT_IDLE = -26; - /** - * The stop reason is uninitialized. This should only be internally used as initial state - * of stop reason, instead of propagating to application. - * @hide - */ - public static final int ERROR_STOP_REASON_UNINITIALIZED = -27; - - /** The device does not support this request. */ - public static final int ERROR_UNSUPPORTED = -30; - /** @hide TODO: delete when telephony code has been updated. */ - public static final int ERROR_HARDWARE_UNSUPPORTED = ERROR_UNSUPPORTED; - /** The hardware returned an error. */ - public static final int ERROR_HARDWARE_ERROR = -31; - /** The limitation of resource is reached. */ - public static final int ERROR_INSUFFICIENT_RESOURCES = -32; - - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "ERROR_" }, value = { - ERROR_INVALID_NETWORK, - ERROR_INVALID_IP_ADDRESS, - ERROR_INVALID_PORT, - ERROR_INVALID_LENGTH, - ERROR_INVALID_INTERVAL, - ERROR_INVALID_SOCKET, - ERROR_SOCKET_NOT_IDLE - }) - public @interface ErrorCode {} - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - SUCCESS, - ERROR_INVALID_LENGTH, - ERROR_UNSUPPORTED, - ERROR_INSUFFICIENT_RESOURCES, - ERROR_HARDWARE_UNSUPPORTED - }) - public @interface KeepaliveEvent {} - - /** - * The minimum interval in seconds between keepalive packet transmissions. - * - * @hide - **/ - public static final int MIN_INTERVAL_SEC = 10; - - /** - * The maximum interval in seconds between keepalive packet transmissions. - * - * @hide - **/ - public static final int MAX_INTERVAL_SEC = 3600; - - /** - * An exception that embarks an error code. - * @hide - */ - public static class ErrorCodeException extends Exception { - public final int error; - public ErrorCodeException(final int error, final Throwable e) { - super(e); - this.error = error; - } - public ErrorCodeException(final int error) { - this.error = error; - } - } - - /** - * This socket is invalid. - * See the error code for details, and the optional cause. - * @hide - */ - public static class InvalidSocketException extends ErrorCodeException { - public InvalidSocketException(final int error, final Throwable e) { - super(error, e); - } - public InvalidSocketException(final int error) { - super(error); - } - } - - @NonNull final IConnectivityManager mService; - @NonNull final Network mNetwork; - @NonNull final ParcelFileDescriptor mPfd; - @NonNull final Executor mExecutor; - @NonNull final ISocketKeepaliveCallback mCallback; - // TODO: remove slot since mCallback could be used to identify which keepalive to stop. - @Nullable Integer mSlot; - - SocketKeepalive(@NonNull IConnectivityManager service, @NonNull Network network, - @NonNull ParcelFileDescriptor pfd, - @NonNull Executor executor, @NonNull Callback callback) { - mService = service; - mNetwork = network; - mPfd = pfd; - mExecutor = executor; - mCallback = new ISocketKeepaliveCallback.Stub() { - @Override - public void onStarted(int slot) { - final long token = Binder.clearCallingIdentity(); - try { - mExecutor.execute(() -> { - mSlot = slot; - callback.onStarted(); - }); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - @Override - public void onStopped() { - final long token = Binder.clearCallingIdentity(); - try { - executor.execute(() -> { - mSlot = null; - callback.onStopped(); - }); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - @Override - public void onError(int error) { - final long token = Binder.clearCallingIdentity(); - try { - executor.execute(() -> { - mSlot = null; - callback.onError(error); - }); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - @Override - public void onDataReceived() { - final long token = Binder.clearCallingIdentity(); - try { - executor.execute(() -> { - mSlot = null; - callback.onDataReceived(); - }); - } finally { - Binder.restoreCallingIdentity(token); - } - } - }; - } - - /** - * Request that keepalive be started with the given {@code intervalSec}. See - * {@link SocketKeepalive}. If the remote binder dies, or the binder call throws an exception - * when invoking start or stop of the {@link SocketKeepalive}, a {@link RemoteException} will be - * thrown into the {@code executor}. This is typically not important to catch because the remote - * party is the system, so if it is not in shape to communicate through binder the system is - * probably going down anyway. If the caller cares regardless, it can use a custom - * {@link Executor} to catch the {@link RemoteException}. - * - * @param intervalSec The target interval in seconds between keepalive packet transmissions. - * The interval should be between 10 seconds and 3600 seconds, otherwise - * {@link #ERROR_INVALID_INTERVAL} will be returned. - */ - public final void start(@IntRange(from = MIN_INTERVAL_SEC, to = MAX_INTERVAL_SEC) - int intervalSec) { - startImpl(intervalSec); - } - - abstract void startImpl(int intervalSec); - - /** - * Requests that keepalive be stopped. The application must wait for {@link Callback#onStopped} - * before using the object. See {@link SocketKeepalive}. - */ - public final void stop() { - stopImpl(); - } - - abstract void stopImpl(); - - /** - * Deactivate this {@link SocketKeepalive} and free allocated resources. The instance won't be - * usable again if {@code close()} is called. - */ - @Override - public final void close() { - stop(); - try { - mPfd.close(); - } catch (IOException e) { - // Nothing much can be done. - } - } - - /** - * The callback which app can use to learn the status changes of {@link SocketKeepalive}. See - * {@link SocketKeepalive}. - */ - public static class Callback { - /** The requested keepalive was successfully started. */ - public void onStarted() {} - /** The keepalive was successfully stopped. */ - public void onStopped() {} - /** An error occurred. */ - public void onError(@ErrorCode int error) {} - /** The keepalive on a TCP socket was stopped because the socket received data. This is - * never called for UDP sockets. */ - public void onDataReceived() {} - } -} |
