diff --git a/OsmAnd/res/drawable/textlines.xml b/OsmAnd/res/drawable/textlines.xml
new file mode 100644
index 0000000000..93aa4255ab
--- /dev/null
+++ b/OsmAnd/res/drawable/textlines.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/tips_and_tricks.xml b/OsmAnd/res/layout/tips_and_tricks.xml
new file mode 100644
index 0000000000..9923bc240a
--- /dev/null
+++ b/OsmAnd/res/layout/tips_and_tricks.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index 0c0b131f5b..ec86b52ce3 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -1,5 +1,34 @@
+ Источник карты
+ Наиболее быстрый способ изменить источник карты и слои \'Меню\'->\'Слои\'.
+\n\tПод \'Карта источник...\' вы можете выбрать из предопределенных типов или собственных, созданных OsmAndMapCreator на PC.
+\n\tOsmAnd поддерживает custom источники.
+ Режим работы
+ OsmAnd поддерживает различные типовые режимы отображения карты.
+\n\tВы можете изменить режим в \'Меню\'->\'Настройки\'->\'Режим работы\', при этом меняется большинство настроек карты.
+ Навигация
+ Чтобы использовать навигацию, необходимо выбрать точку назначения. После этого нажмите \'Меню\'->\'Навигация\' на карте и выберите тип.
+ Выбор точки назначения
+ Вы можете выбрать точку назначения в контекстном меню карты \'Идти к\' или в поиске.
+\n\tВы также можете выбрать избранную точку долгим нажатием в \'Избранных\'.
+ Поиск
+ Вы можете искать объект на карте, просто разглядывая карту, используя адресный, координатный, POI поиск или выбрать предопределенную избранную точку.
+\n\tНажатие поиск на карте открывает поиск. После поиска имеются 2 варианта : \'Идти к\' или \'Показать на карте\'.
+ Контесктное меню карты
+ \tКонтестное меню карты доступно по долгому нажатию на карту или при нажатии кнопки трекбола.
+\n\tПосле этого появится окно с координатами, при нажатии на него откроется меню, при долгом нажатии - окно пропадет. Также контекстное меню доступно по кнопке Меню на карте.
+\n\tДействия в этом меню зависят от текущей выбранной точки (центр карты).
+ Точка назначения
+ \tТочкой назначения называется красная точка, отмеченная на карте.
+\n\tВы всегда можете видеть расстояние до нее от видимой точки и направление (красный треугольник). Чтобы выбрать точку назначения используйте \'Идти к\' функцию.
+\n\tЭто кнопка доступна во всех поисках, в контекстном меню карты и при долгом нажатии на избранных, POI.
+Эту точку можно использовать, чтобы измерять расстояние и для простой навигации.
+ Советы по использованию
+ \tOsmAnd - навигационное приложение с большим количеством функций.
+\n\tЧтобы использовать его как можно лучше, следуйте советам по ссылке вверху меню.
+ Следующий
+ ПредыдущийИзменить единицы измерения длины и скоростиЕдиницы измеренияМили/футы
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index fcf6397cc5..0319d00e1c 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -1,5 +1,35 @@
+ Map source
+ The fastest way to change map source and layers is pressing \'Menu\'->\'Layers\' on map.
+\n\tUnder \'Map source...\' you can choose predefined tile sources or manually created using OsmAndMapCreator on PC.
+\n\tOsmAnd supports custom sources.
+ Application mode
+ OsmAnd supports different modes representing map for typical situations.
+\n\tYou can change mode in \'Menu\'->\'Settings\'->\'Application mode\'.
+ Navigation
+ To enable navigation you should select destination point first. After that press \'Menu\'->\'Directions\' on map and select navigation type.
+ Select destination point
+ You can select destination point in map context menu \'Navigate to\' or in search activities.
+\n\tYou can also navigate to favorite point by long pressing in \'Favorites\'.
+ Search activities
+ You can search place directly on map view or by address, by location, as poi or as predefined favorite.
+\n\tPressing \'Search\' on map opens search activities. There you have 2 options : \'Navigate to\' or \'Show on map\'.
+ Map context menu
+ \tMap context menu is available by long touching on map or by pressing track ball button.
+\n\tAfter touching box with coordinates appears, to open context menu dialog - tap on it, to hide box - long press on it. Also map context menu is available under \'Menu\' button on map.
+\n\tMap context menu consists of actions that use location as input.
+ Destination point
+ \tKey concept of OsmAnd is destination point that is marked as red point on map.
+\n\tYou can always see the distance to it and the direction (red triangle) on map. To mark any point as destination you should choose \'Navigate to\' point.
+\n\tThat button is available on all search activities, in context menu of map and on long press for map items.
+Destination point is widely used to measure distance and to straight forward navigation.
+ Tips and tricks
+ \tOsmAnd is navigation application that has variety of features.
+\n\tTo better use them you can follow by tips and tricks available as link on main menu.
+ Next
+ Previous
+
Change unit of length and speedUnit of lengthMiles/foots
@@ -411,6 +441,8 @@
FavoritesSearch#FF9030
+#d7d7d7
+#000000Search#FFFFFF#FF0000
diff --git a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java
index 1b2094111e..a4ad221ad6 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java
@@ -10,6 +10,7 @@ import net.osmand.plus.ResourceManager;
import net.osmand.plus.activities.search.SearchActivity;
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
@@ -36,6 +37,7 @@ import android.widget.TextView;
public class MainMenuActivity extends Activity {
private static final String FIRST_TIME_APP_RUN = "FIRST_TIME_APP_RUN"; //$NON-NLS-1$
+ private static final String TIPS_SHOW = "TIPS_SHOW"; //$NON-NLS-1$
private static final String EXCEPTION_FILE_SIZE = ResourceManager.APP_DIR + "exception.log"; //$NON-NLS-1$
private View showMap;
@@ -120,15 +122,15 @@ public class MainMenuActivity extends Activity {
rightview = (View) findViewById(R.id.SearchButton);
rightview.startAnimation(getAnimation(1, 0));
- String textVersion = Version.APP_VERSION+ " "+ Version.APP_DESCRIPTION;
+ String textVersion = Version.APP_VERSION + " " + Version.APP_DESCRIPTION;
final TextView textVersionView = (TextView) findViewById(R.id.TextVersion);
textVersionView.setText(textVersion);
SharedPreferences prefs = OsmandSettings.getPrefs(this);
// only one commit should be with contribution version flag
// prefs.edit().putBoolean(CONTRIBUTION_VERSION_FLAG, true).commit();
+ final TextView appName = (TextView) findViewById(R.id.AppName);
if (prefs.contains(CONTRIBUTION_VERSION_FLAG)) {
- final TextView appName = (TextView) findViewById(R.id.AppName);
appName.setText("OsmAnd!");
SpannableString content = new SpannableString(textVersion);
content.setSpan(new ClickableSpan() {
@@ -142,6 +144,19 @@ public class MainMenuActivity extends Activity {
textVersionView.setText(content);
textVersionView.setMovementMethod(LinkMovementMethod.getInstance());
}
+ SpannableString appLink = new SpannableString(appName.getText());
+ appLink.setSpan(new ClickableSpan() {
+
+ @Override
+ public void onClick(View widget) {
+ TipsAndTricksActivity activity = new TipsAndTricksActivity(MainMenuActivity.this);
+ Dialog dlg = activity.getDialogToShowTips(false);
+ dlg.show();
+ }
+ }, appLink.length() - 1, appLink.length(), 0);
+ appName.setText(appLink);
+ appName.setMovementMethod(LinkMovementMethod.getInstance());
+
showMap = findViewById(R.id.MapButton);
@@ -225,6 +240,16 @@ public class MainMenuActivity extends Activity {
builder.setNegativeButton(R.string.first_time_continue, null);
builder.show();
}
+ } else {
+ int i = pref.getInt(TIPS_SHOW, 0);
+ if (i < 7){
+ pref.edit().putInt(TIPS_SHOW, ++i).commit();
+ if(i == 1 || i == 5){
+ TipsAndTricksActivity activity = new TipsAndTricksActivity(this);
+ Dialog dlg = activity.getDialogToShowTips(true);
+ dlg.show();
+ }
+ }
}
checkPreviousRunsForExceptions(firstTime);
}
diff --git a/OsmAnd/src/net/osmand/plus/activities/TipsAndTricksActivity.java b/OsmAnd/src/net/osmand/plus/activities/TipsAndTricksActivity.java
new file mode 100644
index 0000000000..e2d593780d
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/activities/TipsAndTricksActivity.java
@@ -0,0 +1,164 @@
+package net.osmand.plus.activities;
+
+import gnu.trove.list.array.TIntArrayList;
+
+import java.util.Arrays;
+
+import net.osmand.plus.R;
+import android.app.Dialog;
+import android.content.Context;
+import android.text.method.ScrollingMovementMethod;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+public class TipsAndTricksActivity {
+ private int[][] tipNamesAndDescriptions = new int[][] {
+ {R.string.tip_desctination_point,R.string.tip_desctination_point_t},
+ {R.string.tip_map_context_menu,R.string.tip_map_context_menu_t},
+ {R.string.tip_search,R.string.tip_search_t},
+ {R.string.tip_select_destination_point,R.string.tip_select_destination_point_t},
+ {R.string.tip_navigation,R.string.tip_navigation_t},
+ {R.string.tip_app_mode,R.string.tip_app_mode_t},
+ {R.string.tip_map_switch,R.string.tip_map_switch_t},
+ };
+
+ private final Context ctx;
+ private int numberOfShownTips = 0;
+ private boolean[] shownTips = new boolean[tipNamesAndDescriptions.length];
+
+ public TipsAndTricksActivity(Context ctx){
+ this.ctx = ctx;
+ }
+
+ public boolean areAllTipsShown(){
+ return numberOfShownTips == tipNamesAndDescriptions.length;
+ }
+
+ public int getNumberOfTips(){
+ return tipNamesAndDescriptions.length;
+ }
+
+ public void markTipAsShown(int index) {
+ if (!shownTips[index]) {
+ shownTips[index] = true;
+ numberOfShownTips++;
+ }
+ }
+
+ public int getNextRandomTipToShow() {
+ int l = getNumberOfTips();
+ if (l != 0) {
+ int mod = (int) (System.currentTimeMillis() % l);
+ return getNextTipToShow(mod);
+ }
+ return -1;
+ }
+
+ public void clearShownInfo(){
+ Arrays.fill(shownTips, false);
+ numberOfShownTips = 0;
+ }
+
+ public int getNextTipToShow(int suggest) {
+ int l = getNumberOfTips();
+ if(suggest >= l || suggest < 0){
+ suggest = 0;
+ }
+ if (l > 0) {
+ int it = suggest;
+ do {
+ if (!shownTips[it]) {
+ markTipAsShown(it);
+ return it;
+ }
+ it++;
+ if (it == l) {
+ it = 0;
+ }
+ } while (it != suggest);
+
+ clearShownInfo();
+ markTipAsShown(suggest);
+ return suggest;
+ }
+ return -1;
+ }
+
+ public String getTipName(int ind){
+ return ctx.getString(tipNamesAndDescriptions[ind][0]);
+ }
+
+ public String getTipDescription(int ind){
+ return ctx.getString(tipNamesAndDescriptions[ind][1]);
+ }
+
+ public Dialog getDialogToShowTips(boolean showFirst){
+
+ final Dialog dlg = new Dialog(ctx);
+ dlg.setContentView(R.layout.tips_and_tricks);
+ final TextView tipDescription = (TextView) dlg.findViewById(R.id.TipDescription);
+ tipDescription.setMovementMethod(ScrollingMovementMethod.getInstance());
+ int nextInd = 0;
+ final TIntArrayList toShow = new TIntArrayList();
+ final int[] historyInd = new int[1];
+ if(showFirst){
+ dlg.setTitle(R.string.tip_initial);
+ tipDescription.setText(R.string.tip_initial_t);
+ historyInd[0] = -1;
+ } else {
+ nextInd = getNextRandomTipToShow();
+ dlg.setTitle(getTipName(nextInd));
+ tipDescription.setText(getTipDescription(nextInd));
+ toShow.add(nextInd);
+ historyInd[0] = 0;
+ }
+
+ final Button nextButton = ((Button)dlg.findViewById(R.id.NextButton));
+ final Button prevButton = (Button)dlg.findViewById(R.id.PreviousButton);
+
+ prevButton.setEnabled(historyInd[0] > 0);
+ nextButton.setEnabled(historyInd[0] < getNumberOfTips() - 1);
+
+ nextButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+ if(historyInd[0] == toShow.size() - 1){
+ int suggest = 0;
+ if(historyInd[0] >= 0) {
+ suggest = toShow.get(historyInd[0]) + 1;
+ }
+ toShow.add(getNextTipToShow(suggest));
+ }
+ historyInd[0] ++;
+ dlg.setTitle(getTipName(toShow.get(historyInd[0])));
+ tipDescription.setText(getTipDescription(toShow.get(historyInd[0])));
+
+ prevButton.setEnabled(historyInd[0] > 0);
+ nextButton.setEnabled(historyInd[0] < getNumberOfTips() - 1);
+ }
+ });
+
+ prevButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+ if(historyInd[0] > 0){
+ historyInd[0] --;
+ dlg.setTitle(getTipName(toShow.get(historyInd[0])));
+ tipDescription.setText(getTipDescription(toShow.get(historyInd[0])));
+ }
+ prevButton.setEnabled(historyInd[0] > 0);
+ nextButton.setEnabled(historyInd[0] < getNumberOfTips() - 1);
+ }
+ });
+
+ ((Button)dlg.findViewById(R.id.CloseButton)).setOnClickListener(new View.OnClickListener() {
+ public void onClick(View view) {
+ dlg.dismiss();
+ }
+ });
+ return dlg;
+ }
+
+
+}