summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2017-01-13 07:03:16 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-01-13 07:03:17 +0000
commitcaf62d305e9123e99a4d0f59ff61d1413321db94 (patch)
treed356768d3cc2ec0fba168d1b45dbae5c8bff167c
parent4533b1ccdd207f232b1311961cac6680682a56e8 (diff)
parentfdd4111ef6891132530cb2f329758a47d9370649 (diff)
downloadbase-caf62d305e9123e99a4d0f59ff61d1413321db94.tar.gz
Merge "Move explicit mobile request handling into UpstreamNetworkMonitor"
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java107
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();