Added automatic detection of driving region

This commit is contained in:
Alexey Kulish 2017-03-15 17:04:39 +03:00
parent 7dd562521f
commit 61b47f538c
10 changed files with 206 additions and 34 deletions

View file

@ -370,6 +370,8 @@ public class OsmandRegions {
sr.log = false;
if (reader != null) {
reader.searchMapIndex(sr);
} else {
throw new IOException("Reader == null");
}
return result;
}
@ -689,16 +691,16 @@ public class OsmandRegions {
}
}
public BinaryMapDataObject findBinaryMapDataObject(LatLon latLon) {
public BinaryMapDataObject findBinaryMapDataObject(LatLon latLon) throws IOException {
int point31x = MapUtils.get31TileNumberX(latLon.getLongitude());
int point31y = MapUtils.get31TileNumberY(latLon.getLatitude());
BinaryMapDataObject res = null;
List<BinaryMapDataObject> mapDataObjects = null;
List<BinaryMapDataObject> mapDataObjects;
try {
mapDataObjects = queryBbox(point31x, point31x, point31y, point31y);
} catch (IOException e) {
e.printStackTrace();
throw new IOException("Error while calling queryBbox");
}
if (mapDataObjects != null) {

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:orientation="vertical">
<View
android:id="@+id/topDivider"
android:background="?attr/dashboard_divider"
android:layout_height="1dp"
android:layout_width="wrap_content"
android:visibility="gone"/>
<android.support.v7.widget.AppCompatCheckedTextView
android:id="@+id/text1"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:paddingLeft="26dp"
android:paddingRight="@dimen/list_content_padding"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_list_text_size"/>
<TextView
android:id="@+id/description"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingLeft="26dp"
android:paddingRight="48dp"
android:paddingBottom="6dp"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
android:visibility="gone"/>
<View
android:id="@+id/bottomDivider"
android:background="?attr/dashboard_divider"
android:layout_height="1dp"
android:layout_marginTop="@dimen/list_header_padding"
android:layout_width="wrap_content"
android:visibility="gone"/>
</LinearLayout>

View file

@ -9,6 +9,8 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
<string name="right_side_navigation">Right-hand driving</string>
<string name="driving_region_automatic">Automatic</string>
<string name="do_not_send_anonymous_app_usage">Do not send anonymous app usage</string>
<string name="do_not_send_anonymous_app_usage_desc">It sends general information about screen used during session. We do not collect any geolocation or user input related data.</string>
<string name="do_not_show_startup_messages">Do not show messages at startup</string>

View file

@ -5,7 +5,7 @@
<ListPreference android:key="map_screen_orientation" android:title="@string/map_screen_orientation" android:summary="@string/map_screen_orientation_descr"></ListPreference>
<PreferenceCategory android:title="@string/localization_pref_title" android:key="localization">
<ListPreference android:key="preferred_locale" android:title="@string/preferred_locale" android:summary="@string/preferred_locale_descr"></ListPreference>
<ListPreference android:key="default_driving_region" android:title="@string/driving_region" android:summary="@string/driving_region_descr"></ListPreference>
<Preference android:key="default_driving_region" android:title="@string/driving_region" android:summary="@string/driving_region_descr"></Preference>
<!-- ListPreference android:key="map_preferred_locale" android:title="@string/map_preferred_locale" android:summary="@string/map_preferred_locale_descr"></ListPreference -->
<ListPreference android:key="default_metric_system" android:title="@string/unit_of_length" android:summary="@string/unit_of_length_descr"></ListPreference>
<ListPreference android:key="coordinates_format" android:title="@string/coords_format" android:summary="@string/coords_format_descr"></ListPreference>

View file

@ -29,6 +29,7 @@ import net.osmand.PlatformUtil;
import net.osmand.access.AccessibilityPlugin;
import net.osmand.data.LatLon;
import net.osmand.map.OsmandRegions;
import net.osmand.map.WorldRegion;
import net.osmand.osm.MapPoiTypes;
import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.access.AccessibilityMode;
@ -791,6 +792,27 @@ public class OsmandApplication extends MultiDexApplication {
return l;
}
public void setupDrivingRegion(WorldRegion reg) {
OsmandSettings.DrivingRegion drg = null;
WorldRegion.RegionParams params = reg.getParams();
boolean americanSigns = "american".equals(params.getRegionRoadSigns());
boolean leftHand = "yes".equals(params.getRegionLeftHandDriving());
OsmandSettings.MetricsConstants mc1 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_FEET : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
OsmandSettings.MetricsConstants mc2 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_METERS : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
for (OsmandSettings.DrivingRegion r : OsmandSettings.DrivingRegion.values()) {
if (r.americanSigns == americanSigns && r.leftHandDriving == leftHand &&
(r.defMetrics == mc1 || r.defMetrics == mc2)) {
drg = r;
break;
}
}
if (drg != null) {
osmandSettings.DRIVING_REGION.set(drg);
}
}
public void logEvent(Activity ctx, String event) {
try {
if (Version.isGooglePlayEnabled(this) && Version.isFreeVersion(this)

View file

@ -738,6 +738,7 @@ public class OsmandSettings {
public final OsmandPreference<Boolean> FIRST_MAP_IS_DOWNLOADED = new BooleanPreference(
"first_map_is_downloaded", false);
public final CommonPreference<Boolean> DRIVING_REGION_AUTOMATIC = new BooleanPreference("driving_region_automatic", true).makeGlobal().cache();
public final OsmandPreference<DrivingRegion> DRIVING_REGION = new EnumIntPreference<DrivingRegion>(
"default_driving_region", DrivingRegion.EUROPE_ASIA, DrivingRegion.values()) {
protected boolean setValue(Object prefs, DrivingRegion val) {
@ -3049,6 +3050,11 @@ public class OsmandSettings {
this.americanSigns = americanSigns;
}
public String getDescription(Context ctx) {
return ctx.getString(leftHandDriving ? R.string.left_side_navigation : R.string.right_side_navigation) +
", " +
defMetrics.toHumanString(ctx).toLowerCase();
}
}
}

View file

@ -20,10 +20,17 @@ import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatCheckedTextView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import net.osmand.IProgress;
@ -50,6 +57,7 @@ import net.osmand.render.RenderingRulesStorage;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@ -60,7 +68,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
public static final String MORE_VALUE = "MORE_VALUE";
private Preference applicationDir;
private ListPreference applicationModePreference;
private ListPreference drivingRegionPreference;
private Preference drivingRegionPreference;
private ChooseAppDirFragment chooseAppDirFragment;
private boolean permissionRequested;
private boolean permissionGranted;
@ -93,15 +101,15 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
new String[]{getString(R.string.map_orientation_portrait), getString(R.string.map_orientation_landscape), getString(R.string.map_orientation_default)},
new Integer[]{ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED});
drivingRegionPreference = screen.findPreference(settings.DRIVING_REGION.getId());
addLocalPrefs((PreferenceGroup) screen.findPreference("localization"));
addVoicePrefs((PreferenceGroup) screen.findPreference("voice"));
addProxyPrefs((PreferenceGroup) screen.findPreference("proxy"));
addMiscPreferences((PreferenceGroup) screen.findPreference("misc"));
applicationModePreference = (ListPreference) screen.findPreference(settings.APPLICATION_MODE.getId());
applicationModePreference.setOnPreferenceChangeListener(this);
drivingRegionPreference = (ListPreference) screen.findPreference(settings.DRIVING_REGION.getId());
}
@ -134,16 +142,80 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
private void addLocalPrefs(PreferenceGroup screen) {
drivingRegionPreference.setTitle(R.string.driving_region);
drivingRegionPreference.setSummary(R.string.driving_region_descr);
drivingRegionPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final AlertDialog.Builder b = new AlertDialog.Builder(SettingsGeneralActivity.this);
b.setTitle(getString(R.string.driving_region));
final List<DrivingRegion> drs = new ArrayList<>();
drs.add(null);
drs.addAll(Arrays.asList(DrivingRegion.values()));
int sel = -1;
DrivingRegion selectedDrivingRegion = settings.DRIVING_REGION.get();
if (settings.DRIVING_REGION_AUTOMATIC.get()) {
sel = 0;
}
for (int i = 1; i < drs.size(); i++) {
if (sel == -1 && drs.get(i) == selectedDrivingRegion) {
sel = i;
break;
}
}
final int selected = sel;
final ArrayAdapter<DrivingRegion> singleChoiceAdapter =
new ArrayAdapter<DrivingRegion>(SettingsGeneralActivity.this, R.layout.single_choice_description_item, R.id.text1, drs) {
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater inflater = SettingsGeneralActivity.this.getLayoutInflater();
v = inflater.inflate(R.layout.single_choice_description_item, parent, false);
}
DrivingRegion item = getItem(position);
AppCompatCheckedTextView title = (AppCompatCheckedTextView) v.findViewById(R.id.text1);
TextView desc = (TextView) v.findViewById(R.id.description);
if (item != null) {
title.setText(getString(item.name));
desc.setVisibility(View.VISIBLE);
desc.setText(item.getDescription(v.getContext()));
} else {
title.setText(getString(R.string.driving_region_automatic));
desc.setVisibility(View.GONE);
}
title.setChecked(position == selected);
return v;
}
};
b.setAdapter(singleChoiceAdapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (drs.get(which) == null) {
settings.DRIVING_REGION_AUTOMATIC.set(true);
MapActivity.getSingleMapViewTrackingUtilities().resetDrivingRegionUpdate();
} else {
settings.DRIVING_REGION_AUTOMATIC.set(false);
settings.DRIVING_REGION.set(drs.get(which));
}
updateAllSettings();
}
});
b.setNegativeButton(R.string.shared_string_cancel, null);
b.show();
return true;
}
});
String[] entries;
String[] entrieValues;
DrivingRegion[] drs = DrivingRegion.values();
entries = new String[drs.length];
for (int i = 0; i < entries.length; i++) {
entries[i] = getString(drs[i].name); // + " (" + drs[i].defMetrics.toHumanString(this) +")" ;
}
registerListPreference(settings.DRIVING_REGION, screen, entries, drs);
MetricsConstants[] mvls = MetricsConstants.values();
entries = new String[mvls.length];
for (int i = 0; i < entries.length; i++) {
@ -458,7 +530,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
applicationModePreference.setTitle(getString(R.string.settings_preset) + " ["
+ settings.APPLICATION_MODE.get().toHumanString(getMyApplication()) + "]");
drivingRegionPreference.setTitle(getString(R.string.driving_region) + " ["
+ getString(settings.DRIVING_REGION.get().name) + "]");
+ getString(settings.DRIVING_REGION_AUTOMATIC.get() ? R.string.driving_region_automatic : settings.DRIVING_REGION.get().name) + "]");
}
@Override

