Issue 415. Tips and tricks functionality

This commit is contained in:
Victor Shcherb 2011-05-08 14:58:30 +02:00
parent f86f5f86aa
commit d31d02491b
6 changed files with 291 additions and 2 deletions

View 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>

View 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>

View file

@ -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>

View file

@ -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>

View file

@ -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);
}

View 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;
}
}