14e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti/* 24e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * Copyright (C) 2014 The Android Open Source Project 34e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * 44e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License"); 54e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * you may not use this file except in compliance with the License. 64e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * You may obtain a copy of the License at 74e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * 84e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * http://www.apache.org/licenses/LICENSE-2.0 94e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * 104e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * Unless required by applicable law or agreed to in writing, software 114e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS, 124e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * See the License for the specific language governing permissions and 144e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * limitations under the License. 154e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti */ 164e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 174e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittipackage android.net; 184e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 194e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittiimport android.content.Context; 204e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittiimport android.net.IEthernetManager; 21d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kimimport android.net.IEthernetServiceListener; 224e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittiimport android.net.IpConfiguration; 23d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kimimport android.os.Handler; 24d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kimimport android.os.Message; 254e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittiimport android.os.RemoteException; 264e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 27d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kimimport java.util.ArrayList; 28d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim 294e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti/** 304e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * A class representing the IP configuration of the Ethernet network. 314e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * 324e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * @hide 334e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti */ 344e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colittipublic class EthernetManager { 354e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti private static final String TAG = "EthernetManager"; 36d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim private static final int MSG_AVAILABILITY_CHANGED = 1000; 374e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 384e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti private final Context mContext; 394e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti private final IEthernetManager mService; 40d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim private final Handler mHandler = new Handler() { 41d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim @Override 42d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public void handleMessage(Message msg) { 43d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim if (msg.what == MSG_AVAILABILITY_CHANGED) { 44d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim boolean isAvailable = (msg.arg1 == 1); 45d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim for (Listener listener : mListeners) { 46d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim listener.onAvailabilityChanged(isAvailable); 47d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 48d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 49d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 50d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim }; 51d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim private final ArrayList<Listener> mListeners = new ArrayList<Listener>(); 52d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim private final IEthernetServiceListener.Stub mServiceListener = 53d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim new IEthernetServiceListener.Stub() { 54d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim @Override 55d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public void onAvailabilityChanged(boolean isAvailable) { 56d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim mHandler.obtainMessage( 57d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim MSG_AVAILABILITY_CHANGED, isAvailable ? 1 : 0, 0, null).sendToTarget(); 58d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 59d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim }; 60d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim 61d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim /** 62d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * A listener interface to receive notification on changes in Ethernet. 63d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim */ 64d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public interface Listener { 65d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim /** 66d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * Called when Ethernet port's availability is changed. 67d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * @param isAvailable {@code true} if one or more Ethernet port exists. 68d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim */ 69d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public void onAvailabilityChanged(boolean isAvailable); 70d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 714e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 724e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti /** 734e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * Create a new EthernetManager instance. 744e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * Applications will almost always want to use 754e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 764e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * the standard {@link android.content.Context#ETHERNET_SERVICE Context.ETHERNET_SERVICE}. 774e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti */ 784e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti public EthernetManager(Context context, IEthernetManager service) { 794e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti mContext = context; 804e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti mService = service; 814e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti } 824e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 834e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti /** 849c1ccc54a582d0ae4230dde249ba439921165e12Lorenzo Colitti * Get Ethernet configuration. 854e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti * @return the Ethernet Configuration, contained in {@link IpConfiguration}. 864e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti */ 874e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti public IpConfiguration getConfiguration() { 884e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti try { 894e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti return mService.getConfiguration(); 90c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 91c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 924e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti } 934e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti } 944e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti 954e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti /** 969c1ccc54a582d0ae4230dde249ba439921165e12Lorenzo Colitti * Set Ethernet configuration. 974e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti */ 984e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti public void setConfiguration(IpConfiguration config) { 994e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti try { 1004e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti mService.setConfiguration(config); 101c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 102c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 103d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 104d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 105d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim 106d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim /** 107d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * Indicates whether the system currently has one or more 108d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * Ethernet interfaces. 109d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim */ 110d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public boolean isAvailable() { 111d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim try { 112d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim return mService.isAvailable(); 113c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 114c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 115d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 116d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 117d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim 118d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim /** 119d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * Adds a listener. 120d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * @param listener A {@link Listener} to add. 121d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * @throws IllegalArgumentException If the listener is null. 122d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim */ 123d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public void addListener(Listener listener) { 124d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim if (listener == null) { 125d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim throw new IllegalArgumentException("listener must not be null"); 126d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 127d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim mListeners.add(listener); 128d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim if (mListeners.size() == 1) { 129d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim try { 130d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim mService.addListener(mServiceListener); 131c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 132c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 133d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 134d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 135d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 136d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim 137d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim /** 138d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * Removes a listener. 139d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * @param listener A {@link Listener} to remove. 140d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim * @throws IllegalArgumentException If the listener is null. 141d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim */ 142d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim public void removeListener(Listener listener) { 143d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim if (listener == null) { 144d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim throw new IllegalArgumentException("listener must not be null"); 145d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 146d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim mListeners.remove(listener); 147d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim if (mListeners.isEmpty()) { 148d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim try { 149d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim mService.removeListener(mServiceListener); 150c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 151c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 152d109a7cf695b1d208bd69ddb013b9fbdd5658255Jaewan Kim } 1534e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti } 1544e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti } 1554e5aa2cee69f6791f8001aeb1fc12389863fab8fLorenzo Colitti} 156