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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user