diff options
Diffstat (limited to 'service')
5 files changed, 45 insertions, 4 deletions
diff --git a/service/java/com/android/server/wifi/ActiveModeManager.java b/service/java/com/android/server/wifi/ActiveModeManager.java index aa0bf9f6b..0983e9b93 100644 --- a/service/java/com/android/server/wifi/ActiveModeManager.java +++ b/service/java/com/android/server/wifi/ActiveModeManager.java @@ -59,6 +59,11 @@ public interface ActiveModeManager { */ void stop(); + /** + * Method used to indicate if the mode manager is still stopping. + */ + boolean isStopping(); + /** Roles assigned to each mode manager. */ int ROLE_UNSPECIFIED = -1; // SoftApManager - Tethering, will respond to public APIs. diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java index 03334584b..e0a0a3d29 100644 --- a/service/java/com/android/server/wifi/ActiveModeWarden.java +++ b/service/java/com/android/server/wifi/ActiveModeWarden.java @@ -282,6 +282,16 @@ public class ActiveModeWarden { } /** + * @return true if any mode manager is stopping + */ + private boolean hasAnyModeManagerStopping() { + for (ActiveModeManager manager : mActiveModeManagers) { + if (manager.isStopping()) return true; + } + return false; + } + + /** * @return true if all the client mode managers are in scan only role, * false if there are no client mode managers present or if any of them are not in scan only * role. @@ -886,8 +896,16 @@ public class ActiveModeWarden { if (mSettingsStore.isAirplaneModeOn()) { return NOT_HANDLED; } else { - // when airplane mode is toggled off, but wifi is on, we can keep it on - log("airplane mode toggled - and airplane mode is off. return handled"); + if (hasAnyModeManagerStopping()) { + // previous airplane mode toggle on is being processed, defer the + // message toggle off until previous processing is completed. + deferMessage(msg); + } else { + // when airplane mode is toggled off, but wifi is on, we can keep it + // on + log("airplane mode toggled - and airplane mode is off. return " + + "handled"); + } return HANDLED; } case CMD_AP_STOPPED: diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java index 61df5191b..abb6f625d 100644 --- a/service/java/com/android/server/wifi/ClientModeManager.java +++ b/service/java/com/android/server/wifi/ClientModeManager.java @@ -76,9 +76,9 @@ public class ClientModeManager implements ActiveModeManager { private String mClientInterfaceName; private boolean mIfaceIsUp = false; - private @Role int mRole = ROLE_UNSPECIFIED; private DeferStopHandler mDeferStopHandler; - private int mTargetRole = ROLE_UNSPECIFIED; + private @Role int mRole = ROLE_UNSPECIFIED; + private @Role int mTargetRole = ROLE_UNSPECIFIED; private int mActiveSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; ClientModeManager(Context context, @NonNull Looper looper, Clock clock, WifiNative wifiNative, @@ -122,6 +122,11 @@ public class ClientModeManager implements ActiveModeManager { mDeferStopHandler.start(getWifiOffDeferringTimeMs()); } + @Override + public boolean isStopping() { + return mTargetRole == ROLE_UNSPECIFIED && mRole != ROLE_UNSPECIFIED; + } + private class DeferStopHandler extends WifiHandler { private boolean mIsDeferring = false; private ImsMmTelManager mImsMmTelManager = null; diff --git a/service/java/com/android/server/wifi/DefaultModeManager.java b/service/java/com/android/server/wifi/DefaultModeManager.java index cda4978b8..00b2117a8 100644 --- a/service/java/com/android/server/wifi/DefaultModeManager.java +++ b/service/java/com/android/server/wifi/DefaultModeManager.java @@ -45,6 +45,11 @@ public class DefaultModeManager implements ActiveModeManager { @Override public void stop() { }; + @Override + public boolean isStopping() { + return false; + } + /** * No role specified in default mode. */ diff --git a/service/java/com/android/server/wifi/SoftApManager.java b/service/java/com/android/server/wifi/SoftApManager.java index 3bf12ca34..f9720477b 100644 --- a/service/java/com/android/server/wifi/SoftApManager.java +++ b/service/java/com/android/server/wifi/SoftApManager.java @@ -122,6 +122,7 @@ public class SoftApManager implements ActiveModeManager { private BaseWifiDiagnostics mWifiDiagnostics; private @Role int mRole = ROLE_UNSPECIFIED; + private @Role int mTargetRole = ROLE_UNSPECIFIED; private boolean mEverReportMetricsForMaxClient = false; @@ -219,6 +220,7 @@ public class SoftApManager implements ActiveModeManager { @Override public void stop() { Log.d(TAG, " currentstate: " + getCurrentStateName()); + mTargetRole = ROLE_UNSPECIFIED; if (mApInterfaceName != null) { if (mIfaceIsUp) { updateApState(WifiManager.WIFI_AP_STATE_DISABLING, @@ -232,6 +234,11 @@ public class SoftApManager implements ActiveModeManager { } @Override + public boolean isStopping() { + return mTargetRole == ROLE_UNSPECIFIED && mRole != ROLE_UNSPECIFIED; + } + + @Override public @Role int getRole() { return mRole; } @@ -241,6 +248,7 @@ public class SoftApManager implements ActiveModeManager { // softap does not allow in-place switching of roles. Preconditions.checkState(mRole == ROLE_UNSPECIFIED); Preconditions.checkState(SOFTAP_ROLES.contains(role)); + mTargetRole = role; mRole = role; } |