Loading core/java/android/provider/Settings.java +42 −0 Original line number Diff line number Diff line Loading @@ -3060,6 +3060,12 @@ public final class Settings { MOVED_TO_GLOBAL = new HashSet<String>(); MOVED_TO_GLOBAL.add(Settings.Global.ADB_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_SUPL_HOST); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_SUPL_PORT); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_POSITION_MODE); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_NETWORK); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_RESET_TYPE); MOVED_TO_GLOBAL.add(Settings.Global.BLUETOOTH_ON); MOVED_TO_GLOBAL.add(Settings.Global.BUGREPORT_IN_POWER_MENU); MOVED_TO_GLOBAL.add(Settings.Global.CDMA_CELL_BROADCAST_SMS); Loading Loading @@ -5339,6 +5345,42 @@ public final class Settings { */ public static final String ASSISTED_GPS_ENABLED = "assisted_gps_enabled"; /** * List for assisted GPS should be configurable. * @hide */ public static final String ASSISTED_GPS_CONFIGURABLE_LIST = "assisted_gps_configurable_list"; /** * Host for assisted GPS supl * @hide */ public static final String ASSISTED_GPS_SUPL_HOST = "assisted_gps_supl_host"; /** * Port for assisted GPS supl * @hide */ public static final String ASSISTED_GPS_SUPL_PORT = "assisted_gps_supl_port"; /** * Position mode for assisted GPS * @hide */ public static final String ASSISTED_GPS_POSITION_MODE = "assisted_gps_position_mode"; /** * Network preference for assisted GPS * @hide */ public static final String ASSISTED_GPS_NETWORK = "assisted_gps_network"; /** * Reset type for assisted GPS * @hide */ public static final String ASSISTED_GPS_RESET_TYPE = "assisted_gps_reset_type"; /** * Whether bluetooth is enabled/disabled * 0=disabled. 1=enabled. Loading packages/SettingsProvider/res/values/defaults.xml +1 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ --> <string name="def_location_providers_allowed" translatable="false">gps</string> <bool name="assisted_gps_enabled">true</bool> <string name="assisted_gps_configurable_list" translatable="false"></string> <bool name="def_netstats_enabled">true</bool> <bool name="def_usb_mass_storage_enabled">true</bool> <bool name="def_wifi_on">false</bool> Loading packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +17 −0 Original line number Diff line number Diff line Loading @@ -2440,6 +2440,23 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED, R.bool.assisted_gps_enabled); loadStringSetting(stmt, Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST, R.string.assisted_gps_configurable_list); String[] gpsConfigValues = mContext.getResources().getStringArray( com.android.internal.R.array.config_gpsParameters); for (String item : gpsConfigValues) { String[] split = item.split("="); if (split.length == 2) { String name = split[0].trim().toUpperCase(); String value = split[1]; if (name.equals("SUPL_HOST")) loadSetting(stmt, Settings.Global.ASSISTED_GPS_SUPL_HOST, value); else if (name.equals("SUPL_PORT")) loadSetting(stmt, Settings.Global.ASSISTED_GPS_SUPL_PORT, value); } } loadBooleanSetting(stmt, Settings.Global.AUTO_TIME, R.bool.def_auto_time); // Sync time to NITZ Loading services/core/java/com/android/server/location/GpsLocationProvider.java +134 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -73,6 +74,7 @@ import android.provider.Settings; import android.provider.Telephony.Carriers; import android.provider.Telephony.Sms.Intents; import android.telephony.SmsMessage; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; import android.text.TextUtils; Loading @@ -91,7 +93,9 @@ import java.net.UnknownHostException; import java.util.Date; import java.util.Map.Entry; import java.util.Properties; import java.util.Observable; import java.util.Observer; import java.util.Vector; import libcore.io.IoUtils; /** Loading Loading @@ -229,6 +233,11 @@ public class GpsLocationProvider implements LocationProviderInterface { private static final int AGPS_SETID_TYPE_IMSI = 1; private static final int AGPS_SETID_TYPE_MSISDN = 2; // agps start mode private static final int AGPS_START_MODE_COLD = 0; private static final int AGPS_START_MODE_WARM = 1; private static final int AGPS_START_MODE_HOT = 2; private static final String PROPERTIES_FILE_PREFIX = "/etc/gps"; private static final String PROPERTIES_FILE_SUFFIX = ".conf"; private static final String DEFAULT_PROPERTIES_FILE = PROPERTIES_FILE_PREFIX + PROPERTIES_FILE_SUFFIX; Loading Loading @@ -344,6 +353,8 @@ public class GpsLocationProvider implements LocationProviderInterface { private int mPositionMode; private boolean mAGPSConfigDb = false; // Current request from underlying location clients. private ProviderRequest mProviderRequest = null; // Current list of underlying location clients. Loading Loading @@ -578,6 +589,9 @@ public class GpsLocationProvider implements LocationProviderInterface { if (!isPropertiesLoadedFromFile) { loadPropertiesFromFile(DEFAULT_PROPERTIES_FILE, properties); } // Store GPS configuration to Settings Database and then reload it mAGPSConfigDb = testMccMncConfigurable(context); loadPropertiesFromSettingsDb(context, properties); Log.d(TAG, "GPS properties reloaded, size = " + properties.size()); // TODO: we should get rid of C2K specific setting. Loading Loading @@ -649,6 +663,92 @@ public class GpsLocationProvider implements LocationProviderInterface { return true; } private void addSettingDatabaseObserver(Context context) { Uri agpsSuplHostUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_SUPL_HOST); Uri agpsSuplPortUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_SUPL_PORT); Uri agpsPositionModeUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_POSITION_MODE); Uri agpsResetTypeUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_RESET_TYPE); ContentObserver observer = new ContentObserver(mHandler) { public void onChange(boolean bSelfChanged) { handleAgpsUpdate(); } }; ContentObserver observerForResetType = new ContentObserver(mHandler) { public void onChange(boolean bSelfChanged) { handleAgpsReset(); } }; context.getContentResolver().registerContentObserver(agpsSuplHostUri, true, observer); context.getContentResolver().registerContentObserver(agpsSuplPortUri, true, observer); context.getContentResolver().registerContentObserver(agpsPositionModeUri, true, observer); context.getContentResolver().registerContentObserver(agpsResetTypeUri, true, observerForResetType); } /** * Test whether current mcc+mnc is in the configurable list */ private boolean testMccMncConfigurable(Context context) { TelephonyManager phone = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int phoneCnt = phone.getPhoneCount(); Vector<String> mccMnc = new Vector<String>(); for(int i = 0;i<phoneCnt;++i) { long[] subIds = SubscriptionManager.getSubId(i); if (subIds != null && subIds.length > 0) { mccMnc.add(phone.getNetworkOperator(subIds[0])); } } if (mccMnc.size() > 0) { ContentResolver objContentResolver = context.getContentResolver(); String configurable_list = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST); if (!TextUtils.isEmpty(configurable_list)) { String[] list = configurable_list.split(","); for (String item:list) { if(mccMnc.contains(item)) return true; } } } return false; } /** * When boot and sim card changes, it will load new cfg to properties */ private void loadPropertiesFromSettingsDb(Context context, Properties properties) { if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb configurable = " + mAGPSConfigDb); if (mAGPSConfigDb) { ContentResolver objContentResolver = context.getContentResolver(); String mode = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_POSITION_MODE); if(!TextUtils.isEmpty(mode)) { try { if (mode.equals("MSB")) { properties.setProperty("SUPL_MODE", Integer.toString(AGPS_SUPL_MODE_MSB)); } else if (mode.equals("MSA")) { properties.setProperty("SUPL_MODE", Integer.toString(AGPS_SUPL_MODE_MSA)); } if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb agps_type = " + mode); } catch (Exception e) { Log.e(TAG, "Fail to set supl_mode for " + e); } } String suplAddr = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_SUPL_HOST); String suplPort = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_SUPL_PORT); if (!TextUtils.isEmpty(suplAddr) && !TextUtils.isEmpty(suplPort)) { properties.setProperty("SUPL_HOST", suplAddr); properties.setProperty("SUPL_PORT", suplPort); if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb SUPL = " + suplAddr + ":" + suplPort); } } } public GpsLocationProvider(Context context, ILocationManager ilocationManager, Looper looper) { mContext = context; Loading Loading @@ -712,6 +812,8 @@ public class GpsLocationProvider implements LocationProviderInterface { mHandler.getLooper()); } }); // Add Observer for AGPS database change addSettingDatabaseObserver(context); } private void listenForBroadcasts() { Loading Loading @@ -930,6 +1032,29 @@ public class GpsLocationProvider implements LocationProviderInterface { } } private void handleAgpsUpdate() { loadPropertiesFromSettingsDb(mContext,mProperties); setSuplHostPort(mProperties.getProperty("SUPL_HOST"), mProperties.getProperty("SUPL_PORT")); } private void handleAgpsReset() { ContentResolver objContentResolver = mContext.getContentResolver(); try { int startMode = Settings.Global.getInt(objContentResolver, Settings.Global.ASSISTED_GPS_RESET_TYPE, AGPS_START_MODE_HOT); Bundle bundle = new Bundle(); if (startMode == AGPS_START_MODE_COLD) { bundle.putBoolean("all", true); } else if (startMode == AGPS_START_MODE_WARM) { bundle.putBoolean("ephemeris", true); } sendExtraCommand("delete_aiding_data", bundle); } catch (Exception ex) { Log.e(TAG, "handleAgpsReset Failed!"); } } /** * Enables this provider. When enabled, calls to getStatus() * must be handled. Hardware may be started up Loading Loading @@ -984,6 +1109,14 @@ public class GpsLocationProvider implements LocationProviderInterface { return GPS_POSITION_MODE_STANDALONE; } } String prefAGpsNetworkType = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.ASSISTED_GPS_NETWORK); if (prefAGpsNetworkType != null && prefAGpsNetworkType.equals("HOME")) { TelephonyManager tm = (TelephonyManager) mContext .getSystemService(Context.TELEPHONY_SERVICE); if (tm.isNetworkRoaming()) return GPS_POSITION_MODE_STANDALONE; } if (singleShot && hasCapability(GPS_CAPABILITY_MSA) && (suplMode & AGPS_SUPL_MODE_MSA) != 0) { Loading Loading
core/java/android/provider/Settings.java +42 −0 Original line number Diff line number Diff line Loading @@ -3060,6 +3060,12 @@ public final class Settings { MOVED_TO_GLOBAL = new HashSet<String>(); MOVED_TO_GLOBAL.add(Settings.Global.ADB_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_SUPL_HOST); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_SUPL_PORT); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_POSITION_MODE); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_NETWORK); MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_RESET_TYPE); MOVED_TO_GLOBAL.add(Settings.Global.BLUETOOTH_ON); MOVED_TO_GLOBAL.add(Settings.Global.BUGREPORT_IN_POWER_MENU); MOVED_TO_GLOBAL.add(Settings.Global.CDMA_CELL_BROADCAST_SMS); Loading Loading @@ -5339,6 +5345,42 @@ public final class Settings { */ public static final String ASSISTED_GPS_ENABLED = "assisted_gps_enabled"; /** * List for assisted GPS should be configurable. * @hide */ public static final String ASSISTED_GPS_CONFIGURABLE_LIST = "assisted_gps_configurable_list"; /** * Host for assisted GPS supl * @hide */ public static final String ASSISTED_GPS_SUPL_HOST = "assisted_gps_supl_host"; /** * Port for assisted GPS supl * @hide */ public static final String ASSISTED_GPS_SUPL_PORT = "assisted_gps_supl_port"; /** * Position mode for assisted GPS * @hide */ public static final String ASSISTED_GPS_POSITION_MODE = "assisted_gps_position_mode"; /** * Network preference for assisted GPS * @hide */ public static final String ASSISTED_GPS_NETWORK = "assisted_gps_network"; /** * Reset type for assisted GPS * @hide */ public static final String ASSISTED_GPS_RESET_TYPE = "assisted_gps_reset_type"; /** * Whether bluetooth is enabled/disabled * 0=disabled. 1=enabled. Loading
packages/SettingsProvider/res/values/defaults.xml +1 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ --> <string name="def_location_providers_allowed" translatable="false">gps</string> <bool name="assisted_gps_enabled">true</bool> <string name="assisted_gps_configurable_list" translatable="false"></string> <bool name="def_netstats_enabled">true</bool> <bool name="def_usb_mass_storage_enabled">true</bool> <bool name="def_wifi_on">false</bool> Loading
packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +17 −0 Original line number Diff line number Diff line Loading @@ -2440,6 +2440,23 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED, R.bool.assisted_gps_enabled); loadStringSetting(stmt, Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST, R.string.assisted_gps_configurable_list); String[] gpsConfigValues = mContext.getResources().getStringArray( com.android.internal.R.array.config_gpsParameters); for (String item : gpsConfigValues) { String[] split = item.split("="); if (split.length == 2) { String name = split[0].trim().toUpperCase(); String value = split[1]; if (name.equals("SUPL_HOST")) loadSetting(stmt, Settings.Global.ASSISTED_GPS_SUPL_HOST, value); else if (name.equals("SUPL_PORT")) loadSetting(stmt, Settings.Global.ASSISTED_GPS_SUPL_PORT, value); } } loadBooleanSetting(stmt, Settings.Global.AUTO_TIME, R.bool.def_auto_time); // Sync time to NITZ Loading
services/core/java/com/android/server/location/GpsLocationProvider.java +134 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -73,6 +74,7 @@ import android.provider.Settings; import android.provider.Telephony.Carriers; import android.provider.Telephony.Sms.Intents; import android.telephony.SmsMessage; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; import android.text.TextUtils; Loading @@ -91,7 +93,9 @@ import java.net.UnknownHostException; import java.util.Date; import java.util.Map.Entry; import java.util.Properties; import java.util.Observable; import java.util.Observer; import java.util.Vector; import libcore.io.IoUtils; /** Loading Loading @@ -229,6 +233,11 @@ public class GpsLocationProvider implements LocationProviderInterface { private static final int AGPS_SETID_TYPE_IMSI = 1; private static final int AGPS_SETID_TYPE_MSISDN = 2; // agps start mode private static final int AGPS_START_MODE_COLD = 0; private static final int AGPS_START_MODE_WARM = 1; private static final int AGPS_START_MODE_HOT = 2; private static final String PROPERTIES_FILE_PREFIX = "/etc/gps"; private static final String PROPERTIES_FILE_SUFFIX = ".conf"; private static final String DEFAULT_PROPERTIES_FILE = PROPERTIES_FILE_PREFIX + PROPERTIES_FILE_SUFFIX; Loading Loading @@ -344,6 +353,8 @@ public class GpsLocationProvider implements LocationProviderInterface { private int mPositionMode; private boolean mAGPSConfigDb = false; // Current request from underlying location clients. private ProviderRequest mProviderRequest = null; // Current list of underlying location clients. Loading Loading @@ -578,6 +589,9 @@ public class GpsLocationProvider implements LocationProviderInterface { if (!isPropertiesLoadedFromFile) { loadPropertiesFromFile(DEFAULT_PROPERTIES_FILE, properties); } // Store GPS configuration to Settings Database and then reload it mAGPSConfigDb = testMccMncConfigurable(context); loadPropertiesFromSettingsDb(context, properties); Log.d(TAG, "GPS properties reloaded, size = " + properties.size()); // TODO: we should get rid of C2K specific setting. Loading Loading @@ -649,6 +663,92 @@ public class GpsLocationProvider implements LocationProviderInterface { return true; } private void addSettingDatabaseObserver(Context context) { Uri agpsSuplHostUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_SUPL_HOST); Uri agpsSuplPortUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_SUPL_PORT); Uri agpsPositionModeUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_POSITION_MODE); Uri agpsResetTypeUri = Settings.Global.getUriFor(Settings.Global.ASSISTED_GPS_RESET_TYPE); ContentObserver observer = new ContentObserver(mHandler) { public void onChange(boolean bSelfChanged) { handleAgpsUpdate(); } }; ContentObserver observerForResetType = new ContentObserver(mHandler) { public void onChange(boolean bSelfChanged) { handleAgpsReset(); } }; context.getContentResolver().registerContentObserver(agpsSuplHostUri, true, observer); context.getContentResolver().registerContentObserver(agpsSuplPortUri, true, observer); context.getContentResolver().registerContentObserver(agpsPositionModeUri, true, observer); context.getContentResolver().registerContentObserver(agpsResetTypeUri, true, observerForResetType); } /** * Test whether current mcc+mnc is in the configurable list */ private boolean testMccMncConfigurable(Context context) { TelephonyManager phone = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int phoneCnt = phone.getPhoneCount(); Vector<String> mccMnc = new Vector<String>(); for(int i = 0;i<phoneCnt;++i) { long[] subIds = SubscriptionManager.getSubId(i); if (subIds != null && subIds.length > 0) { mccMnc.add(phone.getNetworkOperator(subIds[0])); } } if (mccMnc.size() > 0) { ContentResolver objContentResolver = context.getContentResolver(); String configurable_list = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_CONFIGURABLE_LIST); if (!TextUtils.isEmpty(configurable_list)) { String[] list = configurable_list.split(","); for (String item:list) { if(mccMnc.contains(item)) return true; } } } return false; } /** * When boot and sim card changes, it will load new cfg to properties */ private void loadPropertiesFromSettingsDb(Context context, Properties properties) { if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb configurable = " + mAGPSConfigDb); if (mAGPSConfigDb) { ContentResolver objContentResolver = context.getContentResolver(); String mode = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_POSITION_MODE); if(!TextUtils.isEmpty(mode)) { try { if (mode.equals("MSB")) { properties.setProperty("SUPL_MODE", Integer.toString(AGPS_SUPL_MODE_MSB)); } else if (mode.equals("MSA")) { properties.setProperty("SUPL_MODE", Integer.toString(AGPS_SUPL_MODE_MSA)); } if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb agps_type = " + mode); } catch (Exception e) { Log.e(TAG, "Fail to set supl_mode for " + e); } } String suplAddr = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_SUPL_HOST); String suplPort = Settings.Global.getString(objContentResolver, Settings.Global.ASSISTED_GPS_SUPL_PORT); if (!TextUtils.isEmpty(suplAddr) && !TextUtils.isEmpty(suplPort)) { properties.setProperty("SUPL_HOST", suplAddr); properties.setProperty("SUPL_PORT", suplPort); if (DEBUG) Log.d(TAG, "loadPropertiesFromSettingsDb SUPL = " + suplAddr + ":" + suplPort); } } } public GpsLocationProvider(Context context, ILocationManager ilocationManager, Looper looper) { mContext = context; Loading Loading @@ -712,6 +812,8 @@ public class GpsLocationProvider implements LocationProviderInterface { mHandler.getLooper()); } }); // Add Observer for AGPS database change addSettingDatabaseObserver(context); } private void listenForBroadcasts() { Loading Loading @@ -930,6 +1032,29 @@ public class GpsLocationProvider implements LocationProviderInterface { } } private void handleAgpsUpdate() { loadPropertiesFromSettingsDb(mContext,mProperties); setSuplHostPort(mProperties.getProperty("SUPL_HOST"), mProperties.getProperty("SUPL_PORT")); } private void handleAgpsReset() { ContentResolver objContentResolver = mContext.getContentResolver(); try { int startMode = Settings.Global.getInt(objContentResolver, Settings.Global.ASSISTED_GPS_RESET_TYPE, AGPS_START_MODE_HOT); Bundle bundle = new Bundle(); if (startMode == AGPS_START_MODE_COLD) { bundle.putBoolean("all", true); } else if (startMode == AGPS_START_MODE_WARM) { bundle.putBoolean("ephemeris", true); } sendExtraCommand("delete_aiding_data", bundle); } catch (Exception ex) { Log.e(TAG, "handleAgpsReset Failed!"); } } /** * Enables this provider. When enabled, calls to getStatus() * must be handled. Hardware may be started up Loading Loading @@ -984,6 +1109,14 @@ public class GpsLocationProvider implements LocationProviderInterface { return GPS_POSITION_MODE_STANDALONE; } } String prefAGpsNetworkType = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.ASSISTED_GPS_NETWORK); if (prefAGpsNetworkType != null && prefAGpsNetworkType.equals("HOME")) { TelephonyManager tm = (TelephonyManager) mContext .getSystemService(Context.TELEPHONY_SERVICE); if (tm.isNetworkRoaming()) return GPS_POSITION_MODE_STANDALONE; } if (singleShot && hasCapability(GPS_CAPABILITY_MSA) && (suplMode & AGPS_SUPL_MODE_MSA) != 0) { Loading