Issue 415. Tips and tricks functionality
This commit is contained in:
parent
f86f5f86aa
commit
d31d02491b
6 changed files with 291 additions and 2 deletions
20
OsmAnd/res/drawable/textlines.xml
Normal file
20
OsmAnd/res/drawable/textlines.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item>
|
||||
<shape
|
||||
android:shape="rectangle">
|
||||
<stroke android:width="1dp" android:color="#FF000000" />
|
||||
<solid android:color="#FFDDDDDD" />
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item android:bottom="1dp">
|
||||
<shape
|
||||
android:shape="rectangle">
|
||||
<stroke android:width="1dp" android:color="#FFDDDDDD" />
|
||||
<solid android:color="#00000000" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</layer-list>
|
19
OsmAnd/res/layout/tips_and_tricks.xml
Normal file
19
OsmAnd/res/layout/tips_and_tricks.xml
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="fill_parent" android:orientation="vertical" android:background="@color/color_light_gray">
|
||||
|
||||
<TextView android:text="" android:id="@+id/TipDescription" android:layout_marginLeft="4dp" android:scrollbars="vertical"
|
||||
android:layout_width="fill_parent" android:layout_height="180dp" android:layout_marginRight="4dp"
|
||||
android:textColor="@color/color_black" android:textSize="18sp" android:gravity="fill_horizontal"
|
||||
android:background= "@drawable/textlines" />
|
||||
|
||||
<!-- <TextView android:text="@string/poi_dialog_other_tags_message" android:id="@+id/TextView" android:layout_marginLeft="5dp"
|
||||
android:layout_width="fill_parent" android:layout_height="wrap_content" /> -->
|
||||
<LinearLayout android:id="@+id/LinearLayout" android:layout_width="fill_parent" android:layout_height="fill_parent"
|
||||
android:layout_marginTop = "15dp" android:orientation="horizontal" android:gravity="bottom|center">
|
||||
<Button android:minWidth="70dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/close" android:id="@+id/CloseButton"></Button>
|
||||
<Button android:minWidth="70dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/previous_button" android:id="@+id/PreviousButton"></Button>
|
||||
<Button android:minWidth="70dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/next_button" android:id="@+id/NextButton"></Button>
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
|
@ -1,5 +1,34 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="tip_map_switch">Источник карты</string>
|
||||
<string name="tip_map_switch_t">Наиболее быстрый способ изменить источник карты и слои \'Меню\'->\'Слои\'.
|
||||
\n\tПод \'Карта источник...\' вы можете выбрать из предопределенных типов или собственных, созданных OsmAndMapCreator на PC.
|
||||
\n\tOsmAnd поддерживает custom источники.</string>
|
||||
<string name="tip_app_mode">Режим работы</string>
|
||||
<string name="tip_app_mode_t">OsmAnd поддерживает различные типовые режимы отображения карты.
|
||||
\n\tВы можете изменить режим в \'Меню\'->\'Настройки\'->\'Режим работы\', при этом меняется большинство настроек карты.</string>
|
||||
<string name="tip_navigation">Навигация</string>
|
||||
<string name="tip_navigation_t">Чтобы использовать навигацию, необходимо выбрать точку назначения. После этого нажмите \'Меню\'->\'Навигация\' на карте и выберите тип.</string>
|
||||
<string name="tip_select_destination_point">Выбор точки назначения</string>
|
||||
<string name="tip_select_destination_point_t">Вы можете выбрать точку назначения в контекстном меню карты \'Идти к\' или в поиске.
|
||||
\n\tВы также можете выбрать избранную точку долгим нажатием в \'Избранных\'.</string>
|
||||
<string name="tip_search">Поиск</string>
|
||||
<string name="tip_search_t">Вы можете искать объект на карте, просто разглядывая карту, используя адресный, координатный, POI поиск или выбрать предопределенную избранную точку.
|
||||
\n\tНажатие поиск на карте открывает поиск. После поиска имеются 2 варианта : \'Идти к\' или \'Показать на карте\'.</string>
|
||||
<string name="tip_map_context_menu">Контесктное меню карты</string>
|
||||
<string name="tip_map_context_menu_t">\tКонтестное меню карты доступно по долгому нажатию на карту или при нажатии кнопки трекбола.
|
||||
\n\tПосле этого появится окно с координатами, при нажатии на него откроется меню, при долгом нажатии - окно пропадет. Также контекстное меню доступно по кнопке Меню на карте.
|
||||
\n\tДействия в этом меню зависят от текущей выбранной точки (центр карты).</string>
|
||||
<string name="tip_desctination_point">Точка назначения</string>
|
||||
<string name="tip_desctination_point_t">\tТочкой назначения называется красная точка, отмеченная на карте.
|
||||
\n\tВы всегда можете видеть расстояние до нее от видимой точки и направление (красный треугольник). Чтобы выбрать точку назначения используйте \'Идти к\' функцию.
|
||||
\n\tЭто кнопка доступна во всех поисках, в контекстном меню карты и при долгом нажатии на избранных, POI.
|
||||
Эту точку можно использовать, чтобы измерять расстояние и для простой навигации.</string>
|
||||
<string name="tip_initial">Советы по использованию</string>
|
||||
<string name="tip_initial_t">\tOsmAnd - навигационное приложение с большим количеством функций.
|
||||
\n\tЧтобы использовать его как можно лучше, следуйте советам по ссылке вверху меню.</string>
|
||||
<string name="next_button">Следующий</string>
|
||||
<string name="previous_button">Предыдущий</string>
|
||||
<string name="unit_of_length_descr">Изменить единицы измерения длины и скорости</string>
|
||||
<string name="unit_of_length">Единицы измерения</string>
|
||||
<string name="si_mi_foots">Мили/футы</string>
|
||||
|
|
|
@ -1,5 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<resources>
|
||||
<string name="tip_map_switch">Map source</string>
|
||||
<string name="tip_map_switch_t">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.</string>
|
||||
<string name="tip_app_mode">Application mode</string>
|
||||
<string name="tip_app_mode_t">OsmAnd supports different modes representing map for typical situations.
|
||||
\n\tYou can change mode in \'Menu\'->\'Settings\'->\'Application mode\'.</string>
|
||||
<string name="tip_navigation">Navigation</string>
|
||||
<string name="tip_navigation_t">To enable navigation you should select destination point first. After that press \'Menu\'->\'Directions\' on map and select navigation type.</string>
|
||||
<string name="tip_select_destination_point">Select destination point</string>
|
||||
<string name="tip_select_destination_point_t">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\'.</string>
|
||||
<string name="tip_search">Search activities</string>
|
||||
<string name="tip_search_t">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\'.</string>
|
||||
<string name="tip_map_context_menu">Map context menu</string>
|
||||
<string name="tip_map_context_menu_t">\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.</string>
|
||||
<string name="tip_desctination_point">Destination point</string>
|
||||
<string name="tip_desctination_point_t">\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.</string>
|
||||
<string name="tip_initial">Tips and tricks</string>
|
||||
<string name="tip_initial_t">\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.</string>
|
||||
<string name="next_button">Next</string>
|
||||
<string name="previous_button">Previous</string>
|
||||
|
||||
<string name="unit_of_length_descr">Change unit of length and speed</string>
|
||||
<string name="unit_of_length">Unit of length</string>
|
||||
<string name="si_mi_foots">Miles/foots</string>
|
||||
|
@ -411,6 +441,8 @@
|
|||
<string name="favorites_Button">Favorites</string>
|
||||
<string name="search_button">Search</string>
|
||||
<color name="menu_background">#FF9030</color>
|
||||
<color name="color_light_gray">#d7d7d7</color>
|
||||
<color name="color_black">#000000</color>
|
||||
<string name="search_activity">Search</string>
|
||||
<color name="color_white">#FFFFFF</color>
|
||||
<color name="color_red">#FF0000</color>
|
||||
|
|
|
@ -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();
|
||||
if (prefs.contains(CONTRIBUTION_VERSION_FLAG)) {
|
||||
final TextView appName = (TextView) findViewById(R.id.AppName);
|
||||
if (prefs.contains(CONTRIBUTION_VERSION_FLAG)) {
|
||||
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);
|
||||
}
|
||||
|
|
164
OsmAnd/src/net/osmand/plus/activities/TipsAndTricksActivity.java
Normal file
164
OsmAnd/src/net/osmand/plus/activities/TipsAndTricksActivity.java
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in a new issue