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 speed Unit of length Miles/foots @@ -411,6 +441,8 @@ Favorites Search #FF9030 +#d7d7d7 +#000000 Search #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; + } + + +}