blob: d37cbd1f101849b086ac6a84a4b0d8cf99d486ec [file] [log] [blame]
/*
* Copyright (C) 2024 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 com.google.snippet.wifi.aware;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.TransportInfo;
import androidx.annotation.NonNull;
import androidx.test.core.app.ApplicationProvider;
import com.google.android.mobly.snippet.Snippet;
import com.google.android.mobly.snippet.event.EventCache;
import com.google.android.mobly.snippet.event.SnippetEvent;
import com.google.android.mobly.snippet.rpc.AsyncRpc;
import com.google.android.mobly.snippet.rpc.Rpc;
import com.google.android.mobly.snippet.util.Log;
import java.util.HashMap;
import java.util.Map;
public class ConnectivityManagerSnippet implements Snippet {
private static final String EVENT_KEY_CB_NAME = "callbackName";
private static final String EVENT_KEY_NETWORK = "network";
private static final String EVENT_KEY_NETWORK_CAP = "networkCapabilities";
private static final String EVENT_KEY_TRANSPORT_INFO_CLASS = "transportInfoClassName";
private final Context mContext;
private final ConnectivityManager mConnectivityManager;
private final Map<String, NetworkCallback> mNetworkCallBacks = new HashMap<>();
class ConnectivityManagerSnippetSnippetException extends Exception {
ConnectivityManagerSnippetSnippetException(String msg) {
super(msg);
}
}
public ConnectivityManagerSnippet() throws ConnectivityManagerSnippetSnippetException {
mContext = ApplicationProvider.getApplicationContext();
mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
if (mConnectivityManager == null) {
throw new ConnectivityManagerSnippetSnippetException("ConnectivityManager not "
+ "available.");
}
}
public class NetworkCallback extends ConnectivityManager.NetworkCallback {
String mCallBackId;
NetworkCallback(String callBackId) {
mCallBackId = callBackId;
}
@Override
public void onUnavailable() {
SnippetEvent event = new SnippetEvent(mCallBackId, "NetworkCallback");
event.getData().putString(EVENT_KEY_CB_NAME, "onUnavailable");
EventCache.getInstance().postEvent(event);
}
@Override
public void onCapabilitiesChanged(
@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
SnippetEvent event = new SnippetEvent(mCallBackId, "NetworkCallback");
event.getData().putString(EVENT_KEY_CB_NAME, "onCapabilitiesChanged");
event.getData().putParcelable(EVENT_KEY_NETWORK, network);
event.getData().putParcelable(EVENT_KEY_NETWORK_CAP, networkCapabilities);
TransportInfo transportInfo = networkCapabilities.getTransportInfo();
String transportInfoClassName = "";
if (transportInfo != null) {
transportInfoClassName = transportInfo.getClass().getName();
}
event.getData().putString(EVENT_KEY_TRANSPORT_INFO_CLASS, transportInfoClassName);
EventCache.getInstance().postEvent(event);
}
}
/**
* Requests a network with given network request.
*
* @param callBackId Assigned automatically by mobly. Will be used as request Id
* for further operations
* @param request The request object.
* @param requestNetworkTimeoutMs The timeout in milliseconds.
*/
@AsyncRpc(description = "Request a network.")
public void connectivityRequestNetwork(String callBackId, NetworkRequest request,
int requestNetworkTimeoutMs) {
Log.v("Requesting network with request: " + request.toString());
NetworkCallback callback = new NetworkCallback(callBackId);
mNetworkCallBacks.put(callBackId, callback);
mConnectivityManager.requestNetwork(request, callback, requestNetworkTimeoutMs);
}
/**
* Unregisters the registered network callback and possibly releases requested networks.
*
* @param requestId Id of the network request.
*/
@Rpc(description = "Unregister a network request")
public void connectivityUnregisterNetwork(String requestId) {
NetworkCallback callback = mNetworkCallBacks.get(requestId);
if (callback == null) {
return;
}
mConnectivityManager.unregisterNetworkCallback(callback);
}
}