diff --git a/OsmAnd-java/src/net/osmand/util/OpeningHoursParser.java b/OsmAnd-java/src/net/osmand/util/OpeningHoursParser.java
index 7a2b31cc81..666ca30ec0 100644
--- a/OsmAnd-java/src/net/osmand/util/OpeningHoursParser.java
+++ b/OsmAnd-java/src/net/osmand/util/OpeningHoursParser.java
@@ -222,6 +222,34 @@ public class OpeningHoursParser {
return openFrom;
}
+ public String getClosedAtStr(Calendar cal) {
+ String closedAt = getClosedAtDayStr(cal);
+ if (Algorithms.isEmpty(closedAt)) {
+ closedAt = getClosedAtNextDayStr(cal);
+ }
+ return closedAt;
+ }
+
+ private String getClosedAtDayStr(Calendar cal) {
+ String closedAt = "";
+ for (OpeningHoursRule r : rules) {
+ if (r.containsDay(cal) && r.containsMonth(cal)) {
+ closedAt = r.getClosedAtStr(cal, false);
+ }
+ }
+ return closedAt;
+ }
+
+ private String getClosedAtNextDayStr(Calendar cal) {
+ String closedAt = "";
+ for (OpeningHoursRule r : rules) {
+ if (r.containsNextDay(cal) && r.containsMonth(cal)) {
+ closedAt = r.getClosedAtStr(cal, true);
+ }
+ }
+ return closedAt;
+ }
+
public String getCurrentRuleTime(Calendar cal) {
// make exception for overlapping times i.e.
// (1) Mo 14:00-16:00; Tu off
@@ -354,6 +382,14 @@ public class OpeningHoursParser {
*/
public boolean containsDay(Calendar cal);
+ /**
+ * Check if the next day after "cal" is part of this rule
+ *
+ * @param cal the time to check
+ * @return true if the next day is part of the rule
+ */
+ boolean containsNextDay(Calendar cal);
+
/**
* Check if the month of "cal" is part of this rule
*
@@ -381,6 +417,8 @@ public class OpeningHoursParser {
boolean isOpen24_7();
String getOpenedFromStr(Calendar cal, boolean checkPrevious);
+
+ String getClosedAtStr(Calendar cal, boolean checkNext);
}
/**
@@ -598,6 +636,16 @@ public class OpeningHoursParser {
return false;
}
+ @Override
+ public boolean containsNextDay(Calendar cal) {
+ int i = cal.get(Calendar.DAY_OF_WEEK);
+ int p = (i + 6) % 7;
+ if (days[p]) {
+ return true;
+ }
+ return false;
+ }
+
/**
* Check if the previous weekday of time "cal" is part of this rule
*
@@ -677,6 +725,14 @@ public class OpeningHoursParser {
return p;
}
+ private int getNextDay(int currentDay) {
+ int n = currentDay + 1;
+ if (n > 6) {
+ n -= 7;
+ }
+ return n;
+ }
+
private int getCurrentTimeInMinutes(Calendar cal) {
return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
}
@@ -804,23 +860,49 @@ public class OpeningHoursParser {
if (startTime < endTime || endTime == -1) {
if (days[d] && !checkPrevious) {
if (time - startTime <= 600 && (endTime == -1 || time <= endTime)) {
- int stHour = startTime / 60;
- int stTime = startTime - stHour * 60;
- formatTime(stHour, stTime, sb);
+ formatTime(startTime, sb);
break;
}
}
} else {
if (time >= startTime && days[d] && !checkPrevious) {
- int stHour = startTime / 60;
- int stTime = startTime - stHour * 60;
- formatTime(stHour, stTime, sb);
+ formatTime(startTime, sb);
break;
} else if (time < endTime && days[p] && checkPrevious) {
if (24 * 60 - endTime + time <= 600) {
- int stHour = startTime / 60;
- int stTime = startTime - stHour * 60;
- formatTime(stHour, stTime, sb);
+ formatTime(startTime, sb);
+ break;
+ }
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public String getClosedAtStr(Calendar cal, boolean checkNext) {
+ int limit = 300;
+ StringBuilder sb = new StringBuilder();
+ int d = getCurrentDay(cal);
+ int n = getNextDay(d);
+ int time = getCurrentTimeInMinutes(cal);
+ for (int i = 0; i < startTimes.size(); i++) {
+ int startTime = startTimes.get(i);
+ int endTime = endTimes.get(i);
+ if (startTime < endTime && endTime != -1) {
+ if (days[d] && !checkNext) {
+ if (time <= endTime && endTime - time <= limit ) {
+ formatTime(endTime, sb);
+ break;
+ }
+ }
+ } else {
+ if (time <= endTime && days[d] && !checkNext) {
+ formatTime(endTime, sb);
+ break;
+ } else if (time < endTime && days[n] && checkNext) {
+ if (endTime - time <= limit) {
+ formatTime(endTime, sb);
break;
}
}
@@ -1004,6 +1086,11 @@ public class OpeningHoursParser {
return false;
}
+ @Override
+ public boolean containsNextDay(Calendar cal) {
+ return false;
+ }
+
@Override
public boolean containsMonth(Calendar cal) {
return false;
@@ -1029,6 +1116,11 @@ public class OpeningHoursParser {
return "";
}
+ @Override
+ public String getClosedAtStr(Calendar cal, boolean checkNext) {
+ return "";
+ }
+
@Override
public String toString() {
return toRuleString();
@@ -1374,6 +1466,11 @@ public class OpeningHoursParser {
b.append(t);
}
+ private static void formatTime(int minutes, StringBuilder sb) {
+ int hour = minutes / 60;
+ int time = minutes - hour * 60;
+ formatTime(hour, time, sb);
+ }
/**
* test if the calculated opening hours are what you expect
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 0f819d4c24..69e904c7c3 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,7 @@
-->
Opened
Opened from
+ Will be closed at
Additional actions
\u2022 Detection of stop signs now considers driving direction\n\n
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
index 662da8c670..c0c6c1643d 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
@@ -1112,6 +1112,8 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
openingHoursStr = getString(R.string.shared_string_is_open_24_7);
} else if (!Algorithms.isEmpty(menu.getOpenFromStr())) {
openingHoursStr = getString(R.string.opened_from) + " " + menu.getOpenFromStr();
+ } else if (!Algorithms.isEmpty(menu.getClosedAtStr())) {
+ openingHoursStr = getString(R.string.will_be_closed_at) + " " + menu.getClosedAtStr();
}
openingHoursTextView.setText(openingHoursStr);
openingHoursView.setVisibility(View.VISIBLE);
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java
index 24e2c3d922..6d1d6c0a0d 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java
@@ -432,6 +432,10 @@ public abstract class MenuController extends BaseMenuController {
return "";
}
+ public String getClosedAtStr() {
+ return "";
+ }
+
public String getCommonTypeStr() {
return "";
}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuTitleController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuTitleController.java
index d12e2433ec..78365380b3 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuTitleController.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuTitleController.java
@@ -20,6 +20,7 @@ public abstract class MenuTitleController {
protected String streetStr = "";
protected boolean open24_7;
protected String openFromStr = "";
+ protected String closedAtStr = "";
private AddressLookupRequest addressLookupRequest;
@@ -108,8 +109,12 @@ public abstract class MenuTitleController {
return openFromStr;
}
+ public String getClosedAtStr() {
+ return closedAtStr;
+ }
+
public boolean isOpened() {
- if (isOpen24_7() || !Algorithms.isEmpty(getOpenFromStr())) {
+ if (isOpen24_7() || !Algorithms.isEmpty(getOpenFromStr()) || !Algorithms.isEmpty(getClosedAtStr())) {
return true;
} else {
return false;
@@ -211,6 +216,7 @@ public abstract class MenuTitleController {
if (menuController != null) {
open24_7 = menuController.isOpen24_7();
openFromStr = menuController.getOpenFromStr();
+ closedAtStr = menuController.getClosedAtStr();
}
}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java
index 3cb5bdc9e8..53b9bbbcde 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java
@@ -128,6 +128,11 @@ public class AmenityMenuController extends MenuController {
return getOpenFromStr(amenity);
}
+ @Override
+ public String getClosedAtStr() {
+ return getClosedAtStr(amenity);
+ }
+
public static String getTypeStr(Amenity amenity) {
PoiCategory pc = amenity.getType();
PoiType pt = pc.getPoiTypeByKeyName(amenity.getSubType());
@@ -166,6 +171,16 @@ public class AmenityMenuController extends MenuController {
}
}
+ public static String getClosedAtStr(Amenity amenity) {
+ OpeningHoursParser.OpeningHours openingHours = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours());
+ if (openingHours == null) {
+ return "";
+ } else {
+ Calendar cal = Calendar.getInstance();
+ return openingHours.getClosedAtStr(cal);
+ }
+ }
+
@Override
public String getCommonTypeStr() {
PoiCategory pc = amenity.getType();