summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorIrfan Sheriff <isheriff@google.com>2011-01-20 07:12:20 -0800
committerIrfan Sheriff <isheriff@google.com>2011-01-20 07:47:21 -0800
commit43e747ef59e67734392d2d189e59fb9d11901037 (patch)
treeee7578caf92e08a57881255a23c4b35f25394e80 /wifi
parent28f37efe309d51c877bdd8c5ac31946db3ff06e4 (diff)
downloadframeworks_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.java71
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) {