diff options
author | Irfan Sheriff <isheriff@google.com> | 2011-01-20 07:12:20 -0800 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2011-01-20 07:47:21 -0800 |
commit | 43e747ef59e67734392d2d189e59fb9d11901037 (patch) | |
tree | ee7578caf92e08a57881255a23c4b35f25394e80 /wifi | |
parent | 28f37efe309d51c877bdd8c5ac31946db3ff06e4 (diff) | |
download | frameworks_base-43e747ef59e67734392d2d189e59fb9d11901037.zip frameworks_base-43e747ef59e67734392d2d189e59fb9d11901037.tar.gz frameworks_base-43e747ef59e67734392d2d189e59fb9d11901037.tar.bz2 |
Add untether call during softap shutdown
Bug: 3355187
Change-Id: Ie4381648883186a216807bcd0d586ecfd00ca15c
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/java/android/net/wifi/WifiStateMachine.java | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 4d0acdd..3b5eef0 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -48,6 +48,7 @@ import android.net.NetworkInfo.DetailedState; import android.net.LinkProperties; import android.net.wifi.NetworkUpdateResult; import android.net.wifi.WpsResult.Status; +import android.net.InterfaceConfiguration; import android.os.Binder; import android.os.Message; import android.os.IBinder; @@ -73,7 +74,7 @@ import com.android.internal.util.AsyncChannel; import com.android.internal.util.HierarchicalState; import com.android.internal.util.HierarchicalStateMachine; - +import java.net.InetAddress; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -465,6 +466,20 @@ public class WifiStateMachine extends HierarchicalStateMachine { mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); mContext.registerReceiver( + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + ArrayList<String> available = intent.getStringArrayListExtra( + ConnectivityManager.EXTRA_AVAILABLE_TETHER); + ArrayList<String> active = intent.getStringArrayListExtra( + ConnectivityManager.EXTRA_ACTIVE_TETHER); + updateTetherState(available, active); + + } + },new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); + + mContext.registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -972,6 +987,52 @@ public class WifiStateMachine extends HierarchicalStateMachine { * Internal private functions ********************************************************/ + private void updateTetherState(ArrayList<String> available, ArrayList<String> tethered) { + + boolean wifiTethered = false; + boolean wifiAvailable = false; + + IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); + INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); + + if (mCm == null) { + mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + } + + String[] wifiRegexs = mCm.getTetherableWifiRegexs(); + + for (String intf : available) { + for (String regex : wifiRegexs) { + if (intf.matches(regex)) { + + InterfaceConfiguration ifcg = null; + try { + ifcg = service.getInterfaceConfig(intf); + if (ifcg != null) { + /* IP/netmask: 192.168.43.1/255.255.255.0 */ + ifcg.addr = InetAddress.getByName("192.168.43.1"); + ifcg.mask = InetAddress.getByName("255.255.255.0"); + ifcg.interfaceFlags = "[up]"; + + service.setInterfaceConfig(intf, ifcg); + } + } catch (Exception e) { + Log.e(TAG, "Error configuring interface " + intf + ", :" + e); + setWifiApEnabled(null, false); + return; + } + + if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { + Log.e(TAG, "Error tethering on " + intf); + setWifiApEnabled(null, false); + return; + } + break; + } + } + } + } + /** * Set the country code from the system setting value, if any. */ @@ -2818,6 +2879,14 @@ public class WifiStateMachine extends HierarchicalStateMachine { case CMD_STOP_AP: Log.d(TAG,"Stopping Soft AP"); setWifiApState(WIFI_AP_STATE_DISABLING); + + if (mCm == null) { + mCm = (ConnectivityManager) mContext.getSystemService( + Context.CONNECTIVITY_SERVICE); + } + if (mCm.untether(SOFTAP_IFACE) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { + Log.e(TAG, "Untether initiate failed!"); + } try { nwService.stopAccessPoint(); } catch(Exception e) { |