Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2018-04-02 18:41:34 +02:00
commit 5ee107fc79
24 changed files with 379 additions and 167 deletions

View file

@ -9,7 +9,7 @@
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:resource="@string/facebook_app_id"/>
android:value="fb2057524931189530"/>
<activity
android:name="net.osmand.plus.activities.MapActivity"
android:theme="@style/FirstSplashScreenFree"

View file

@ -8,7 +8,7 @@
tools:replace="android:icon">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:resource="@string/facebook_app_id"/>
android:value="fb131313131043971"/>
<activity
android:name="net.osmand.plus.activities.MapActivity"
android:theme="@style/FirstSplashScreenCustom"

View file

@ -7,7 +7,7 @@
tools:replace="android:icon">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:resource="@string/facebook_app_id"/>
android:value="fb792288460976727"/>
<activity
android:name="net.osmand.plus.activities.MapActivity"
android:theme="@style/FirstSplashScreenFreeDev"

View file

@ -1,5 +1,6 @@
body {
max-width: 100% !important;
/* overflow-x: hidden; hide scroll bar */
display: block;
margin-top: 7%;
margin-bottom: 0;
@ -10,9 +11,10 @@ body {
h2 {
font-size: 2em;
color: #727272;
color: #454545;
font-family: serif;
font-weight: normal;
font-weight: bold;
word-wrap: break-word;
}
h3 {
@ -20,6 +22,7 @@ h3 {
font-size: 1.5em;
font-family: sans-serif;
padding-top: 5%;
word-wrap: break-word;
}
p {
@ -30,8 +33,13 @@ p {
li {
font-family: sans-serif;
font-size: 1em;
line-height: 250%;
line-height: 1.6em;
}
ul {
font-size: 1.1em;
padding-top: 3%;
padding-bottom: 3%;
}
@ -42,19 +50,29 @@ img {
a {
color: #237bff;
text-decoration-color: #a3c8ff;
word-wrap: break-word;
}
a.external-free {
external-free {
word-wrap: break-word;
background-color: #f2f2f2;
background-color: #black;
}
pre {
white-space: pre-wrap;
white-space: -moz-pre-wrap;
white-space: -pre-wrap;
white-space: -o-pre-wrap;
word-wrap: break-word;
}
.thumb-tright, .thumbinner {
width: 100% !important;
}
.thumbcaption {
.thumbnailcaption {
padding-top: 3%;
width: 100%;
font-size: 1.1em;

View file

@ -396,7 +396,7 @@ dependencies {
compile 'com.google.firebase:firebase-messaging:12.0.1'
compile 'com.google.firebase:firebase-iid:12.0.1'
compile 'com.google.firebase:firebase-config:12.0.1'
compile 'com.facebook.android:facebook-android-sdk:[4,5)'
compile 'com.facebook.android:facebook-android-sdk:4.31.0'
}
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:gridlayout-v7:27.1.0'

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="NewApi" severity="warning" />
<issue id="ResourceAsColor" severity="warning" />
</lint>

View file

@ -5,7 +5,6 @@
<!-- string name="app_version_suffix"></string -->
<!-- Not translatable -->
<string name="facebook_app_id">2057524931189530</string>
<string name="full_version_price">€7,99</string>
<string name="osm_live">OsmAnd Live</string>
<string name="ga_api_key">UA-28342846-2</string>

View file

@ -164,7 +164,6 @@
<!-- Longitude row: -->
<LinearLayout
android:id="@+id/longitude_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding_small"

View file

@ -29,6 +29,9 @@
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="@dimen/map_markers_recycler_view_padding_bottom"
android:scrollbars="vertical"/>
</LinearLayout>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/list_item_divider"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/wikivoyage_search_list_header_height"
android:background="?attr/wikivoyage_card_bg_color"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding"
android:ellipsize="end"
android:maxLines="1"
tools:text="Search results"/>
</FrameLayout>
</LinearLayout>

View file

@ -1,70 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/wikivoyage_card_bg_color"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:orientation="vertical"
android:padding="8dp">
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
tools:src="@drawable/ic_action_placeholder_city"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.ListItemTitle"
tools:text="Amsterdam"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:id="@+id/left_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="search_term: "/>
android:layout_marginEnd="@dimen/bottom_sheet_content_margin_small"
android:layout_marginRight="@dimen/bottom_sheet_content_margin_small"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
tools:text="Amstellend North Holland"/>
<TextView
android:id="@+id/search_term"
android:id="@+id/right_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
tools:text="En, Ru, De, ..."/>
</LinearLayout>
<LinearLayout
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="city_id: "/>
<TextView
android:id="@+id/city_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="article_title: "/>
<TextView
android:id="@+id/article_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lang: "/>
<TextView
android:id="@+id/lang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
android:layout_height="1dp"
android:layout_marginLeft="@dimen/bottom_sheet_selected_item_title_height"
android:layout_marginStart="@dimen/bottom_sheet_selected_item_title_height"
android:background="?attr/wikivoyage_card_divider_color"
android:focusable="false"/>
</LinearLayout>
<include
android:id="@+id/shadow"
layout="@layout/card_bottom_divider"
android:visibility="gone"
tools:visibility="visible"/>
</LinearLayout>

View file

@ -193,4 +193,6 @@
<dimen name="coords_input_show_hide_keyboard_btn_padding">19dp</dimen>
<dimen name="toolbar_height">84dp</dimen>
<dimen name="wikivoyage_search_list_header_height">54dp</dimen>
</resources>

View file

@ -67,6 +67,7 @@
<attr name="wikivoyage_bg_color" format="reference"/>
<attr name="wikivoyage_card_bg_color" format="reference"/>
<attr name="wikivoyage_card_divider_color" format="reference"/>
<attr name="wikivoyage_app_bar_color" format="reference"/>
<attr name="wikivoyage_app_bar_text_color" format="reference"/>
<attr name="wikivoyage_active_color" format="reference"/>

View file

@ -267,4 +267,6 @@
<dimen name="coords_input_keyboard_item_height">56dp</dimen>
<dimen name="toolbar_height">56dp</dimen>
<dimen name="wikivoyage_search_list_header_height">36dp</dimen>
</resources>

View file

@ -9,6 +9,7 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
<string name="shared_string_result">Result</string>
<string name="use_two_digits_longitude">Use two digits longitude</string>
<string name="shared_string_travel">Travel</string>
<string name="waypoints_removed_from_map_markers">Waypoints removed from map markers</string>

View file

@ -199,6 +199,7 @@
<item name="wikivoyage_bg_color">@color/wikivoyage_bg_light</item>
<item name="wikivoyage_card_bg_color">@color/wikivoyage_card_bg_light</item>
<item name="wikivoyage_card_divider_color">@color/wikivoyage_card_divider_light</item>
<item name="wikivoyage_app_bar_color">@color/wikivoyage_app_bar_light</item>
<item name="wikivoyage_app_bar_text_color">@color/wikivoyage_app_bar_text_light</item>
<item name="wikivoyage_active_color">@color/wikivoyage_active_light</item>
@ -389,6 +390,7 @@
<item name="wikivoyage_bg_color">@color/wikivoyage_bg_dark</item>
<item name="wikivoyage_card_bg_color">@color/wikivoyage_card_bg_dark</item>
<item name="wikivoyage_card_divider_color">@color/wikivoyage_card_divider_dark</item>
<item name="wikivoyage_app_bar_color">@color/wikivoyage_app_bar_dark</item>
<item name="wikivoyage_app_bar_text_color">@color/wikivoyage_app_bar_text_dark</item>
<item name="wikivoyage_active_color">@color/wikivoyage_active_dark</item>

View file

@ -2,6 +2,7 @@ package net.osmand.plus;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
@ -165,10 +166,8 @@ public class OsmandApplication extends MultiDexApplication {
// if(!osmandSettings.FOLLOW_THE_ROUTE.get()) {
// targetPointsHelper.clearPointToNavigate(false);
// }
InAppHelper.initialize(this);
initRemoteConfig();
printFirebasetoken();
initExternalLibs();
startApplication();
System.out.println("Time to start application " + (System.currentTimeMillis() - timeToStart) + " ms. Should be less < 800 ms");
timeToStart = System.currentTimeMillis();
@ -879,6 +878,31 @@ public class OsmandApplication extends MultiDexApplication {
}
}
public void initExternalLibs() {
initRemoteConfig();
printFirebasetoken();
initFBEvents();
}
public void initFBEvents() {
try {
if (Version.isGooglePlayEnabled(this) && Version.isFreeVersion(this)) {
Class<?> cls = Class.forName("com.facebook.FacebookSdk");
Method ms = cls.getMethod("sdkInitialize", Context.class);
ms.invoke(null, getApplicationContext());
Class<?> cl = Class.forName("com.facebook.appevents.AppEventsLogger");
Method mm = cl.getMethod("activateApp", Application.class);
mm.invoke(null, this);
Method mu = cl.getMethod("getUserID");
String uid = (String) mu.invoke(null);
LOG.info("FB token: " + uid);
}
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
}
public void initRemoteConfig() {
try {
if (Version.isGooglePlayEnabled(this) && Version.isFreeVersion(this)) {
@ -891,7 +915,7 @@ public class OsmandApplication extends MultiDexApplication {
log.invoke(inst, defaults);
}
} catch (Exception e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
}
}
@ -907,7 +931,7 @@ public class OsmandApplication extends MultiDexApplication {
LOG.info("Fbase token: " + firebaseToken);
}
} catch (Exception e) {
e.printStackTrace();
LOG.error(e.getMessage(), e);
}
}

View file

@ -5,7 +5,6 @@ import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.ColorRes;
import android.support.annotation.Nullable;
import android.view.View;
import net.osmand.plus.OsmandSettings;
@ -67,7 +66,7 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia
if (listener != null) {
OsmandSettings.CommonPreference<Boolean> pref = settings.COORDS_INPUT_TWO_DIGITS_LONGTITUDE;
pref.set(!pref.get());
listener.onTwoDigitsLongtitudeChanged();
listener.onInputSettingsChanged();
}
dismiss();
}
@ -113,7 +112,7 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia
int format = (int) v.getTag();
settings.COORDS_INPUT_FORMAT.set(format);
if (listener != null) {
listener.onFormatChanged();
listener.onInputSettingsChanged();
}
dismiss();
}
@ -150,12 +149,10 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia
interface CoordinateInputFormatChangeListener {
void onTwoDigitsLongtitudeChanged();
void onKeyboardChanged();
void onHandChanged();
void onFormatChanged();
void onInputSettingsChanged();
}
}

View file

@ -5,6 +5,7 @@ import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
@ -35,6 +36,7 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
@ -88,8 +90,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
private boolean lightTheme;
private boolean orientationPortrait;
private boolean isSoftKeyboardShown = true;
private boolean useTwoDigitsLongtitude;
private boolean isSoftKeyboardShown;
private boolean north = true;
private boolean east = true;
@ -107,7 +108,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
super.onCreate(savedInstanceState);
lightTheme = getMyApplication().getSettings().isLightContent();
setStyle(STYLE_NO_FRAME, lightTheme ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme);
useTwoDigitsLongtitude = getMyApplication().getSettings().COORDS_INPUT_TWO_DIGITS_LONGTITUDE.get();
}
@NonNull
@ -253,7 +253,11 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
if (isOsmandKeyboardCurrentlyVisible()) {
changeOsmandKeyboardVisibility(false);
}
editTexts.get(6).requestFocus();
for (EditText et : editTexts) {
if (et.getId() == R.id.point_name_et) {
et.requestFocus();
}
}
final View focusedView = getDialog().getCurrentFocus();
if (focusedView != null) {
new Handler().postDelayed(new Runnable() {
@ -261,19 +265,12 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
public void run() {
isSoftKeyboardShown = true;
AndroidUtils.showSoftKeyboard(focusedView);
showHideKeyboardIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_keyboard_hide));
}
}, 200);
}
}
});
editTexts.get(6).setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && isOsmandKeyboardOn() && isOsmandKeyboardCurrentlyVisible()) {
AndroidUtils.hideSoftKeyboard(getActivity(), v);
}
}
});
adapter = new CoordinateInputAdapter(mapActivity, mapMarkers);
RecyclerView recyclerView = (RecyclerView) mainView.findViewById(R.id.markers_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
@ -372,12 +369,14 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
if (isSoftKeyboardShown) {
isSoftKeyboardShown = false;
AndroidUtils.hideSoftKeyboard(getActivity(), focusedView);
showHideKeyboardIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_keyboard_show));
} else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
isSoftKeyboardShown = true;
AndroidUtils.showSoftKeyboard(focusedView);
showHideKeyboardIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_keyboard_hide));
}
}, 200);
}
@ -386,6 +385,22 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
}
}
});
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
mainView.getWindowVisibleDisplayFrame(r);
int screenHeight = mainView.getRootView().getHeight();
int keypadHeight = screenHeight - r.bottom;
if (keypadHeight > screenHeight * 0.15) {
isSoftKeyboardShown = true;
showHideKeyboardIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_keyboard_hide));
} else {
isSoftKeyboardShown = false;
}
}
});
}
private void setupKeyboardItems(View keyboardView, View.OnClickListener listener, @IdRes int... itemsIds) {
@ -615,6 +630,14 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
if (focusedView != null && focusedView instanceof EditTextEx) {
EditTextEx et = (EditTextEx) focusedView;
int currentLength = et.getText().length();
if (et.getId() == R.id.lon_first_input_et) {
String lonFirstInput = et.getText().toString();
if (currentLength == 2) {
if (lonFirstInput.charAt(0) != '1' && lonFirstInput.charAt(0) != '0') {
switchEditText(et.getId(), true);
}
}
}
if (et.getMaxSymbolsCount() > 0 && currentLength > strLength && currentLength >= et.getMaxSymbolsCount()) {
switchEditText(et.getId(), true);
}
@ -718,7 +741,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
clearInputs();
int format = getMyApplication().getSettings().COORDS_INPUT_FORMAT.get();
boolean useTwoDigitsLongtitude = getMyApplication().getSettings().COORDS_INPUT_TWO_DIGITS_LONGTITUDE.get();
setupEditTextEx(R.id.lat_first_input_et, CoordinateInputFormats.getFirstPartSymbolsCount(format, true, useTwoDigitsLongtitude), true);
setupEditTextEx(R.id.lon_first_input_et, CoordinateInputFormats.getFirstPartSymbolsCount(format, false, useTwoDigitsLongtitude), false);
@ -752,8 +775,21 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
R.id.lon_first_input_et, R.id.lon_second_input_et, R.id.lon_third_input_et, R.id.point_name_et);
for (EditText et : editTexts) {
if (et.getId() == R.id.lon_first_input_et) {
((LinearLayout.LayoutParams) et.getLayoutParams()).weight = editTexts.get(0).getMaxSymbolsCount();
et.requestLayout();
}
if (et.getId() != R.id.point_name_et) {
et.addTextChangedListener(textWatcher);
}else {
et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && isOsmandKeyboardOn() && isOsmandKeyboardCurrentlyVisible()) {
AndroidUtils.hideSoftKeyboard(getActivity(), v);
}
}
});
}
et.setOnTouchListener(inputEditTextOnTouchListener);
et.setOnLongClickListener(inputEditTextOnLongClickListener);
@ -813,11 +849,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
private CoordinateInputFormatChangeListener createCoordinateInputFormatChangeListener() {
return new CoordinateInputFormatChangeListener() {
@Override
public void onTwoDigitsLongtitudeChanged() {
changeTwoDigitsLongtitude();
}
@Override
public void onKeyboardChanged() {
changeKeyboard();
@ -829,7 +860,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
}
@Override
public void onFormatChanged() {
public void onInputSettingsChanged() {
registerInputs();
}
};
@ -841,13 +872,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
registerMainView();
}
private void changeTwoDigitsLongtitude() {
editTexts.get(3).setMaxSymbolsCount(getMyApplication().getSettings().COORDS_INPUT_TWO_DIGITS_LONGTITUDE.get() ? 2 : 3);
((LinearLayout)mainView.findViewById(R.id.longitude_row)).removeView(editTexts.get(3));
// editTexts.get(3).invalidate();
registerMainView();
}
private void changeEditTextSelections() {
for (EditText et : editTexts) {
et.setSelection(et.getText().length());

View file

@ -102,7 +102,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
}
final PopupMenu popup = new PopupMenu(view.getContext(), view, Gravity.END);
for (final String lang : searchResult.getLang()) {
for (final String lang : searchResult.getLangs()) {
MenuItem item = popup.getMenu().add(lang);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
@ -130,7 +130,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
return;
}
if (selectedLang == null) {
selectedLang = searchResult.getLang().get(0);
selectedLang = searchResult.getLangs().get(0);
}
selectedLangTv.setText(selectedLang);

View file

@ -60,12 +60,20 @@ public class WikivoyageDbHelper {
private static final String SEARCH_COL_ARTICLE_TITLE = "article_title";
private static final String SEARCH_COL_LANG = "lang";
private static final String SEARCH_TABLE_SELECT = "SELECT " +
private static final String SEARCH_QUERY = "SELECT " +
SEARCH_COL_SEARCH_TERM + ", " +
SEARCH_COL_CITY_ID + ", " +
SEARCH_TABLE_NAME + "." + SEARCH_COL_CITY_ID + ", " +
SEARCH_COL_ARTICLE_TITLE + ", " +
SEARCH_COL_LANG +
" FROM " + SEARCH_TABLE_NAME;
SEARCH_TABLE_NAME + "." + SEARCH_COL_LANG + ", " +
ARTICLES_COL_IS_PART_OF +
" FROM " + SEARCH_TABLE_NAME +
" JOIN " + ARTICLES_TABLE_NAME +
" ON " + SEARCH_TABLE_NAME + "." + SEARCH_COL_ARTICLE_TITLE + " = " + ARTICLES_TABLE_NAME + "." + ARTICLES_COL_TITLE +
" AND " + SEARCH_TABLE_NAME + "." + SEARCH_COL_LANG + " = " + ARTICLES_TABLE_NAME + "." + ARTICLES_COL_LANG +
" WHERE " + SEARCH_TABLE_NAME + "." + SEARCH_COL_CITY_ID +
" IN (SELECT " + SEARCH_TABLE_NAME + "." + SEARCH_COL_CITY_ID +
" FROM " + SEARCH_TABLE_NAME +
" WHERE " + SEARCH_COL_SEARCH_TERM + " LIKE ?)";
private final OsmandApplication application;
@ -82,10 +90,7 @@ public class WikivoyageDbHelper {
SQLiteConnection conn = openConnection();
if (conn != null) {
try {
String dbQuery = SEARCH_TABLE_SELECT + " WHERE " + SEARCH_COL_CITY_ID +
" IN (SELECT " + SEARCH_COL_CITY_ID + " FROM " + SEARCH_TABLE_NAME +
" WHERE " + SEARCH_COL_SEARCH_TERM + " LIKE ?)";
SQLiteCursor cursor = conn.rawQuery(dbQuery, new String[]{searchQuery + "%"});
SQLiteCursor cursor = conn.rawQuery(SEARCH_QUERY, new String[]{searchQuery + "%"});
if (cursor.moveToFirst()) {
do {
res.add(readSearchResult(cursor));
@ -100,12 +105,12 @@ public class WikivoyageDbHelper {
Collections.sort(list, new Comparator<WikivoyageSearchResult>() {
@Override
public int compare(WikivoyageSearchResult o1, WikivoyageSearchResult o2) {
boolean c1 = CollatorStringMatcher.cmatches(collator, searchQuery, o1.articleTitle.get(0),
boolean c1 = CollatorStringMatcher.cmatches(collator, searchQuery, o1.articleTitles.get(0),
StringMatcherMode.CHECK_ONLY_STARTS_WITH);
boolean c2 = CollatorStringMatcher.cmatches(collator, searchQuery, o2.articleTitle.get(0),
boolean c2 = CollatorStringMatcher.cmatches(collator, searchQuery, o2.articleTitles.get(0),
StringMatcherMode.CHECK_ONLY_STARTS_WITH);
if (c1 == c2) {
return collator.compare(o1.articleTitle.get(0), o2.articleTitle.get(0));
return collator.compare(o1.articleTitles.get(0), o2.articleTitles.get(0));
} else if (c1) {
return -1;
} else if (c2) {
@ -125,18 +130,18 @@ public class WikivoyageDbHelper {
WikivoyageSearchResult prev = wikivoyage.get(rs.cityId);
if (prev != null) {
int insInd = prev.langs.size();
if (rs.getLang().get(0).equals(baseLng)) {
if (rs.langs.get(0).equals(baseLng)) {
insInd = 0;
} else if (rs.getLang().get(0).equals("en")) {
if (!prev.getLang().get(0).equals(baseLng)) {
} else if (rs.langs.get(0).equals("en")) {
if (!prev.langs.get(0).equals(baseLng)) {
insInd = 0;
} else {
insInd = 1;
}
}
prev.articleTitle.add(insInd, rs.articleTitle.get(0));
prev.articleTitles.add(insInd, rs.articleTitles.get(0));
prev.langs.add(insInd, rs.langs.get(0));
prev.searchTerm.add(insInd, rs.searchTerm.get(0));
prev.searchTerms.add(insInd, rs.searchTerms.get(0));
} else {
wikivoyage.put(rs.cityId, rs);
}
@ -175,10 +180,11 @@ public class WikivoyageDbHelper {
private WikivoyageSearchResult readSearchResult(SQLiteCursor cursor) {
WikivoyageSearchResult res = new WikivoyageSearchResult();
res.searchTerm.add(cursor.getString(0));
res.searchTerms.add(cursor.getString(0));
res.cityId = cursor.getLong(1);
res.articleTitle.add(cursor.getString(2));
res.articleTitles.add(cursor.getString(2));
res.langs.add(cursor.getString(3));
res.isPartOf = cursor.getString(4);
return res;
}

View file

@ -3,43 +3,65 @@ package net.osmand.plus.wikivoyage.data;
import android.os.Parcel;
import android.os.Parcelable;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
public class WikivoyageSearchResult implements Parcelable {
List<String> searchTerm = new ArrayList<>();
private static final int SHOW_LANGS = 3;
List<String> searchTerms = new ArrayList<>();
long cityId;
List<String> articleTitle = new ArrayList<>();
List<String> articleTitles = new ArrayList<>();
List<String> langs = new ArrayList<>();
String isPartOf;
WikivoyageSearchResult() {
}
private WikivoyageSearchResult(Parcel in) {
searchTerm = in.createStringArrayList();
searchTerms = in.createStringArrayList();
cityId = in.readLong();
articleTitle = in.createStringArrayList();
articleTitles = in.createStringArrayList();
langs = in.createStringArrayList();
isPartOf = in.readString();
}
public List<String> getSearchTerm() {
return searchTerm;
public List<String> getSearchTerms() {
return searchTerms;
}
public long getCityId() {
return cityId;
}
public List<String> getArticleTitle() {
return articleTitle;
public List<String> getArticleTitles() {
return articleTitles;
}
public List<String> getLang() {
public List<String> getLangs() {
return langs;
}
public String getIsPartOf() {
return isPartOf;
}
public String getFirstLangsString() {
StringBuilder res = new StringBuilder();
int limit = Math.min(SHOW_LANGS, langs.size());
for (int i = 0; i < limit; i++) {
res.append(Algorithms.capitalizeFirstLetter(langs.get(i)));
if (i != limit - 1) {
res.append(", ");
}
}
return res.toString();
}
@Override
public int describeContents() {
return 0;
@ -47,10 +69,11 @@ public class WikivoyageSearchResult implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringList(searchTerm);
dest.writeStringList(searchTerms);
dest.writeLong(cityId);
dest.writeStringList(articleTitle);
dest.writeStringList(articleTitles);
dest.writeStringList(langs);
dest.writeString(isPartOf);
}
public static final Creator<WikivoyageSearchResult> CREATOR = new Creator<WikivoyageSearchResult>() {

View file

@ -6,17 +6,26 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.wikivoyage.data.WikivoyageSearchResult;
import java.util.ArrayList;
import java.util.List;
public class SearchRecyclerViewAdapter extends RecyclerView.Adapter<SearchRecyclerViewAdapter.ViewHolder> {
public class SearchRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<WikivoyageSearchResult> items = new ArrayList<>();
private static final int HEADER_TYPE = 0;
private static final int ITEM_TYPE = 1;
private OsmandApplication app;
private IconsCache iconsCache;
private List<Object> items = new ArrayList<>();
private View.OnClickListener onItemClickListener;
@ -24,23 +33,51 @@ public class SearchRecyclerViewAdapter extends RecyclerView.Adapter<SearchRecycl
this.onItemClickListener = onItemClickListener;
}
SearchRecyclerViewAdapter(OsmandApplication app) {
this.app = app;
this.iconsCache = app.getIconsCache();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.wikivoyage_search_list_item, viewGroup, false);
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
boolean header = viewType == HEADER_TYPE;
int layoutId = header ? R.layout.wikivoyage_search_list_header : R.layout.wikivoyage_search_list_item;
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, false);
if (header) {
return new HeaderVH(itemView);
}
itemView.setOnClickListener(onItemClickListener);
return new ViewHolder(itemView);
return new ItemVH(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
WikivoyageSearchResult item = items.get(i);
// FIXME
viewHolder.searchTerm.setText(item.getSearchTerm().toString());
viewHolder.cityId.setText(String.valueOf(item.getCityId()));
viewHolder.articleTitle.setText(item.getArticleTitle().toString());
viewHolder.lang.setText(item.getLang().toString());
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int pos) {
if (viewHolder instanceof HeaderVH) {
((HeaderVH) viewHolder).title.setText((String) getItem(pos));
} else {
ItemVH holder = (ItemVH) viewHolder;
boolean lastItem = pos == getItemCount() - 1;
WikivoyageSearchResult item = (WikivoyageSearchResult) getItem(pos);
holder.icon.setImageDrawable(
iconsCache.getIcon(R.drawable.ic_action_placeholder_city, R.color.icon_color)
);
holder.title.setText(item.getArticleTitles().get(0));
holder.leftDescr.setText(item.getIsPartOf());
holder.rightDescr.setText(item.getFirstLangsString());
holder.divider.setVisibility(lastItem ? View.GONE : View.VISIBLE);
holder.shadow.setVisibility(lastItem ? View.VISIBLE : View.GONE);
}
}
@Override
public int getItemViewType(int position) {
Object item = getItem(position);
if (item instanceof String) {
return HEADER_TYPE;
}
return ITEM_TYPE;
}
@Override
@ -48,32 +85,46 @@ public class SearchRecyclerViewAdapter extends RecyclerView.Adapter<SearchRecycl
return items.size();
}
public WikivoyageSearchResult getItem(int pos) {
public Object getItem(int pos) {
return items.get(pos);
}
public void setItems(@Nullable List<WikivoyageSearchResult> items) {
if (items == null) {
this.items.clear();
} else {
this.items = items;
if (items != null && !items.isEmpty()) {
this.items.add(app.getString(R.string.shared_string_result));
this.items.addAll(items);
}
notifyDataSetChanged();
}
static class ViewHolder extends RecyclerView.ViewHolder {
static class HeaderVH extends RecyclerView.ViewHolder {
final TextView searchTerm;
final TextView cityId;
final TextView articleTitle;
final TextView lang;
final TextView title;
public ViewHolder(View itemView) {
public HeaderVH(View itemView) {
super(itemView);
searchTerm = (TextView) itemView.findViewById(R.id.search_term);
cityId = (TextView) itemView.findViewById(R.id.city_id);
articleTitle = (TextView) itemView.findViewById(R.id.article_title);
lang = (TextView) itemView.findViewById(R.id.lang);
title = (TextView) itemView.findViewById(R.id.title);
}
}
static class ItemVH extends RecyclerView.ViewHolder {
final ImageView icon;
final TextView title;
final TextView leftDescr;
final TextView rightDescr;
final View divider;
final View shadow;
public ItemVH(View itemView) {
super(itemView);
icon = (ImageView) itemView.findViewById(R.id.icon);
title = (TextView) itemView.findViewById(R.id.title);
leftDescr = (TextView) itemView.findViewById(R.id.left_description);
rightDescr = (TextView) itemView.findViewById(R.id.right_description);
divider = itemView.findViewById(R.id.divider);
shadow = itemView.findViewById(R.id.shadow);
}
}
}

View file

@ -89,7 +89,7 @@ public class WikivoyageSearchDialogFragment extends WikivoyageBaseDialogFragment
}
});
adapter = new SearchRecyclerViewAdapter();
adapter = new SearchRecyclerViewAdapter(getMyApplication());
final RecyclerView rv = (RecyclerView) mainView.findViewById(R.id.recycler_view);
rv.setLayoutManager(new LinearLayoutManager(getContext()));
rv.setAdapter(adapter);
@ -98,7 +98,11 @@ public class WikivoyageSearchDialogFragment extends WikivoyageBaseDialogFragment
public void onClick(View v) {
int pos = rv.getChildAdapterPosition(v);
if (pos != RecyclerView.NO_POSITION) {
WikivoyageArticleDialogFragment.showInstance(getFragmentManager(), adapter.getItem(pos));
Object item = adapter.getItem(pos);
if (item instanceof WikivoyageSearchResult) {
WikivoyageArticleDialogFragment.showInstance(getFragmentManager(),
(WikivoyageSearchResult) item);
}
}
}
});