am 3d85fcbf: am 15748d35: am a0698b61: Merge "Optionally add a default MOBILE request." into mnc-dev

* commit '3d85fcbfb01cc611697d79a18b91107ede563767':
  Optionally add a default MOBILE request.
This commit is contained in:
Erik Kline
2015-05-08 16:58:21 +00:00
committed by Android Git Automerger

View File

@@ -190,7 +190,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
/** Set of ifaces that are costly. */ /** Set of ifaces that are costly. */
private HashSet<String> mMeteredIfaces = Sets.newHashSet(); private HashSet<String> mMeteredIfaces = Sets.newHashSet();
private Context mContext; final private Context mContext;
private int mNetworkPreference; private int mNetworkPreference;
// 0 is full bad, 100 is full good // 0 is full bad, 100 is full good
private int mDefaultInetConditionPublished = 0; private int mDefaultInetConditionPublished = 0;
@@ -344,6 +344,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
private static final int EVENT_PROMPT_UNVALIDATED = 29; private static final int EVENT_PROMPT_UNVALIDATED = 29;
/**
* used internally to (re)configure mobile data always-on settings.
*/
private static final int EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON = 30;
/** Handler used for internal events. */ /** Handler used for internal events. */
final private InternalHandler mHandler; final private InternalHandler mHandler;
/** Handler used for incoming {@link NetworkStateTracker} events. */ /** Handler used for incoming {@link NetworkStateTracker} events. */
@@ -374,7 +379,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private PacManager mPacManager = null; private PacManager mPacManager = null;
private SettingsObserver mSettingsObserver; final private SettingsObserver mSettingsObserver;
private UserManager mUserManager; private UserManager mUserManager;
@@ -555,13 +560,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
INetworkStatsService statsService, INetworkPolicyManager policyManager) { INetworkStatsService statsService, INetworkPolicyManager policyManager) {
if (DBG) log("ConnectivityService starting up"); if (DBG) log("ConnectivityService starting up");
NetworkCapabilities netCap = new NetworkCapabilities(); mDefaultRequest = createInternetRequestForTransport(-1);
netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); mNetworkRequests.put(mDefaultRequest, new NetworkRequestInfo(
netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); null, mDefaultRequest, new Binder(), NetworkRequestInfo.REQUEST));
mDefaultRequest = new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId());
NetworkRequestInfo nri = new NetworkRequestInfo(null, mDefaultRequest, new Binder(), mDefaultMobileDataRequest = createInternetRequestForTransport(
NetworkRequestInfo.REQUEST); NetworkCapabilities.TRANSPORT_CELLULAR);
mNetworkRequests.put(mDefaultRequest, nri);
HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread"); HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
handlerThread.start(); handlerThread.start();
@@ -696,8 +700,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
mInetLog = new ArrayList(); mInetLog = new ArrayList();
} }
mSettingsObserver = new SettingsObserver(mHandler, EVENT_APPLY_GLOBAL_HTTP_PROXY); mSettingsObserver = new SettingsObserver(mContext, mHandler);
mSettingsObserver.observe(mContext); registerSettingsCallbacks();
mDataConnectionStats = new DataConnectionStats(mContext); mDataConnectionStats = new DataConnectionStats(mContext);
mDataConnectionStats.startMonitoring(); mDataConnectionStats.startMonitoring();
@@ -707,6 +711,44 @@ public class ConnectivityService extends IConnectivityManager.Stub
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
} }
private NetworkRequest createInternetRequestForTransport(int transportType) {
NetworkCapabilities netCap = new NetworkCapabilities();
netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
if (transportType > -1) {
netCap.addTransportType(transportType);
}
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId());
}
private void handleMobileDataAlwaysOn() {
final boolean enable = (Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.MOBILE_DATA_ALWAYS_ON, 0) == 1);
final boolean isEnabled = (mNetworkRequests.get(mDefaultMobileDataRequest) != null);
if (enable == isEnabled) {
return; // Nothing to do.
}
if (enable) {
handleRegisterNetworkRequest(new NetworkRequestInfo(
null, mDefaultMobileDataRequest, new Binder(), NetworkRequestInfo.REQUEST));
} else {
handleReleaseNetworkRequest(mDefaultMobileDataRequest, Process.SYSTEM_UID);
}
}
private void registerSettingsCallbacks() {
// Watch for global HTTP proxy changes.
mSettingsObserver.observe(
Settings.Global.getUriFor(Settings.Global.HTTP_PROXY),
EVENT_APPLY_GLOBAL_HTTP_PROXY);
// Watch for whether or not to keep mobile data always on.
mSettingsObserver.observe(
Settings.Global.getUriFor(Settings.Global.MOBILE_DATA_ALWAYS_ON),
EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON);
}
private synchronized int nextNetworkRequestId() { private synchronized int nextNetworkRequestId() {
return mNextNetworkRequestId++; return mNextNetworkRequestId++;
} }
@@ -1491,6 +1533,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
mContext.registerReceiver(mUserPresentReceiver, filter); mContext.registerReceiver(mUserPresentReceiver, filter);
} }
// Configure whether mobile data is always on.
mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON));
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY));
mPermissionMonitor.startMonitoring(); mPermissionMonitor.startMonitoring();
@@ -2107,12 +2152,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
+ nri.request + " because their intents matched."); + nri.request + " because their intents matched.");
handleReleaseNetworkRequest(existingRequest.request, getCallingUid()); handleReleaseNetworkRequest(existingRequest.request, getCallingUid());
} }
handleRegisterNetworkRequest(msg); handleRegisterNetworkRequest(nri);
} }
private void handleRegisterNetworkRequest(Message msg) { private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
final NetworkRequestInfo nri = (NetworkRequestInfo) (msg.obj);
mNetworkRequests.put(nri.request, nri); mNetworkRequests.put(nri.request, nri);
// TODO: This logic may be better replaced with a call to rematchNetworkAndRequests // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests
@@ -2423,7 +2466,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
case EVENT_REGISTER_NETWORK_REQUEST: case EVENT_REGISTER_NETWORK_REQUEST:
case EVENT_REGISTER_NETWORK_LISTENER: { case EVENT_REGISTER_NETWORK_LISTENER: {
handleRegisterNetworkRequest(msg); handleRegisterNetworkRequest((NetworkRequestInfo) msg.obj);
break; break;
} }
case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: { case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: {
@@ -2446,6 +2489,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
handlePromptUnvalidated((Network) msg.obj); handlePromptUnvalidated((Network) msg.obj);
break; break;
} }
case EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON: {
handleMobileDataAlwaysOn();
break;
}
case EVENT_SYSTEM_READY: { case EVENT_SYSTEM_READY: {
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
nai.networkMonitor.systemReady = true; nai.networkMonitor.systemReady = true;
@@ -2837,23 +2884,36 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
private static class SettingsObserver extends ContentObserver { private static class SettingsObserver extends ContentObserver {
private int mWhat; final private HashMap<Uri, Integer> mUriEventMap;
private Handler mHandler; final private Context mContext;
SettingsObserver(Handler handler, int what) { final private Handler mHandler;
super(handler);
SettingsObserver(Context context, Handler handler) {
super(null);
mUriEventMap = new HashMap<Uri, Integer>();
mContext = context;
mHandler = handler; mHandler = handler;
mWhat = what;
} }
void observe(Context context) { void observe(Uri uri, int what) {
ContentResolver resolver = context.getContentResolver(); mUriEventMap.put(uri, what);
resolver.registerContentObserver(Settings.Global.getUriFor( final ContentResolver resolver = mContext.getContentResolver();
Settings.Global.HTTP_PROXY), false, this); resolver.registerContentObserver(uri, false, this);
} }
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
mHandler.obtainMessage(mWhat).sendToTarget(); Slog.wtf(TAG, "Should never be reached.");
}
@Override
public void onChange(boolean selfChange, Uri uri) {
final Integer what = mUriEventMap.get(uri);
if (what != null) {
mHandler.obtainMessage(what.intValue()).sendToTarget();
} else {
loge("No matching event to send for URI=" + uri);
}
} }
} }
@@ -3643,6 +3703,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated. // Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated.
private final NetworkRequest mDefaultRequest; private final NetworkRequest mDefaultRequest;
// Request used to optionally keep mobile data active even when higher
// priority networks like Wi-Fi are active.
private final NetworkRequest mDefaultMobileDataRequest;
private NetworkAgentInfo getDefaultNetwork() { private NetworkAgentInfo getDefaultNetwork() {
return mNetworkForRequestId.get(mDefaultRequest.requestId); return mNetworkForRequestId.get(mDefaultRequest.requestId);
} }