View file

@ -6,8 +6,11 @@ import android.view.WindowManager;
import net.osmand.Location;
import net.osmand.StateChangedListener;
import net.osmand.ValueHolder;
import net.osmand.binary.BinaryMapDataObject;
import net.osmand.data.LatLon;
import net.osmand.data.RotatedTileBox;
import net.osmand.map.IMapLocationListener;
import net.osmand.map.WorldRegion;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener;
import net.osmand.plus.OsmAndConstants;
@ -17,6 +20,7 @@ import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.AutoZoomMap;
import net.osmand.plus.OsmandSettings.DrivingRegion;
import net.osmand.plus.R;
import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
@ -26,6 +30,8 @@ import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.util.MapUtils;
import java.io.IOException;
public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLocationListener,
OsmAndCompassListener, IRouteInformationListener, MapMarkerChangedListener {
private static final int AUTO_FOLLOW_MSG_ID = OsmAndConstants.UI_HANDLER_LOCATION_SERVICE + 4;
@ -46,6 +52,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
private boolean showRouteFinishDialog = false;
private Location myLocation;
private Float heading;
private boolean drivingRegionUpdated = false;
public MapViewTrackingUtilities(OsmandApplication app){
this.app = app;
@ -58,6 +65,10 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
app.getRoutingHelper().addListener(this);
}
public void resetDrivingRegionUpdate() {
drivingRegionUpdated = false;
}
private void addTargetPointListener(OsmandApplication app) {
app.getTargetPointsHelper().addListener(new StateChangedListener<Void>() {
@ -141,6 +152,23 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
showViewAngle = false;
if (location != null) {
locationProvider = location.getProvider();
if (settings.DRIVING_REGION_AUTOMATIC.get() && !drivingRegionUpdated) {
try {
BinaryMapDataObject o = app.getRegions().findBinaryMapDataObject(
new LatLon(location.getLatitude(), location.getLongitude()));
if (o != null) {
String fullName = app.getRegions().getFullName(o);
WorldRegion worldRegion = app.getRegions().getRegionData(fullName);
if (worldRegion != null) {
app.setupDrivingRegion(worldRegion);
}
}
drivingRegionUpdated = true;
} catch (IOException e) {
// ignore
}
}
}
if (mapView != null) {
RotatedTileBox tb = mapView.getCurrentRotatedTileBox();

View file

@ -20,15 +20,14 @@ import android.support.v7.app.NotificationCompat;
import android.support.v7.app.NotificationCompat.Builder;
import android.view.View;
import android.widget.Toast;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.map.WorldRegion;
import net.osmand.map.WorldRegion.RegionParams;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings.DrivingRegion;
import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.OsmandSettings.OsmandPreference;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.base.BasicProgressAsyncTask;
@ -160,21 +159,9 @@ public class DownloadIndexesThread {
return;
}
app.getSettings().FIRST_MAP_IS_DOWNLOADED.set(true);
DrivingRegion drg = null;
RegionParams params = reg.getParams();
boolean americanSigns = "american".equals(params.getRegionRoadSigns());
boolean leftHand = "yes".equals(params.getRegionLeftHandDriving());
MetricsConstants mc = "miles".equals(params.getRegionMetric()) ?
MetricsConstants.MILES_AND_FEET : MetricsConstants.KILOMETERS_AND_METERS;
for (DrivingRegion r : DrivingRegion.values()) {
if (r.americanSigns == americanSigns && r.leftHandDriving == leftHand &&
r.defMetrics == mc) {
drg = r;
break;
}
}
if (drg != null) {
app.getSettings().DRIVING_REGION.set(drg);
if (!app.getSettings().DRIVING_REGION_AUTOMATIC.get()) {
app.setupDrivingRegion(reg);
}
String lang = params.getRegionLang();
if (lang != null) {

View file

@ -394,7 +394,12 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
@Override
protected IndexItem doInBackground(Void... params) {
Amenity amenity = cityItem.getAmenity();
BinaryMapDataObject o = osmandRegions.findBinaryMapDataObject(amenity.getLocation());
BinaryMapDataObject o = null;
try {
o = osmandRegions.findBinaryMapDataObject(amenity.getLocation());
} catch (IOException e) {
// ignore
}
if (o != null) {
String selectedFullName = osmandRegions.getFullName(o);
WorldRegion downloadRegion = osmandRegions.getRegionData(selectedFullName);