diff options
7 files changed, 38 insertions, 28 deletions
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java index e5e6db9..538e51a 100644 --- a/core/java/android/net/MobileDataStateTracker.java +++ b/core/java/android/net/MobileDataStateTracker.java @@ -48,6 +48,7 @@ public class MobileDataStateTracker extends NetworkStateTracker { private ITelephony mPhoneService; private String mApnType; + private String mApnName; private boolean mEnabled; private BroadcastReceiver mStateReceiver; @@ -139,6 +140,7 @@ public class MobileDataStateTracker extends NetworkStateTracker { String reason = intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY); String apnName = intent.getStringExtra(Phone.DATA_APN_KEY); String apnTypeList = intent.getStringExtra(Phone.DATA_APN_TYPES_KEY); + mApnName = apnName; boolean unavailable = intent.getBooleanExtra(Phone.NETWORK_UNAVAILABLE_KEY, false); @@ -339,6 +341,7 @@ public class MobileDataStateTracker extends NetworkStateTracker { intent.putExtra(Phone.STATE_KEY, Phone.DataState.CONNECTED.toString()); intent.putExtra(Phone.STATE_CHANGE_REASON_KEY, Phone.REASON_APN_CHANGED); intent.putExtra(Phone.DATA_APN_TYPES_KEY, mApnType); + intent.putExtra(Phone.DATA_APN_KEY, mApnName); intent.putExtra(Phone.DATA_IFACE_NAME_KEY, mInterfaceName); intent.putExtra(Phone.NETWORK_UNAVAILABLE_KEY, false); if (mStateReceiver != null) mStateReceiver.onReceive(mContext, intent); diff --git a/location/java/android/location/ILocationProvider.aidl b/location/java/android/location/ILocationProvider.aidl index 4fe0494..7da16e4 100644 --- a/location/java/android/location/ILocationProvider.aidl +++ b/location/java/android/location/ILocationProvider.aidl @@ -17,6 +17,7 @@ package android.location; import android.location.Location; +import android.net.NetworkInfo; import android.os.Bundle; /** @@ -41,7 +42,7 @@ interface ILocationProvider { long getStatusUpdateTime(); void enableLocationTracking(boolean enable); void setMinTime(long minTime); - void updateNetworkState(int state); + void updateNetworkState(int state, in NetworkInfo info); void updateLocation(in Location location); boolean sendExtraCommand(String command, inout Bundle extras); void addListener(int uid); diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index bfa0671..cd62ed1 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -32,6 +32,7 @@ import android.location.Location; import android.location.LocationManager; import android.location.LocationProvider; import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.SntpClient; import android.os.Bundle; import android.os.IBinder; @@ -46,7 +47,6 @@ import android.util.SparseIntArray; import com.android.internal.app.IBatteryStats; import com.android.internal.telephony.Phone; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; @@ -303,22 +303,6 @@ public class GpsLocationProvider extends ILocationProvider.Stub { } else if (action.equals(ALARM_TIMEOUT)) { if (DEBUG) Log.d(TAG, "ALARM_TIMEOUT"); hibernate(); - } else if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) { - String state = intent.getStringExtra(Phone.STATE_KEY); - String apnName = intent.getStringExtra(Phone.DATA_APN_KEY); - String reason = intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY); - - if (Config.LOGD) { - Log.d(TAG, "state: " + state + " apnName: " + apnName + " reason: " + reason); - } - // FIXME - might not have an APN on CDMA - if ("CONNECTED".equals(state) && apnName != null && apnName.length() > 0) { - mAGpsApn = apnName; - if (mAGpsDataConnectionState == AGPS_DATA_CONNECTION_OPENING) { - native_agps_data_conn_open(mAGpsApn); - mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; - } - } } } }; @@ -343,7 +327,6 @@ public class GpsLocationProvider extends ILocationProvider.Stub { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ALARM_WAKEUP); intentFilter.addAction(ALARM_TIMEOUT); - intentFilter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); context.registerReceiver(mBroadcastReciever, intentFilter); mConnMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); @@ -391,13 +374,30 @@ public class GpsLocationProvider extends ILocationProvider.Stub { return true; } - public void updateNetworkState(int state) { + public void updateNetworkState(int state, NetworkInfo info) { mNetworkAvailable = (state == LocationProvider.AVAILABLE); if (Config.LOGD) { - Log.d(TAG, "updateNetworkState " + (mNetworkAvailable ? "available" : "unavailable")); + Log.d(TAG, "updateNetworkState " + (mNetworkAvailable ? "available" : "unavailable") + + " info: " + info); } - + + if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE_SUPL + && mAGpsDataConnectionState == AGPS_DATA_CONNECTION_OPENING) { + String apnName = info.getExtraInfo(); + if (mNetworkAvailable && apnName != null && apnName.length() > 0) { + mAGpsApn = apnName; + if (DEBUG) Log.d(TAG, "call native_agps_data_conn_open"); + native_agps_data_conn_open(apnName); + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; + } else { + if (DEBUG) Log.d(TAG, "call native_agps_data_conn_failed"); + mAGpsApn = null; + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; + native_agps_data_conn_failed(); + } + } + if (mNetworkAvailable && mNetworkThread != null && mEnabled) { // signal the network thread when the network becomes available mNetworkThread.signal(); diff --git a/location/java/com/android/internal/location/LocationProviderProxy.java b/location/java/com/android/internal/location/LocationProviderProxy.java index 4ae424a..89337b3 100644 --- a/location/java/com/android/internal/location/LocationProviderProxy.java +++ b/location/java/com/android/internal/location/LocationProviderProxy.java @@ -20,6 +20,7 @@ import android.location.Address; import android.location.ILocationProvider; import android.location.Location; import android.location.LocationManager; +import android.net.NetworkInfo; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; @@ -217,9 +218,9 @@ public class LocationProviderProxy implements IBinder.DeathRecipient { } } - public void updateNetworkState(int state) { + public void updateNetworkState(int state, NetworkInfo info) { try { - mProvider.updateNetworkState(state); + mProvider.updateNetworkState(state, info); } catch (RemoteException e) { Log.e(TAG, "updateNetworkState failed", e); } diff --git a/location/java/com/android/internal/location/MockProvider.java b/location/java/com/android/internal/location/MockProvider.java index e2e0562..2614f82 100644 --- a/location/java/com/android/internal/location/MockProvider.java +++ b/location/java/com/android/internal/location/MockProvider.java @@ -20,6 +20,7 @@ import android.location.ILocationManager; import android.location.ILocationProvider; import android.location.Location; import android.location.LocationProvider; +import android.net.NetworkInfo; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; @@ -169,7 +170,7 @@ public class MockProvider extends ILocationProvider.Stub { public void setMinTime(long minTime) { } - public void updateNetworkState(int state) { + public void updateNetworkState(int state, NetworkInfo info) { } public void updateLocation(Location location) { diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index c8fa4c3..d1b3bd0 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -48,6 +48,7 @@ import android.location.Location; import android.location.LocationManager; import android.location.LocationProvider; import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.Uri; import android.os.Binder; import android.os.Bundle; @@ -529,7 +530,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } // notify provider of current network state - proxy.updateNetworkState(mNetworkState); + proxy.updateNetworkState(mNetworkState, null); } } @@ -1600,13 +1601,15 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } else { mNetworkState = LocationProvider.TEMPORARILY_UNAVAILABLE; } + NetworkInfo info = + (NetworkInfo)intent.getExtra(ConnectivityManager.EXTRA_NETWORK_INFO); // Notify location providers of current network state synchronized (mLock) { for (int i = mProviders.size() - 1; i >= 0; i--) { LocationProviderProxy provider = mProviders.get(i); if (provider.requiresNetwork()) { - provider.updateNetworkState(mNetworkState); + provider.updateNetworkState(mNetworkState, info); } } } diff --git a/test-runner/android/test/TestLocationProvider.java b/test-runner/android/test/TestLocationProvider.java index 2ea020e..dc07585 100644 --- a/test-runner/android/test/TestLocationProvider.java +++ b/test-runner/android/test/TestLocationProvider.java @@ -22,6 +22,7 @@ import android.location.ILocationManager; import android.location.ILocationProvider; import android.location.Location; import android.location.LocationProvider; +import android.net.NetworkInfo; import android.os.Bundle; import android.os.RemoteException; import android.os.SystemClock; @@ -156,7 +157,7 @@ public class TestLocationProvider extends ILocationProvider.Stub { public void setMinTime(long minTime) { } - public void updateNetworkState(int state) { + public void updateNetworkState(int state, NetworkInfo info) { } public void updateLocation(Location location) { |