Loading Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -697,6 +697,7 @@ java_defaults { "android.hardware.radio-V1.3-java", "android.hardware.radio-V1.4-java", "android.hardware.usb.gadget-V1.0-java", "networkstack-aidl-interfaces-java", "netd_aidl_interface-java", ], Loading Loading @@ -826,12 +827,14 @@ aidl_interface { srcs: [ "core/java/android/net/INetworkMonitor.aidl", "core/java/android/net/INetworkMonitorCallbacks.aidl", "core/java/android/net/IIpMemoryStore.aidl", "core/java/android/net/INetworkStackConnector.aidl", "core/java/android/net/INetworkStackStatusCallback.aidl", "core/java/android/net/PrivateDnsConfigParcel.aidl", "core/java/android/net/dhcp/DhcpServingParamsParcel.aidl", "core/java/android/net/dhcp/IDhcpServer.aidl", "core/java/android/net/dhcp/IDhcpServerCallbacks.aidl", "core/java/android/net/ipmemorystore/**/*.aidl", ], api_dir: "aidl/networkstack", } Loading core/java/android/app/SystemServiceRegistry.java +17 −4 Original line number Diff line number Diff line Loading @@ -82,8 +82,10 @@ import android.net.ConnectivityThread; import android.net.EthernetManager; import android.net.IConnectivityManager; import android.net.IEthernetManager; import android.net.IIpMemoryStore; import android.net.IIpSecService; import android.net.INetworkPolicyManager; import android.net.IpMemoryStore; import android.net.IpSecManager; import android.net.NetworkPolicyManager; import android.net.NetworkScoreManager; Loading Loading @@ -291,6 +293,17 @@ final class SystemServiceRegistry { return new NetworkStack(); }}); registerService(Context.IP_MEMORY_STORE_SERVICE, IpMemoryStore.class, new CachedServiceFetcher<IpMemoryStore>() { @Override public IpMemoryStore createService(final ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow( Context.IP_MEMORY_STORE_SERVICE); IIpMemoryStore service = IIpMemoryStore.Stub.asInterface(b); return new IpMemoryStore(ctx, service); }}); registerService(Context.IPSEC_SERVICE, IpSecManager.class, new CachedServiceFetcher<IpSecManager>() { @Override Loading core/java/android/content/Context.java +9 −0 Original line number Diff line number Diff line Loading @@ -3015,6 +3015,7 @@ public abstract class Context { VIBRATOR_SERVICE, //@hide: STATUS_BAR_SERVICE, CONNECTIVITY_SERVICE, //@hide: IP_MEMORY_STORE_SERVICE, IPSEC_SERVICE, //@hide: UPDATE_LOCK_SERVICE, //@hide: NETWORKMANAGEMENT_SERVICE, Loading Loading @@ -3512,6 +3513,14 @@ public abstract class Context { */ public static final String NETWORK_STACK_SERVICE = "network_stack"; /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.net.IpMemoryStore} to store and read information about * known networks. * @hide */ public static final String IP_MEMORY_STORE_SERVICE = "ipmemorystore"; /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.net.IpSecManager} for encrypting Sockets or Networks with Loading core/java/android/net/IIpMemoryStore.aidl 0 → 100644 +113 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.net.ipmemorystore.Blob; import android.net.ipmemorystore.NetworkAttributesParcelable; import android.net.ipmemorystore.IOnBlobRetrievedListener; import android.net.ipmemorystore.IOnL2KeyResponseListener; import android.net.ipmemorystore.IOnNetworkAttributesRetrieved; import android.net.ipmemorystore.IOnSameNetworkResponseListener; import android.net.ipmemorystore.IOnStatusListener; /** {@hide} */ oneway interface IIpMemoryStore { /** * Store network attributes for a given L2 key. * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to * calling findL2Key with the attributes and storing in the returned value. * * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2 * key and only care about grouping can pass a unique ID here like the ones * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low * relevance of such a network will lead to it being evicted soon if it's not * refreshed. Use findL2Key to try and find a similar L2Key to these attributes. * @param attributes The attributes for this network. * @param listener A listener that will be invoked to inform of the completion of this call, * or null if the client is not interested in learning about success/failure. * @return (through the listener) The L2 key. This is useful if the L2 key was not specified. * If the call failed, the L2 key will be null. */ void storeNetworkAttributes(String l2Key, in NetworkAttributesParcelable attributes, IOnStatusListener listener); /** * Store a binary blob associated with an L2 key and a name. * * @param l2Key The L2 key for this network. * @param clientId The ID of the client. * @param name The name of this data. * @param data The data to store. * @param listener A listener to inform of the completion of this call, or null if the client * is not interested in learning about success/failure. * @return (through the listener) A status to indicate success or failure. */ void storeBlob(String l2Key, String clientId, String name, in Blob data, IOnStatusListener listener); /** * Returns the best L2 key associated with the attributes. * * This will find a record that would be in the same group as the passed attributes. This is * useful to choose the key for storing a sample or private data when the L2 key is not known. * If multiple records are group-close to these attributes, the closest match is returned. * If multiple records have the same closeness, the one with the smaller (unicode codepoint * order) L2 key is returned. * If no record matches these attributes, null is returned. * * @param attributes The attributes of the network to find. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The L2 key if one matched, or null. */ void findL2Key(in NetworkAttributesParcelable attributes, IOnL2KeyResponseListener listener); /** * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point * to the same L3 network. Group-closeness is used to determine this. * * @param l2Key1 The key for the first network. * @param l2Key2 The key for the second network. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) A SameL3NetworkResponse containing the answer and confidence. */ void isSameNetwork(String l2Key1, String l2Key2, IOnSameNetworkResponseListener listener); /** * Retrieve the network attributes for a key. * If no record is present for this key, this will return null attributes. * * @param l2Key The key of the network to query. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The network attributes and the L2 key associated with * the query. */ void retrieveNetworkAttributes(String l2Key, IOnNetworkAttributesRetrieved listener); /** * Retrieve previously stored private data. * If no data was stored for this L2 key and name this will return null. * * @param l2Key The L2 key. * @param clientId The id of the client that stored this data. * @param name The name of the data. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The private data (or null), with the L2 key * and the name of the data associated with the query. */ void retrieveBlob(String l2Key, String clientId, String name, IOnBlobRetrievedListener listener); } core/java/android/net/IpMemoryStore.java 0 → 100644 +174 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; import android.content.Context; import android.net.ipmemorystore.Blob; import android.net.ipmemorystore.IOnBlobRetrievedListener; import android.net.ipmemorystore.IOnL2KeyResponseListener; import android.net.ipmemorystore.IOnNetworkAttributesRetrieved; import android.net.ipmemorystore.IOnSameNetworkResponseListener; import android.net.ipmemorystore.IOnStatusListener; import android.net.ipmemorystore.NetworkAttributes; import android.os.RemoteException; import com.android.internal.util.Preconditions; /** * The interface for system components to access the IP memory store. * @see com.android.server.net.ipmemorystore.IpMemoryStoreService * @hide */ @SystemService(Context.IP_MEMORY_STORE_SERVICE) public class IpMemoryStore { @NonNull final Context mContext; @NonNull final IIpMemoryStore mService; public IpMemoryStore(@NonNull final Context context, @NonNull final IIpMemoryStore service) { mContext = Preconditions.checkNotNull(context, "missing context"); mService = Preconditions.checkNotNull(service, "missing IIpMemoryStore"); } /** * Store network attributes for a given L2 key. * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to * calling findL2Key with the attributes and storing in the returned value. * * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2 * key and only care about grouping can pass a unique ID here like the ones * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low * relevance of such a network will lead to it being evicted soon if it's not * refreshed. Use findL2Key to try and find a similar L2Key to these attributes. * @param attributes The attributes for this network. * @param listener A listener that will be invoked to inform of the completion of this call, * or null if the client is not interested in learning about success/failure. * Through the listener, returns the L2 key. This is useful if the L2 key was not specified. * If the call failed, the L2 key will be null. */ public void storeNetworkAttributes(@NonNull final String l2Key, @NonNull final NetworkAttributes attributes, @Nullable final IOnStatusListener listener) { try { mService.storeNetworkAttributes(l2Key, attributes.toParcelable(), listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Store a binary blob associated with an L2 key and a name. * * @param l2Key The L2 key for this network. * @param clientId The ID of the client. * @param name The name of this data. * @param data The data to store. * @param listener A listener to inform of the completion of this call, or null if the client * is not interested in learning about success/failure. * Through the listener, returns a status to indicate success or failure. */ public void storeBlob(@NonNull final String l2Key, @NonNull final String clientId, @NonNull final String name, @NonNull final Blob data, @Nullable final IOnStatusListener listener) { try { mService.storeBlob(l2Key, clientId, name, data, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns the best L2 key associated with the attributes. * * This will find a record that would be in the same group as the passed attributes. This is * useful to choose the key for storing a sample or private data when the L2 key is not known. * If multiple records are group-close to these attributes, the closest match is returned. * If multiple records have the same closeness, the one with the smaller (unicode codepoint * order) L2 key is returned. * If no record matches these attributes, null is returned. * * @param attributes The attributes of the network to find. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the L2 key if one matched, or null. */ public void findL2Key(@NonNull final NetworkAttributes attributes, @NonNull final IOnL2KeyResponseListener listener) { try { mService.findL2Key(attributes.toParcelable(), listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point * to the same L3 network. Group-closeness is used to determine this. * * @param l2Key1 The key for the first network. * @param l2Key2 The key for the second network. * @param listener The listener that will be invoked to return the answer. * Through the listener, a SameL3NetworkResponse containing the answer and confidence. */ public void isSameNetwork(@NonNull final String l2Key1, @NonNull final String l2Key2, @NonNull final IOnSameNetworkResponseListener listener) { try { mService.isSameNetwork(l2Key1, l2Key2, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve the network attributes for a key. * If no record is present for this key, this will return null attributes. * * @param l2Key The key of the network to query. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the network attributes and the L2 key associated with * the query. */ public void retrieveNetworkAttributes(@NonNull final String l2Key, @NonNull final IOnNetworkAttributesRetrieved listener) { try { mService.retrieveNetworkAttributes(l2Key, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve previously stored private data. * If no data was stored for this L2 key and name this will return null. * * @param l2Key The L2 key. * @param clientId The id of the client that stored this data. * @param name The name of the data. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the private data (or null), with the L2 key * and the name of the data associated with the query. */ public void retrieveBlob(@NonNull final String l2Key, @NonNull final String clientId, @NonNull final String name, @NonNull final IOnBlobRetrievedListener listener) { try { mService.retrieveBlob(l2Key, clientId, name, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } Loading
Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -697,6 +697,7 @@ java_defaults { "android.hardware.radio-V1.3-java", "android.hardware.radio-V1.4-java", "android.hardware.usb.gadget-V1.0-java", "networkstack-aidl-interfaces-java", "netd_aidl_interface-java", ], Loading Loading @@ -826,12 +827,14 @@ aidl_interface { srcs: [ "core/java/android/net/INetworkMonitor.aidl", "core/java/android/net/INetworkMonitorCallbacks.aidl", "core/java/android/net/IIpMemoryStore.aidl", "core/java/android/net/INetworkStackConnector.aidl", "core/java/android/net/INetworkStackStatusCallback.aidl", "core/java/android/net/PrivateDnsConfigParcel.aidl", "core/java/android/net/dhcp/DhcpServingParamsParcel.aidl", "core/java/android/net/dhcp/IDhcpServer.aidl", "core/java/android/net/dhcp/IDhcpServerCallbacks.aidl", "core/java/android/net/ipmemorystore/**/*.aidl", ], api_dir: "aidl/networkstack", } Loading
core/java/android/app/SystemServiceRegistry.java +17 −4 Original line number Diff line number Diff line Loading @@ -82,8 +82,10 @@ import android.net.ConnectivityThread; import android.net.EthernetManager; import android.net.IConnectivityManager; import android.net.IEthernetManager; import android.net.IIpMemoryStore; import android.net.IIpSecService; import android.net.INetworkPolicyManager; import android.net.IpMemoryStore; import android.net.IpSecManager; import android.net.NetworkPolicyManager; import android.net.NetworkScoreManager; Loading Loading @@ -291,6 +293,17 @@ final class SystemServiceRegistry { return new NetworkStack(); }}); registerService(Context.IP_MEMORY_STORE_SERVICE, IpMemoryStore.class, new CachedServiceFetcher<IpMemoryStore>() { @Override public IpMemoryStore createService(final ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow( Context.IP_MEMORY_STORE_SERVICE); IIpMemoryStore service = IIpMemoryStore.Stub.asInterface(b); return new IpMemoryStore(ctx, service); }}); registerService(Context.IPSEC_SERVICE, IpSecManager.class, new CachedServiceFetcher<IpSecManager>() { @Override Loading
core/java/android/content/Context.java +9 −0 Original line number Diff line number Diff line Loading @@ -3015,6 +3015,7 @@ public abstract class Context { VIBRATOR_SERVICE, //@hide: STATUS_BAR_SERVICE, CONNECTIVITY_SERVICE, //@hide: IP_MEMORY_STORE_SERVICE, IPSEC_SERVICE, //@hide: UPDATE_LOCK_SERVICE, //@hide: NETWORKMANAGEMENT_SERVICE, Loading Loading @@ -3512,6 +3513,14 @@ public abstract class Context { */ public static final String NETWORK_STACK_SERVICE = "network_stack"; /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.net.IpMemoryStore} to store and read information about * known networks. * @hide */ public static final String IP_MEMORY_STORE_SERVICE = "ipmemorystore"; /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.net.IpSecManager} for encrypting Sockets or Networks with Loading
core/java/android/net/IIpMemoryStore.aidl 0 → 100644 +113 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.net.ipmemorystore.Blob; import android.net.ipmemorystore.NetworkAttributesParcelable; import android.net.ipmemorystore.IOnBlobRetrievedListener; import android.net.ipmemorystore.IOnL2KeyResponseListener; import android.net.ipmemorystore.IOnNetworkAttributesRetrieved; import android.net.ipmemorystore.IOnSameNetworkResponseListener; import android.net.ipmemorystore.IOnStatusListener; /** {@hide} */ oneway interface IIpMemoryStore { /** * Store network attributes for a given L2 key. * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to * calling findL2Key with the attributes and storing in the returned value. * * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2 * key and only care about grouping can pass a unique ID here like the ones * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low * relevance of such a network will lead to it being evicted soon if it's not * refreshed. Use findL2Key to try and find a similar L2Key to these attributes. * @param attributes The attributes for this network. * @param listener A listener that will be invoked to inform of the completion of this call, * or null if the client is not interested in learning about success/failure. * @return (through the listener) The L2 key. This is useful if the L2 key was not specified. * If the call failed, the L2 key will be null. */ void storeNetworkAttributes(String l2Key, in NetworkAttributesParcelable attributes, IOnStatusListener listener); /** * Store a binary blob associated with an L2 key and a name. * * @param l2Key The L2 key for this network. * @param clientId The ID of the client. * @param name The name of this data. * @param data The data to store. * @param listener A listener to inform of the completion of this call, or null if the client * is not interested in learning about success/failure. * @return (through the listener) A status to indicate success or failure. */ void storeBlob(String l2Key, String clientId, String name, in Blob data, IOnStatusListener listener); /** * Returns the best L2 key associated with the attributes. * * This will find a record that would be in the same group as the passed attributes. This is * useful to choose the key for storing a sample or private data when the L2 key is not known. * If multiple records are group-close to these attributes, the closest match is returned. * If multiple records have the same closeness, the one with the smaller (unicode codepoint * order) L2 key is returned. * If no record matches these attributes, null is returned. * * @param attributes The attributes of the network to find. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The L2 key if one matched, or null. */ void findL2Key(in NetworkAttributesParcelable attributes, IOnL2KeyResponseListener listener); /** * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point * to the same L3 network. Group-closeness is used to determine this. * * @param l2Key1 The key for the first network. * @param l2Key2 The key for the second network. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) A SameL3NetworkResponse containing the answer and confidence. */ void isSameNetwork(String l2Key1, String l2Key2, IOnSameNetworkResponseListener listener); /** * Retrieve the network attributes for a key. * If no record is present for this key, this will return null attributes. * * @param l2Key The key of the network to query. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The network attributes and the L2 key associated with * the query. */ void retrieveNetworkAttributes(String l2Key, IOnNetworkAttributesRetrieved listener); /** * Retrieve previously stored private data. * If no data was stored for this L2 key and name this will return null. * * @param l2Key The L2 key. * @param clientId The id of the client that stored this data. * @param name The name of the data. * @param listener The listener that will be invoked to return the answer. * @return (through the listener) The private data (or null), with the L2 key * and the name of the data associated with the query. */ void retrieveBlob(String l2Key, String clientId, String name, IOnBlobRetrievedListener listener); }
core/java/android/net/IpMemoryStore.java 0 → 100644 +174 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; import android.content.Context; import android.net.ipmemorystore.Blob; import android.net.ipmemorystore.IOnBlobRetrievedListener; import android.net.ipmemorystore.IOnL2KeyResponseListener; import android.net.ipmemorystore.IOnNetworkAttributesRetrieved; import android.net.ipmemorystore.IOnSameNetworkResponseListener; import android.net.ipmemorystore.IOnStatusListener; import android.net.ipmemorystore.NetworkAttributes; import android.os.RemoteException; import com.android.internal.util.Preconditions; /** * The interface for system components to access the IP memory store. * @see com.android.server.net.ipmemorystore.IpMemoryStoreService * @hide */ @SystemService(Context.IP_MEMORY_STORE_SERVICE) public class IpMemoryStore { @NonNull final Context mContext; @NonNull final IIpMemoryStore mService; public IpMemoryStore(@NonNull final Context context, @NonNull final IIpMemoryStore service) { mContext = Preconditions.checkNotNull(context, "missing context"); mService = Preconditions.checkNotNull(service, "missing IIpMemoryStore"); } /** * Store network attributes for a given L2 key. * If L2Key is null, choose automatically from the attributes ; passing null is equivalent to * calling findL2Key with the attributes and storing in the returned value. * * @param l2Key The L2 key for the L2 network. Clients that don't know or care about the L2 * key and only care about grouping can pass a unique ID here like the ones * generated by {@code java.util.UUID.randomUUID()}, but keep in mind the low * relevance of such a network will lead to it being evicted soon if it's not * refreshed. Use findL2Key to try and find a similar L2Key to these attributes. * @param attributes The attributes for this network. * @param listener A listener that will be invoked to inform of the completion of this call, * or null if the client is not interested in learning about success/failure. * Through the listener, returns the L2 key. This is useful if the L2 key was not specified. * If the call failed, the L2 key will be null. */ public void storeNetworkAttributes(@NonNull final String l2Key, @NonNull final NetworkAttributes attributes, @Nullable final IOnStatusListener listener) { try { mService.storeNetworkAttributes(l2Key, attributes.toParcelable(), listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Store a binary blob associated with an L2 key and a name. * * @param l2Key The L2 key for this network. * @param clientId The ID of the client. * @param name The name of this data. * @param data The data to store. * @param listener A listener to inform of the completion of this call, or null if the client * is not interested in learning about success/failure. * Through the listener, returns a status to indicate success or failure. */ public void storeBlob(@NonNull final String l2Key, @NonNull final String clientId, @NonNull final String name, @NonNull final Blob data, @Nullable final IOnStatusListener listener) { try { mService.storeBlob(l2Key, clientId, name, data, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns the best L2 key associated with the attributes. * * This will find a record that would be in the same group as the passed attributes. This is * useful to choose the key for storing a sample or private data when the L2 key is not known. * If multiple records are group-close to these attributes, the closest match is returned. * If multiple records have the same closeness, the one with the smaller (unicode codepoint * order) L2 key is returned. * If no record matches these attributes, null is returned. * * @param attributes The attributes of the network to find. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the L2 key if one matched, or null. */ public void findL2Key(@NonNull final NetworkAttributes attributes, @NonNull final IOnL2KeyResponseListener listener) { try { mService.findL2Key(attributes.toParcelable(), listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns whether, to the best of the store's ability to tell, the two specified L2 keys point * to the same L3 network. Group-closeness is used to determine this. * * @param l2Key1 The key for the first network. * @param l2Key2 The key for the second network. * @param listener The listener that will be invoked to return the answer. * Through the listener, a SameL3NetworkResponse containing the answer and confidence. */ public void isSameNetwork(@NonNull final String l2Key1, @NonNull final String l2Key2, @NonNull final IOnSameNetworkResponseListener listener) { try { mService.isSameNetwork(l2Key1, l2Key2, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve the network attributes for a key. * If no record is present for this key, this will return null attributes. * * @param l2Key The key of the network to query. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the network attributes and the L2 key associated with * the query. */ public void retrieveNetworkAttributes(@NonNull final String l2Key, @NonNull final IOnNetworkAttributesRetrieved listener) { try { mService.retrieveNetworkAttributes(l2Key, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve previously stored private data. * If no data was stored for this L2 key and name this will return null. * * @param l2Key The L2 key. * @param clientId The id of the client that stored this data. * @param name The name of the data. * @param listener The listener that will be invoked to return the answer. * Through the listener, returns the private data (or null), with the L2 key * and the name of the data associated with the query. */ public void retrieveBlob(@NonNull final String l2Key, @NonNull final String clientId, @NonNull final String name, @NonNull final IOnBlobRetrievedListener listener) { try { mService.retrieveBlob(l2Key, clientId, name, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } }