diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2017-01-13 07:03:16 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-01-13 07:03:17 +0000 |
commit | caf62d305e9123e99a4d0f59ff61d1413321db94 (patch) | |
tree | d356768d3cc2ec0fba168d1b45dbae5c8bff167c | |
parent | 4533b1ccdd207f232b1311961cac6680682a56e8 (diff) | |
parent | fdd4111ef6891132530cb2f329758a47d9370649 (diff) | |
download | base-caf62d305e9123e99a4d0f59ff61d1413321db94.tar.gz |
Merge "Move explicit mobile request handling into UpstreamNetworkMonitor"
-rw-r--r-- | services/core/java/com/android/server/connectivity/Tethering.java | 107 |
1 files changed, 71 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index e3362836c456..57381f23e1b5 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -520,8 +520,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } /** - * Creates a proxy {@link ResultReceiver} which enables tethering if the provsioning result is - * successful before firing back up to the wrapped receiver. + * Creates a proxy {@link ResultReceiver} which enables tethering if the provisioning result + * is successful before firing back up to the wrapped receiver. * * @param type The type of tethering being enabled. * @param receiver A ResultReceiver which will be called back with an int resultCode. @@ -890,7 +890,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public int setUsbTethering(boolean enable) { if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); - UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); + UsbManager usbManager = mContext.getSystemService(UsbManager.class); + if (usbManager == null) { + return enable ? ConnectivityManager.TETHER_ERROR_MASTER_ERROR + : ConnectivityManager.TETHER_ERROR_NO_ERROR; + } synchronized (mPublicSync) { if (enable) { @@ -936,7 +940,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private void checkDunRequired() { int secureSetting = 2; - TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); if (tm != null) { secureSetting = tm.getTetherApnRequired(); } @@ -1054,6 +1058,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private ConnectivityManager mCM; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDunTetheringCallback; + private NetworkCallback mMobileNetworkCallback; + private boolean mDunRequired; public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { mContext = ctx; @@ -1077,6 +1083,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } public void stop() { + releaseMobileNetworkRequest(); + releaseCallback(mDefaultNetworkCallback); mDefaultNetworkCallback = null; @@ -1086,6 +1094,52 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mNetworkMap.clear(); } + public void mobileUpstreamRequiresDun(boolean dunRequired) { + final boolean valueChanged = (mDunRequired != dunRequired); + mDunRequired = dunRequired; + if (valueChanged && mobileNetworkRequested()) { + releaseMobileNetworkRequest(); + registerMobileNetworkRequest(); + } + } + + public boolean mobileNetworkRequested() { + return (mMobileNetworkCallback != null); + } + + public void registerMobileNetworkRequest() { + if (mMobileNetworkCallback != null) return; + + final NetworkRequest.Builder builder = new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); + if (mDunRequired) { + builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); + } else { + builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + } + final NetworkRequest mobileUpstreamRequest = builder.build(); + + // The existing default network and DUN callbacks will be notified. + // Therefore, to avoid duplicate notifications, we only register a no-op. + mMobileNetworkCallback = new NetworkCallback(); + + // TODO: Change the timeout from 0 (no onUnavailable callback) to use some + // moderate callback time (once timeout callbacks are implemented). This might + // be useful for updating some UI. Additionally, we should definitely log a + // message to aid in any subsequent debugging + if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); + + cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback); + } + + public void releaseMobileNetworkRequest() { + if (mMobileNetworkCallback == null) return; + + cm().unregisterNetworkCallback(mMobileNetworkCallback); + mMobileNetworkCallback = null; + } + public NetworkState lookup(Network network) { return (network != null) ? mNetworkMap.get(network) : null; } @@ -1272,8 +1326,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; - private int mMobileApnReserved = ConnectivityManager.TYPE_NONE; - private NetworkCallback mMobileUpstreamCallback; + private int mPreviousMobileApn = ConnectivityManager.TYPE_NONE; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; @@ -1311,13 +1364,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering protected boolean turnOnUpstreamMobileConnection(int apnType) { if (apnType == ConnectivityManager.TYPE_NONE) { return false; } - if (apnType != mMobileApnReserved) { + if (apnType != mPreviousMobileApn) { // Unregister any previous mobile upstream callback because // this request, if any, will be different. turnOffUpstreamMobileConnection(); } - if (mMobileUpstreamCallback != null) { + if (mUpstreamNetworkMonitor.mobileNetworkRequested()) { // Looks like we already filed a request for this apnType. return true; } @@ -1326,42 +1379,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE_HIPRI: - mMobileApnReserved = apnType; + mPreviousMobileApn = apnType; break; default: return false; } - final NetworkRequest.Builder builder = new NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - if (apnType == ConnectivityManager.TYPE_MOBILE_DUN) { - builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); - } else { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); - } - final NetworkRequest mobileUpstreamRequest = builder.build(); - - // The UpstreamNetworkMonitor's callback will be notified. - // Therefore, to avoid duplicate notifications, we only register a no-op. - mMobileUpstreamCallback = new NetworkCallback(); - - // TODO: Change the timeout from 0 (no onUnavailable callback) to use some - // moderate callback time (once timeout callbacks are implemented). This might - // be useful for updating some UI. Additionally, we should definitely log a - // message to aid in any subsequent debugging - if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); - getConnectivityManager().requestNetwork( - mobileUpstreamRequest, mMobileUpstreamCallback, 0, apnType); + // TODO: This should be called by the code that observes + // configuration changes, once the above code in this function + // is simplified (i.e. eradicated). + mUpstreamNetworkMonitor.mobileUpstreamRequiresDun( + apnType == ConnectivityManager.TYPE_MOBILE_DUN); + + mUpstreamNetworkMonitor.registerMobileNetworkRequest(); return true; } protected void turnOffUpstreamMobileConnection() { - if (mMobileUpstreamCallback != null) { - getConnectivityManager().unregisterNetworkCallback(mMobileUpstreamCallback); - mMobileUpstreamCallback = null; - } - mMobileApnReserved = ConnectivityManager.TYPE_NONE; + mUpstreamNetworkMonitor.releaseMobileNetworkRequest(); + mPreviousMobileApn = ConnectivityManager.TYPE_NONE; } protected boolean turnOnMasterTetherSettings() { @@ -1677,7 +1713,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering @Override public void exit() { - // TODO: examine if we should check the return value. turnOffUpstreamMobileConnection(); mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); |