Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2018-04-15 19:00:44 +02:00
commit 4b991ff1cb
42 changed files with 858 additions and 340 deletions

View file

@ -52,6 +52,7 @@ public class IndexConstants {
public static final String GPX_INDEX_DIR = "tracks/"; public static final String GPX_INDEX_DIR = "tracks/";
public static final String GPX_RECORDED_INDEX_DIR = GPX_INDEX_DIR + "rec/"; public static final String GPX_RECORDED_INDEX_DIR = GPX_INDEX_DIR + "rec/";
public static final String GPX_IMPORT_DIR = GPX_INDEX_DIR + "import/"; public static final String GPX_IMPORT_DIR = GPX_INDEX_DIR + "import/";
public static final String TILES_INDEX_DIR= "tiles/"; public static final String TILES_INDEX_DIR= "tiles/";
public static final String LIVE_INDEX_DIR= "live/"; public static final String LIVE_INDEX_DIR= "live/";
public static final String TOURS_INDEX_DIR= "tours/"; public static final String TOURS_INDEX_DIR= "tours/";
@ -59,6 +60,7 @@ public class IndexConstants {
public static final String ROADS_INDEX_DIR = "roads/"; //$NON-NLS-1$ public static final String ROADS_INDEX_DIR = "roads/"; //$NON-NLS-1$
public static final String WIKI_INDEX_DIR = "wiki/"; //$NON-NLS-1$ public static final String WIKI_INDEX_DIR = "wiki/"; //$NON-NLS-1$
public static final String WIKIVOYAGE_INDEX_DIR = "travel/"; public static final String WIKIVOYAGE_INDEX_DIR = "travel/";
public static final String GPX_TRAVEL_DIR = GPX_INDEX_DIR + WIKIVOYAGE_INDEX_DIR;
public static final String AV_INDEX_DIR = "avnotes/"; //$NON-NLS-1$ public static final String AV_INDEX_DIR = "avnotes/"; //$NON-NLS-1$
public static final String FONT_INDEX_DIR = "fonts/"; //$NON-NLS-1$ public static final String FONT_INDEX_DIR = "fonts/"; //$NON-NLS-1$
public static final String VOICE_INDEX_DIR = "voice/"; //$NON-NLS-1$ public static final String VOICE_INDEX_DIR = "voice/"; //$NON-NLS-1$

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.android.ide.eclipse.adt.PreCompilerBuilder"/>
<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
</launchConfiguration>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.android.ide.eclipse.adt.ResourceManagerBuilder"/>
<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
</launchConfiguration>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="org.eclipse.cdt.managedbuilder.core.genmakebuilder"/>
<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS">
<mapEntry key="?children?" value="?name?=outputEntries\|?children?=?name?=entry\\\\\\\|\\\|\||"/>
<mapEntry key="?name?" value=""/>
<mapEntry key="org.eclipse.cdt.make.core.append_environment" value="true"/>
<mapEntry key="org.eclipse.cdt.make.core.buildArguments" value="${ANDROID_NDK}/ndk-build"/>
<mapEntry key="org.eclipse.cdt.make.core.buildCommand" value="sh"/>
<mapEntry key="org.eclipse.cdt.make.core.cleanBuildTarget" value="clean"/>
<mapEntry key="org.eclipse.cdt.make.core.contents" value="org.eclipse.cdt.make.core.activeConfigSettings"/>
<mapEntry key="org.eclipse.cdt.make.core.enableAutoBuild" value="false"/>
<mapEntry key="org.eclipse.cdt.make.core.enableCleanBuild" value="false"/>
<mapEntry key="org.eclipse.cdt.make.core.enableFullBuild" value="false"/>
<mapEntry key="org.eclipse.cdt.make.core.fullBuildTarget" value="V=1"/>
<mapEntry key="org.eclipse.cdt.make.core.stopOnError" value="true"/>
<mapEntry key="org.eclipse.cdt.make.core.useDefaultBuildCmd" value="false"/>
</mapAttribute>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
</launchConfiguration>

2
OsmAnd/.gitignore vendored
View file

@ -10,6 +10,8 @@ libs/org.*.jar
libs/commons-logging-commons-logging-api-1.1.jar libs/commons-logging-commons-logging-api-1.1.jar
libs/fr.univ-valenciennes-bzip2-1.0.jar libs/fr.univ-valenciennes-bzip2-1.0.jar
libs/it.unibo.alice.tuprolog-tuprolog-3.2.1.jar libs/it.unibo.alice.tuprolog-tuprolog-3.2.1.jar
libs/commons-codec-commons-codec-1.11.jar
libs/OsmAndCore_android-0.1-SNAPSHOT.jar
valgrind/ valgrind/
bin/ bin/

View file

@ -7,71 +7,33 @@
</projects> </projects>
<buildSpec> <buildSpec>
<buildCommand> <buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers></triggers> <triggers>full,incremental,</triggers>
<arguments> <arguments>
<dictionary> <dictionary>
<key>?children?</key> <key>LaunchConfigHandle</key>
<value>?name?=outputEntries\|?children?=?name?=entry\\\\\\\|\\\|\||</value> <value>&lt;project&gt;/.externalToolBuilders/org.eclipse.cdt.managedbuilder.core.genmakebuilder.launch</value>
</dictionary>
<dictionary>
<key>?name?</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.append_environment</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildArguments</key>
<value>${ANDROID_NDK}/ndk-build</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildCommand</key>
<value>sh</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
<value>clean</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.contents</key>
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
<value>V=1</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.stopOnError</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
<value>false</value>
</dictionary> </dictionary>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand> <buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers>full,incremental,</triggers>
<arguments> <arguments>
<dictionary>
<key>LaunchConfigHandle</key>
<value>&lt;project&gt;/.externalToolBuilders/com.android.ide.eclipse.adt.ResourceManagerBuilder.launch</value>
</dictionary>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand> <buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers>full,incremental,</triggers>
<arguments> <arguments>
<dictionary>
<key>LaunchConfigHandle</key>
<value>&lt;project&gt;/.externalToolBuilders/com.android.ide.eclipse.adt.PreCompilerBuilder.launch</value>
</dictionary>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand> <buildCommand>

47
OsmAnd/assets/article_style.css Normal file → Executable file
View file

@ -30,33 +30,62 @@ body {
} }
h1 { h1 {
font-size: 3em; font-size: 2em;
color: #212121; color: #212121;
font-family: serif; font-family: serif;
font-weight: bold;
letter-spacing: 0.03em; letter-spacing: 0.03em;
word-wrap: break-word; word-wrap: break-word;
padding-top: 5%; padding-top: 5%;
font-weight: normal;
} }
h2 { h2 {
font-size: 2em; font-size: 1.5em;
color: #454545; color: #454545;
font-family: serif; font-family: serif;
font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
margin-top: 3%; margin-top: 3%;
margin-bottom: 3%; margin-bottom: 3%;
font-weight: normal;
line-height: 1.6em;
} }
h2.active:after {
transform: rotate(-135deg);
-webkit-transform: rotate(-135deg);
position: absolute;
right: 1em;
}
h2:after {
vertical-align: middle;
content: "";
border: solid black;
border-width: 0 3px 3px 0;
margin-top: 13px;
display: inline-block;
padding: 3px;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
position: absolute;
right: 1em;
}
/*
.mw-headline {
}
*/
h3 { h3 {
color: #212121; color: #212121;
font-size: 1.5em; font-size: 1.2em;
font-family: sans-serif; font-family: sans-serif;
word-wrap: break-word; word-wrap: break-word;
font-weight: bold;
margin-top: 3%; margin-top: 3%;
margin-bottom: 3%; margin-bottom: 3%;
line-height: 1.6em;
} }
p { p {
@ -84,12 +113,6 @@ li {
font-size: 1.1em; font-size: 1.1em;
} }
.mw-headline {
font-family: sans-serif;
font-size: 1.1em;
line-height: 1.6em;
font-weight: bold;
}
img { img {
width: 100%; width: 100%;

View file

@ -22,10 +22,18 @@ apply plugin: 'com.github.ksoichiro.eclipse.aar'
def analytics = (!System.getenv("APP_FEATURES") || System.getenv("APP_FEATURES").contains("+play_market")) && def analytics = (!System.getenv("APP_FEATURES") || System.getenv("APP_FEATURES").contains("+play_market")) &&
getGradle().getStartParameter().getTaskRequests().toString().contains("Free") getGradle().getStartParameter().getTaskRequests().toString().contains("Free")
eclipseAar { eclipseAar {
// See "Configurations" for details // See "Configurations" for details
androidTarget = 'android-27' androidTarget = 'android-27'
aarDependenciesDir = 'aarDependencies' aarDependenciesDir = 'aarDependencies'
targetConfigurations = ['compile']
// cleanLibsDirectoryEnabled = true
}
task printc {
configurations.each { if(it.isCanBeResolved()) println it.name }
} }
android { android {
@ -390,47 +398,47 @@ repositories {
project.logger.warn("Analytics enabled for free version: $analytics") project.logger.warn("Analytics enabled for free version: $analytics")
dependencies { dependencies {
compile project(path: ':OsmAnd-java', configuration: 'android') implementation project(path: ':OsmAnd-java', configuration: 'android')
if (analytics) { if (analytics) {
compile 'com.google.firebase:firebase-core:12.0.1' implementation 'com.google.firebase:firebase-core:12.0.1'
compile 'com.google.firebase:firebase-messaging:12.0.1' implementation 'com.google.firebase:firebase-messaging:12.0.1'
compile 'com.google.firebase:firebase-iid:12.0.1' implementation 'com.google.firebase:firebase-iid:12.0.1'
compile 'com.google.firebase:firebase-config:12.0.1' implementation 'com.google.firebase:firebase-config:12.0.1'
compile 'com.facebook.android:facebook-android-sdk:4.31.0' implementation 'com.facebook.android:facebook-android-sdk:4.31.0'
} }
compile 'com.android.support:multidex:1.0.1' implementation 'com.android.support:multidex:1.0.1'
compile 'com.android.support:gridlayout-v7:27.1.0' implementation 'com.android.support:gridlayout-v7:27.1.0'
compile 'com.android.support:cardview-v7:27.1.0' implementation 'com.android.support:cardview-v7:27.1.0'
compile 'com.android.support:appcompat-v7:27.1.0' implementation 'com.android.support:appcompat-v7:27.1.0'
compile 'com.android.support:design:27.1.0' implementation 'com.android.support:design:27.1.0'
compile 'com.android.support:customtabs:27.1.0' implementation 'com.android.support:customtabs:27.1.0'
compile fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs')
compile 'commons-logging:commons-logging-api:1.1' implementation 'commons-logging:commons-logging-api:1.1'
compile 'commons-codec:commons-codec:1.11' implementation 'commons-codec:commons-codec:1.11'
compile 'it.unibo.alice.tuprolog:tuprolog:3.2.1' implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1'
compile 'org.beanshell:bsh-core:2.0b4' implementation 'org.beanshell:bsh-core:2.0b4'
compile 'fr.univ-valenciennes:bzip2:1.0' implementation 'fr.univ-valenciennes:bzip2:1.0'
compile 'com.moparisthebest:junidecode:0.1.1' implementation 'com.moparisthebest:junidecode:0.1.1'
compile 'org.immutables:gson:2.5.0' implementation 'org.immutables:gson:2.5.0'
compile 'com.vividsolutions:jts-core:1.14.0' implementation 'com.vividsolutions:jts-core:1.14.0'
compile 'com.squareup.picasso:picasso:2.71828' implementation 'com.squareup.picasso:picasso:2.71828'
// size restrictions // size restrictions
// compile 'com.ibm.icu:icu4j:50.1' // implementation 'com.ibm.icu:icu4j:50.1'
// compile 'net.sf.trove4j:trove4j:3.0.3' // implementation 'net.sf.trove4j:trove4j:3.0.3'
legacyCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar" legacyImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar"
qtcoredebugCompile "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" qtcoredebugImplementation "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar"
qtcoredebugCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" qtcoredebugImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar"
qtcoreCompile "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" qtcoreImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar"
qtcoreCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" qtcoreImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar"
compile ("com.getkeepsafe.taptargetview:taptargetview:1.6.1"){ implementation ("com.getkeepsafe.taptargetview:taptargetview:1.6.1"){
exclude group: 'com.android.support' exclude group: 'com.android.support'
} }
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1' implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile ("com.github.HITGIF:TextFieldBoxes:1.3.5"){ implementation ("com.github.HITGIF:TextFieldBoxes:1.3.5"){
exclude group: 'com.android.support' exclude group: 'com.android.support'
} }
} }

View file

@ -34,3 +34,5 @@ android.library.reference.19=aarDependencies/android.arch.lifecycle-viewmodel-1.
android.library.reference.20=aarDependencies/android.arch.lifecycle-livedata-core-1.1.0 android.library.reference.20=aarDependencies/android.arch.lifecycle-livedata-core-1.1.0
android.library.reference.21=aarDependencies/com.android.support-transition-27.1.0 android.library.reference.21=aarDependencies/com.android.support-transition-27.1.0
android.library.reference.22=aarDependencies/com.android.support-support-media-compat-27.1.0 android.library.reference.22=aarDependencies/com.android.support-support-media-compat-27.1.0
android.library.reference.23=aarDependencies/com.squareup.picasso-picasso-2.71828
android.library.reference.24=aarDependencies/com.android.support-exifinterface-27.1.0

View file

@ -1,14 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="?attr/wikivoyage_bg_color" android:background="?attr/wikivoyage_bg_color"
android:orientation="vertical"> android:orientation="vertical">
@ -26,8 +23,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<View <net.osmand.plus.widgets.TextViewEx
android:id="@+id/article_toolbar_text"
android:layout_width="0dp" android:layout_width="0dp"
android:gravity="center_vertical"
android:textSize="@dimen/dialog_header_text_size"
android:ellipsize="end"
osmand:typeface="@string/font_roboto_medium"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1"/> android:layout_weight="1"/>
@ -55,12 +57,21 @@
</android.support.v7.widget.Toolbar> </android.support.v7.widget.Toolbar>
<FrameLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp">
<WebView <WebView
android:id="@+id/content_web_view" android:id="@+id/content_web_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
</LinearLayout> <ImageView
android:layout_width="match_parent"
android:layout_gravity="bottom"
android:layout_height="10dp"
android:background="@drawable/bg_contextmenu_shadow_top_light" />
</FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/bottom_bar" android:id="@+id/bottom_bar"
@ -69,10 +80,7 @@
android:layout_gravity="bottom|center_horizontal" android:layout_gravity="bottom|center_horizontal"
android:orientation="vertical"> android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@drawable/bg_contextmenu_shadow_top_light" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -84,7 +92,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_weight="0.5" android:layout_weight="0.33"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/bottom_sheet_content_padding_small" android:drawablePadding="@dimen/bottom_sheet_content_padding_small"
android:ellipsize="end" android:ellipsize="end"
@ -103,12 +111,37 @@
tools:drawableTint="?attr/wikivoyage_active_color" tools:drawableTint="?attr/wikivoyage_active_color"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/gpx_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="0.33"
android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/bottom_sheet_content_padding_small"
android:ellipsize="end"
android:gravity="center_vertical"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:maxLines="1"
android:paddingBottom="@dimen/context_menu_padding_margin_tiny"
android:paddingLeft="@dimen/bottom_sheet_content_margin"
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
android:paddingTop="@dimen/context_menu_padding_margin_tiny"
android:text="@string/points"
android:textColor="?attr/wikivoyage_active_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:drawableLeft="@drawable/ic_action_track_16"
tools:drawableTint="?attr/wikivoyage_active_color"
tools:ignore="UnusedAttribute" />
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/save_button" android:id="@+id/save_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_weight="1" android:layout_weight="0.34"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/bottom_sheet_content_padding_small" android:drawablePadding="@dimen/bottom_sheet_content_padding_small"
android:ellipsize="end" android:ellipsize="end"
@ -131,4 +164,4 @@
</LinearLayout> </LinearLayout>
</FrameLayout> </LinearLayout>

View file

@ -0,0 +1,109 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
android:layout_gravity="bottom"
android:background="?attr/bottom_menu_view_bg"
android:orientation="vertical">
<LinearLayout
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:orientation="horizontal">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="fill_horizontal"
android:layout_weight="1"
android:paddingTop="22dp"
android:paddingLeft="@dimen/list_content_padding"
android:paddingStart="@dimen/list_content_padding"
android:paddingRight="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding"
android:text="@string/wikivoyage_download_pics"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
android:textSize="@dimen/dialog_header_text_size"/>
</LinearLayout>
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="fill_horizontal"
android:layout_marginBottom="@dimen/dialog_content_margin"
android:layout_marginTop="@dimen/list_header_padding"
android:paddingLeft="@dimen/list_content_padding"
android:paddingStart="@dimen/list_content_padding"
android:paddingRight="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding"
android:text="@string/wikivoyage_download_pics_descr"
android:textSize="16sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/list_header_padding"
android:paddingStart="@dimen/list_header_padding"
android:paddingRight="@dimen/list_header_padding"
android:paddingEnd="@dimen/list_header_padding"
android:paddingBottom="@dimen/list_header_padding"
android:orientation="horizontal">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_no"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?attr/ctx_menu_controller_bg"
android:gravity="center"
android:padding="@dimen/context_menu_button_padding_x"
android:layout_marginRight="@dimen/list_header_padding"
android:layout_marginEnd="@dimen/list_header_padding"
osmand:typeface="@string/font_roboto_regular"
android:textSize="@dimen/default_list_text_size"
android:textColor="?attr/ctx_menu_controller_text_color"
android:text="@string/shared_string_dont"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_wifi"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?attr/ctx_menu_controller_bg"
android:gravity="center"
android:padding="@dimen/context_menu_button_padding_x"
android:layout_marginRight="@dimen/list_header_padding"
android:layout_marginEnd="@dimen/list_header_padding"
osmand:typeface="@string/font_roboto_regular"
android:textSize="@dimen/default_list_text_size"
android:textColor="?attr/ctx_menu_controller_text_color"
android:text="@string/shared_string_only_with_wifi"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_yes"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?attr/ctx_menu_controller_bg"
android:gravity="center"
android:padding="@dimen/context_menu_button_padding_x"
osmand:typeface="@string/font_roboto_regular"
android:textSize="@dimen/default_list_text_size"
android:textColor="?attr/ctx_menu_controller_text_color"
android:text="@string/shared_string_do"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View file

@ -41,6 +41,7 @@
android:layout_gravity="end" android:layout_gravity="end"
android:paddingLeft="@dimen/list_content_padding" android:paddingLeft="@dimen/list_content_padding"
android:paddingRight="@dimen/list_content_padding" android:paddingRight="@dimen/list_content_padding"
android:background="?attr/selectableItemBackground"
android:scaleType="center" android:scaleType="center"
tools:src="@drawable/ic_action_arrow_up" /> tools:src="@drawable/ic_action_arrow_up" />

View file

@ -9,10 +9,19 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). 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 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_dont">Don\'t</string>
<string name="shared_string_do">Do</string>
<string name="shared_string_only_with_wifi">Only with WiFi</string>
<string name="wikivoyage_download_pics">Download Pictures</string>
<string name="wikivoyage_download_pics_descr">We can download &amp; show images in the articles and store them on device, so you will access them while offline.
You can always change the setting in Explore > Options.</string>
<string name="shared_string_wifi_only">Only WiFi</string>
<string name="select_travel_book">Select travel book</string>
<string name="shared_string_travel_book">Travel book</string>
<string name="online_webpage_warning">This page is only available online. Do you wish to open it in a web browser?</string> <string name="online_webpage_warning">This page is only available online. Do you wish to open it in a web browser?</string>
<string name="images_cache">Images cache</string> <string name="images_cache">Images cache</string>
<string name="delete_search_history">Delete search history</string> <string name="delete_search_history">Delete search history</string>
<string name="show_images">Show images</string> <string name="download_images">Download images</string>
<string name="download_maps_travel">Travel maps</string> <string name="download_maps_travel">Travel maps</string>
<string name="shared_string_wikivoyage">Wikivoyage</string> <string name="shared_string_wikivoyage">Wikivoyage</string>
<string name="article_removed">Article removed</string> <string name="article_removed">Article removed</string>

View file

@ -47,7 +47,7 @@ import net.osmand.plus.voice.CommandPlayer;
import net.osmand.plus.voice.CommandPlayerException; import net.osmand.plus.voice.CommandPlayerException;
import net.osmand.plus.voice.MediaCommandPlayerImpl; import net.osmand.plus.voice.MediaCommandPlayerImpl;
import net.osmand.plus.voice.TTSCommandPlayerImpl; import net.osmand.plus.voice.TTSCommandPlayerImpl;
import net.osmand.plus.wikivoyage.data.WikivoyageDbHelper; import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.render.RenderingRulesStorage; import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.RoutingConfiguration; import net.osmand.router.RoutingConfiguration;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -445,7 +445,7 @@ public class AppInitializer implements IProgress {
app.mapMarkersDbHelper = startupInit(new MapMarkersDbHelper(app), MapMarkersDbHelper.class); app.mapMarkersDbHelper = startupInit(new MapMarkersDbHelper(app), MapMarkersDbHelper.class);
app.mapMarkersHelper = startupInit(new MapMarkersHelper(app), MapMarkersHelper.class); app.mapMarkersHelper = startupInit(new MapMarkersHelper(app), MapMarkersHelper.class);
app.searchUICore = startupInit(new QuickSearchHelper(app), QuickSearchHelper.class); app.searchUICore = startupInit(new QuickSearchHelper(app), QuickSearchHelper.class);
app.wikivoyageDbHelper = startupInit(new WikivoyageDbHelper(app), WikivoyageDbHelper.class); app.travelDbHelper = startupInit(new TravelDbHelper(app), TravelDbHelper.class);
initOpeningHoursParser(); initOpeningHoursParser();
} }

View file

@ -7,7 +7,6 @@ import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.support.annotation.ColorInt; import android.support.annotation.ColorInt;
import android.text.TextUtils; import android.text.TextUtils;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.data.LocationPoint; import net.osmand.data.LocationPoint;
@ -812,7 +811,7 @@ public class GPXUtilities {
return points.isEmpty(); return points.isEmpty();
} }
int getPointsSize() { public int getPointsSize() {
return points.size(); return points.size();
} }
@ -1210,8 +1209,13 @@ public class GPXUtilities {
public static String writeGpxFile(File fout, GPXFile file, OsmandApplication ctx) { public static String writeGpxFile(File fout, GPXFile file, OsmandApplication ctx) {
Writer output = null; Writer output = null;
try { try {
fout.getParentFile().mkdirs();
output = new OutputStreamWriter(new FileOutputStream(fout), "UTF-8"); //$NON-NLS-1$ output = new OutputStreamWriter(new FileOutputStream(fout), "UTF-8"); //$NON-NLS-1$
return writeGpx(output, file, ctx); String msg = writeGpx(output, file, ctx);
if(Algorithms.isEmpty(file.path)) {
file.path = fout.getAbsolutePath();
}
return msg;
} catch (IOException e) { } catch (IOException e) {
log.error("Error saving gpx", e); //$NON-NLS-1$ log.error("Error saving gpx", e); //$NON-NLS-1$
return ctx.getString(R.string.error_occurred_saving_gpx); return ctx.getString(R.string.error_occurred_saving_gpx);
@ -1286,8 +1290,10 @@ public class GPXUtilities {
} }
serializer.endTag(null, "gpx"); //$NON-NLS-1$ serializer.endTag(null, "gpx"); //$NON-NLS-1$
serializer.flush();
serializer.endDocument(); serializer.endDocument();
serializer.flush();
} catch (RuntimeException e) { } catch (RuntimeException e) {
log.error("Error saving gpx", e); //$NON-NLS-1$ log.error("Error saving gpx", e); //$NON-NLS-1$
return ctx.getString(R.string.error_occurred_saving_gpx); return ctx.getString(R.string.error_occurred_saving_gpx);
@ -1396,10 +1402,10 @@ public class GPXUtilities {
} catch (IOException e) { } catch (IOException e) {
} }
return file; return file;
} catch (FileNotFoundException e) { } catch (IOException e) {
GPXFile res = new GPXFile(); GPXFile res = new GPXFile();
res.path = f.getAbsolutePath(); res.path = f.getAbsolutePath();
log.error("Error reading gpx", e); //$NON-NLS-1$ log.error("Error reading gpx " + res.path, e); //$NON-NLS-1$
res.warning = ctx.getString(R.string.error_reading_gpx); res.warning = ctx.getString(R.string.error_reading_gpx);
return res; return res;
} finally { } finally {

View file

@ -6,7 +6,6 @@ import android.support.annotation.IntDef;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint;
@ -20,6 +19,8 @@ import net.osmand.plus.GeocodingLookupService.AddressLookupRequest;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper; import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.mapmarkers.MarkersPlanRouteContext; import net.osmand.plus.mapmarkers.MarkersPlanRouteContext;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
@ -498,6 +499,26 @@ public class MapMarkersHelper {
return res; return res;
} }
@NonNull
public List<MapMarkersGroup> getGroupsForSavedArticlesTravelBook() {
List<MapMarkersGroup> res = new ArrayList<>();
TravelDbHelper travelDbHelper = ctx.getTravelDbHelper();
if(travelDbHelper.getSelectedTravelBook() != null) {
List<TravelArticle> savedArticles = travelDbHelper.getLocalDataHelper().getSavedArticles();
for (TravelArticle art : savedArticles) {
String gpxName = travelDbHelper.getGPXName(art);
File path = ctx.getAppPath(IndexConstants.GPX_TRAVEL_DIR + gpxName);
MapMarkersGroup group = getOrCreateGroup(new File(path.getAbsolutePath()));
if (!isGroupSynced(group.getId())) {
group.disabled = true;
createHeaderInGroup(group);
res.add(group);
}
}
}
return res;
}
@Nullable @Nullable
public MapMarker getMapMarker(WptPt wptPt) { public MapMarker getMapMarker(WptPt wptPt) {
for (MapMarker marker : mapMarkers) { for (MapMarker marker : mapMarkers) {

View file

@ -56,7 +56,7 @@ import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.search.QuickSearchHelper; import net.osmand.plus.search.QuickSearchHelper;
import net.osmand.plus.voice.CommandPlayer; import net.osmand.plus.voice.CommandPlayer;
import net.osmand.plus.wikivoyage.data.WikivoyageDbHelper; import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.router.RoutingConfiguration; import net.osmand.router.RoutingConfiguration;
import net.osmand.search.SearchUICore; import net.osmand.search.SearchUICore;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -119,7 +119,7 @@ public class OsmandApplication extends MultiDexApplication {
OsmandRegions regions; OsmandRegions regions;
GeocodingLookupService geocodingLookupService; GeocodingLookupService geocodingLookupService;
QuickSearchHelper searchUICore; QuickSearchHelper searchUICore;
WikivoyageDbHelper wikivoyageDbHelper; TravelDbHelper travelDbHelper;
RoutingConfiguration.Builder defaultRoutingConfig; RoutingConfiguration.Builder defaultRoutingConfig;
private Locale preferredLocale = null; private Locale preferredLocale = null;
@ -392,8 +392,8 @@ public class OsmandApplication extends MultiDexApplication {
return searchUICore; return searchUICore;
} }
public WikivoyageDbHelper getWikivoyageDbHelper() { public TravelDbHelper getTravelDbHelper() {
return wikivoyageDbHelper; return travelDbHelper;
} }
public CommandPlayer getPlayer() { public CommandPlayer getPlayer() {

View file

@ -717,7 +717,8 @@ public class OsmandSettings {
public final CommonPreference<Boolean> SHOW_LINES_TO_FIRST_MARKERS = new BooleanPreference("show_lines_to_first_markers", false).makeProfile(); public final CommonPreference<Boolean> SHOW_LINES_TO_FIRST_MARKERS = new BooleanPreference("show_lines_to_first_markers", false).makeProfile();
public final CommonPreference<Boolean> SHOW_ARROWS_TO_FIRST_MARKERS = new BooleanPreference("show_arrows_to_first_markers", false).makeProfile(); public final CommonPreference<Boolean> SHOW_ARROWS_TO_FIRST_MARKERS = new BooleanPreference("show_arrows_to_first_markers", false).makeProfile();
public final CommonPreference<Boolean> WIKIVOYAGE_SHOW_IMAGES = new BooleanPreference("wikivoyage_show_images", false); public final CommonPreference<Boolean> WIKIVOYAGE_SHOW_IMAGES_ASKED = new BooleanPreference("wikivoyage_show_images_asked", false).makeGlobal();
public final CommonPreference<WikivoyageShowImages> WIKIVOYAGE_SHOW_IMAGES = new EnumIntPreference<>("wikivoyage_show_imgs", WikivoyageShowImages.OFF, WikivoyageShowImages.values()).makeGlobal();
public final CommonPreference<Boolean> SELECT_MARKER_ON_SINGLE_TAP = new BooleanPreference("select_marker_on_single_tap", false).makeProfile(); public final CommonPreference<Boolean> SELECT_MARKER_ON_SINGLE_TAP = new BooleanPreference("select_marker_on_single_tap", false).makeProfile();
@ -3310,4 +3311,17 @@ public class OsmandSettings {
SECOND, SECOND,
EMPTY EMPTY
} }
public enum WikivoyageShowImages {
ON(R.string.shared_string_on),
OFF(R.string.shared_string_off),
WIFI(R.string.shared_string_wifi_only);
public final int name;
WikivoyageShowImages(int name) {
this.name = name;
}
}
} }

View file

@ -63,7 +63,7 @@ import net.osmand.plus.views.MapControlsLayer;
import net.osmand.plus.views.MapTileLayer; import net.osmand.plus.views.MapTileLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.wikivoyage.explore.WikivoyageExploreDialogFragment; import net.osmand.plus.wikivoyage.explore.WikivoyageExploreDialogFragment;
import net.osmand.plus.wikivoyage.data.WikivoyageDbHelper; import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.router.GeneralRouter; import net.osmand.router.GeneralRouter;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -771,7 +771,7 @@ public class MapActivityActions implements DialogProvider {
.setListener(new ItemClickListener() { .setListener(new ItemClickListener() {
@Override @Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) { public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
getMyApplication().getWikivoyageDbHelper().initTravelBooks(); getMyApplication().getTravelDbHelper().initTravelBooks();
MapActivity.clearPrevActivityIntent(); MapActivity.clearPrevActivityIntent();
WikivoyageExploreDialogFragment.showInstance(mapActivity.getSupportFragmentManager()); WikivoyageExploreDialogFragment.showInstance(mapActivity.getSupportFragmentManager());
return true; return true;

View file

@ -72,11 +72,13 @@ public class TrackActivity extends TabActivity {
finish(); finish();
return; return;
} }
file = null; if (intent.hasExtra(TRACK_FILE_NAME)) {
file = new File(intent.getStringExtra(TRACK_FILE_NAME));
}
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
if (actionBar != null) { if (actionBar != null) {
if (intent.hasExtra(TRACK_FILE_NAME)) { if(file != null) {
file = new File(intent.getStringExtra(TRACK_FILE_NAME));
String fn = file.getName().replace(".gpx", "").replace("/", " ").replace("_", " "); String fn = file.getName().replace(".gpx", "").replace("/", " ").replace("_", " ");
actionBar.setTitle(fn); actionBar.setTitle(fn);
} else { } else {

View file

@ -250,7 +250,7 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
return nightMode ? R.drawable.bg_bottom_sheet_sides_landscape_dark : R.drawable.bg_bottom_sheet_sides_landscape_light; return nightMode ? R.drawable.bg_bottom_sheet_sides_landscape_dark : R.drawable.bg_bottom_sheet_sides_landscape_light;
} }
protected boolean isNightMode() { private boolean isNightMode() {
if (usedOnMap) { if (usedOnMap) {
return getMyApplication().getDaynightHelper().isNightModeForMapControls(); return getMyApplication().getDaynightHelper().isNightModeForMapControls();
} }

View file

@ -17,6 +17,7 @@ import android.view.View;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmAndLocationSimulation; import net.osmand.plus.OsmAndLocationSimulation;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.SettingsBaseActivity; import net.osmand.plus.activities.SettingsBaseActivity;
import net.osmand.plus.activities.actions.AppModeDialog; import net.osmand.plus.activities.actions.AppModeDialog;
@ -70,10 +71,13 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
getMyApplication().getAppInitializer().resetFirstTimeRun(); getMyApplication().getAppInitializer().resetFirstTimeRun();
getMyApplication().getSettings().FIRST_MAP_IS_DOWNLOADED.set(false); OsmandSettings settings = getMyApplication().getSettings();
getMyApplication().getSettings().MAPILLARY_FIRST_DIALOG_SHOWN.set(false); settings.FIRST_MAP_IS_DOWNLOADED.set(false);
getMyApplication().getSettings().WEBGL_SUPPORTED.set(true); settings.MAPILLARY_FIRST_DIALOG_SHOWN.set(false);
getMyApplication().getSettings().METRIC_SYSTEM_CHANGED_MANUALLY.set(false); settings.WEBGL_SUPPORTED.set(true);
settings.METRIC_SYSTEM_CHANGED_MANUALLY.set(false);
settings.WIKIVOYAGE_SHOW_IMAGES_ASKED.set(false);
getMyApplication().showToastMessage(R.string.shared_string_ok); getMyApplication().showToastMessage(R.string.shared_string_ok);
return true; return true;
} }

View file

@ -93,6 +93,7 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter<RecyclerView.V
helper.updateGroups(); helper.updateGroups();
List<MapMarkersGroup> groups = new ArrayList<>(helper.getMapMarkersGroups()); List<MapMarkersGroup> groups = new ArrayList<>(helper.getMapMarkersGroups());
groups.addAll(helper.getGroupsForDisplayedGpx()); groups.addAll(helper.getGroupsForDisplayedGpx());
groups.addAll(helper.getGroupsForSavedArticlesTravelBook());
for (int i = 0; i < groups.size(); i++) { for (int i = 0; i < groups.size(); i++) {
MapMarkersGroup group = groups.get(i); MapMarkersGroup group = groups.get(i);
if (!group.isVisible()) { if (!group.isVisible()) {

View file

@ -449,14 +449,18 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
}); });
if (!MenuItemCompat.isActionViewExpanded(mi)) { if (!MenuItemCompat.isActionViewExpanded(mi)) {
final MapMarkersHelper markersHelper = app.getMapMarkersHelper();
final MapMarkersGroup markersGr = markersHelper.getOrCreateGroup(getGpxDataItem().getFile());
final boolean synced = markersHelper.isGroupSynced(markersGr.getId());
createMenuItem(menu, SHARE_ID, R.string.shared_string_share, R.drawable.ic_action_gshare_dark, createMenuItem(menu, SHARE_ID, R.string.shared_string_share, R.drawable.ic_action_gshare_dark,
R.drawable.ic_action_gshare_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER); R.drawable.ic_action_gshare_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER);
createMenuItem(menu, SELECT_MAP_MARKERS_ID, synced ? R.string.remove_from_map_markers : R.string.shared_string_add_to_map_markers, R.drawable.ic_action_flag_dark, if (getGpx().path != null) {
R.drawable.ic_action_flag_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER); final MapMarkersHelper markersHelper = app.getMapMarkersHelper();
final MapMarkersGroup markersGr = markersHelper.getOrCreateGroup(new File(getGpx().path));
final boolean synced = markersHelper.isGroupSynced(markersGr.getId());
createMenuItem(menu, SELECT_MAP_MARKERS_ID, synced ? R.string.remove_from_map_markers
: R.string.shared_string_add_to_map_markers, R.drawable.ic_action_flag_dark,
R.drawable.ic_action_flag_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER);
}
createMenuItem(menu, SELECT_FAVORITES_ID, R.string.shared_string_add_to_favorites, R.drawable.ic_action_fav_dark, createMenuItem(menu, SELECT_FAVORITES_ID, R.string.shared_string_add_to_favorites, R.drawable.ic_action_fav_dark,
R.drawable.ic_action_fav_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER); R.drawable.ic_action_fav_dark, MenuItemCompat.SHOW_AS_ACTION_NEVER);
createMenuItem(menu, DELETE_ID, R.string.shared_string_delete, R.drawable.ic_action_delete_dark, createMenuItem(menu, DELETE_ID, R.string.shared_string_delete, R.drawable.ic_action_delete_dark,

View file

@ -0,0 +1,66 @@
package net.osmand.plus.wikivoyage;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings.WikivoyageShowImages;
import net.osmand.plus.R;
import net.osmand.plus.base.BottomSheetDialogFragment;
public class WikivoyageShowPicturesDialogFragment extends BottomSheetDialogFragment {
public static final String TAG = WikivoyageShowPicturesDialogFragment.class.getSimpleName();
public static final int SHOW_PICTURES_CHANGED = 1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_wikivoyage_show_images_first_time, container, false);
view.findViewById(R.id.button_no).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OsmandApplication app = getMyApplication();
if (app != null) {
app.getSettings().WIKIVOYAGE_SHOW_IMAGES.set(WikivoyageShowImages.OFF);
}
sendResult();
dismiss();
}
});
view.findViewById(R.id.button_wifi).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OsmandApplication app = getMyApplication();
if (app != null) {
app.getSettings().WIKIVOYAGE_SHOW_IMAGES.set(WikivoyageShowImages.WIFI);
}
sendResult();
dismiss();
}
});
view.findViewById(R.id.button_yes).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OsmandApplication app = getMyApplication();
if (app != null) {
app.getSettings().WIKIVOYAGE_SHOW_IMAGES.set(WikivoyageShowImages.ON);
}
sendResult();
dismiss();
}
});
return view;
}
private void sendResult() {
Fragment fragment = getTargetFragment();
if (fragment != null) {
fragment.onActivityResult(getTargetRequestCode(), SHOW_PICTURES_CHANGED, null);
}
}
}

View file

@ -0,0 +1,24 @@
package net.osmand.plus.wikivoyage;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.RequestCreator;
import net.osmand.plus.OsmandSettings;
public class WikivoyageUtils {
public static void setupNetworkPolicy(OsmandSettings settings, RequestCreator rc) {
switch (settings.WIKIVOYAGE_SHOW_IMAGES.get()) {
case ON:
break;
case OFF:
rc.networkPolicy(NetworkPolicy.OFFLINE);
break;
case WIFI:
if (!settings.isWifiConnected()) {
rc.networkPolicy(NetworkPolicy.OFFLINE);
}
break;
}
}
}

View file

@ -1,4 +1,4 @@
package net.osmand.plus.wikivoyage.data; package net.osmand.plus.wikivoyage;
import android.content.Context; import android.content.Context;
@ -22,7 +22,7 @@ import java.net.URLDecoder;
* Custom WebView client to handle the internal links. * Custom WebView client to handle the internal links.
*/ */
public class CustomWebViewClient extends WebViewClient { public class WikivoyageWebViewClient extends WebViewClient {
private OsmandApplication app; private OsmandApplication app;
private FragmentManager mFragmentManager; private FragmentManager mFragmentManager;
@ -31,7 +31,7 @@ public class CustomWebViewClient extends WebViewClient {
private static final String PAGE_PREFIX = "https://"; private static final String PAGE_PREFIX = "https://";
private static final String WEB_DOMAIN = ".wikivoyage.com/wiki/"; private static final String WEB_DOMAIN = ".wikivoyage.com/wiki/";
public CustomWebViewClient(FragmentActivity context, FragmentManager fm) { public WikivoyageWebViewClient(FragmentActivity context, FragmentManager fm) {
app = (OsmandApplication) context.getApplication(); app = (OsmandApplication) context.getApplication();
mFragmentManager = fm; mFragmentManager = fm;
mContext = context; mContext = context;
@ -48,7 +48,7 @@ public class CustomWebViewClient extends WebViewClient {
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
e.printStackTrace(); e.printStackTrace();
} }
long articleId = app.getWikivoyageDbHelper().getArticleId(articleName, lang); long articleId = app.getTravelDbHelper().getArticleId(articleName, lang);
if (articleId != 0) { if (articleId != 0) {
WikivoyageArticleDialogFragment.showInstance(app, mFragmentManager, WikivoyageArticleDialogFragment.showInstance(app, mFragmentManager,
articleId, lang); articleId, lang);
@ -63,6 +63,7 @@ public class CustomWebViewClient extends WebViewClient {
private void warnAboutExternalLoad(final String url) { private void warnAboutExternalLoad(final String url) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext); AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(url);
builder.setMessage(R.string.online_webpage_warning); builder.setMessage(R.string.online_webpage_warning);
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override @Override

View file

@ -29,6 +29,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag
public static final String CONTENTS_JSON_KEY = "contents_json"; public static final String CONTENTS_JSON_KEY = "contents_json";
public static final String CONTENTS_LINK_KEY = "contents_link"; public static final String CONTENTS_LINK_KEY = "contents_link";
public static final String CONTENTS_TITLE_KEY = "title";
public static final int REQUEST_LINK_CODE = 0; public static final int REQUEST_LINK_CODE = 0;
@ -70,19 +71,23 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag
@Override @Override
public boolean onChildClick(ExpandableListView parent, View v, public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) { int groupPosition, int childPosition, long id) {
String link = contentItem.getSubItems().get(groupPosition).getSubItems().get(childPosition).getLink(); WikivoyageContentItem wikivoyageContentItem = contentItem.getSubItems().get(groupPosition);
sendResult(link); String link = wikivoyageContentItem.getSubItems().get(childPosition).getLink();
String name = wikivoyageContentItem.getLink().substring(1);
sendResults(link, name);
dismiss(); dismiss();
return false; return true;
} }
}); });
expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override @Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
String link = contentItem.getSubItems().get(groupPosition).getLink(); WikivoyageContentItem wikivoyageContentItem = contentItem.getSubItems().get(groupPosition);
sendResult(link); String link = wikivoyageContentItem.getLink();
String name = wikivoyageContentItem.getLink().substring(1);
sendResults(link, name);
dismiss(); dismiss();
return false; return true;
} }
}); });
LinearLayout container = new LinearLayout(getContext()); LinearLayout container = new LinearLayout(getContext());
@ -91,9 +96,10 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag
items.add(new SimpleBottomSheetItem.Builder().setCustomView(container).create()); items.add(new SimpleBottomSheetItem.Builder().setCustomView(container).create());
} }
private void sendResult(String link) { private void sendResults(String link, String name) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(CONTENTS_LINK_KEY, link); intent.putExtra(CONTENTS_LINK_KEY, link);
intent.putExtra(CONTENTS_TITLE_KEY, name);
Fragment fragment = getTargetFragment(); Fragment fragment = getTargetFragment();
if (fragment != null) { if (fragment != null) {
fragment.onActivityResult(getTargetRequestCode(), REQUEST_LINK_CODE, intent); fragment.onActivityResult(getTargetRequestCode(), REQUEST_LINK_CODE, intent);
@ -155,7 +161,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag
} }
TextView txtListChild = (TextView) convertView.findViewById(R.id.item_label); TextView txtListChild = (TextView) convertView.findViewById(R.id.item_label);
txtListChild.setText(childText); txtListChild.setText(childText);
txtListChild.setTextColor(getResolvedColor(nightMode txtListChild.setTextColor(ContextCompat.getColor(context, nightMode
? R.color.wikivoyage_contents_parent_icon_dark ? R.color.wikivoyage_contents_parent_icon_dark
: R.color.wikivoyage_contents_parent_icon_light)); : R.color.wikivoyage_contents_parent_icon_light));
txtListChild.setCompoundDrawablesWithIntrinsicBounds(itemChildIcon, null, null, null); txtListChild.setCompoundDrawablesWithIntrinsicBounds(itemChildIcon, null, null, null);
@ -202,7 +208,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag
} }
TextView lblListHeader = (TextView) convertView.findViewById(R.id.item_label); TextView lblListHeader = (TextView) convertView.findViewById(R.id.item_label);
lblListHeader.setText(headerTitle); lblListHeader.setText(headerTitle);
lblListHeader.setTextColor(getResolvedColor(isNightMode() ? R.color.wikivoyage_contents_parent_icon_dark : R.color.wikivoyage_contents_parent_icon_light)); lblListHeader.setTextColor(ContextCompat.getColor(context, nightMode ? R.color.wikivoyage_contents_parent_icon_dark : R.color.wikivoyage_contents_parent_icon_light));
lblListHeader.setCompoundDrawablesWithIntrinsicBounds(itemGroupIcon, null, null, null); lblListHeader.setCompoundDrawablesWithIntrinsicBounds(itemGroupIcon, null, null, null);
adjustIndicator(getMyApplication(), groupPosition, isExpanded, convertView, !nightMode); adjustIndicator(getMyApplication(), groupPosition, isExpanded, convertView, !nightMode);

View file

@ -8,6 +8,7 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.widget.PopupMenu; import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
@ -23,12 +24,19 @@ import android.widget.TextView;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.WikivoyageShowImages;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment; import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment;
import net.osmand.plus.wikivoyage.data.CustomWebViewClient; import net.osmand.plus.wikivoyage.WikivoyageShowPicturesDialogFragment;
import net.osmand.plus.wikivoyage.data.WikivoyageArticle; import net.osmand.plus.wikivoyage.WikivoyageWebViewClient;
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper; import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
@ -48,19 +56,58 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" +
"<meta http-equiv=\"cleartype\" content=\"on\" />\n" + "<meta http-equiv=\"cleartype\" content=\"on\" />\n" +
"<link href=\"article_style.css\" type=\"text/css\" rel=\"stylesheet\"/>\n" + "<link href=\"article_style.css\" type=\"text/css\" rel=\"stylesheet\"/>\n" +
"</head><body>\n" + "<script>" + "function scrollAnchor(id) {" + "</head><body>\n";
"window.location.hash = id;}</script>"; private static final String FOOTER_INNER = "<script>var coll = document.getElementsByTagName(\"H2\");" +
private static final String FOOTER_INNER = "</div></body></html>"; "var i;" +
"for (i = 0; i < coll.length; i++) {" +
" coll[i].addEventListener(\"click\", function() {" +
" this.classList.toggle(\"active\");" +
" var content = this.nextElementSibling;" +
" if (content.style.display === \"block\") {" +
" content.style.display = \"none\";" +
" } else {" +
" content.style.display = \"block\";" +
" }" +
" });" +
"}" + "function scrollAnchor(id, title) {" +
"openContent(title);" +
"window.location.hash = id;}\n" +
"function openContent(id) {\n" +
" var doc = document.getElementById(id).parentElement;\n" +
" doc.classList.toggle(\"active\");\n" +
" var content = doc.nextElementSibling;\n" +
" content.style.display = \"block\";\n" +
" collapseActive(doc);" +
"}" +
"function collapseActive(doc) {" +
" var coll = document.getElementsByTagName(\"H2\");" +
" var i;" +
" for (i = 0; i < coll.length; i++) {" +
" var item = coll[i];" +
" if (item != doc && item.classList.contains(\"active\")) {" +
" item.classList.toggle(\"active\");" +
" var content = item.nextElementSibling;" +
" if (content.style.display === \"block\") {" +
" content.style.display = \"none\";" +
" }" +
" }" +
" }" +
"}</script>"
+ "</body></html>";
private long cityId = NO_VALUE; private long cityId = NO_VALUE;
private ArrayList<String> langs; private ArrayList<String> langs;
private String selectedLang; private String selectedLang;
private WikivoyageArticle article; private TravelArticle article;
private TextView trackButton;
private TextView selectedLangTv; private TextView selectedLangTv;
private TextView saveBtn; private TextView saveBtn;
private WebView contentWebView; private WebView contentWebView;
private TextView articleToolbarText;
@SuppressLint("SetJavaScriptEnabled") @SuppressLint("SetJavaScriptEnabled")
@Nullable @Nullable
@Override @Override
@ -78,6 +125,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
setupToolbar((Toolbar) mainView.findViewById(R.id.toolbar)); setupToolbar((Toolbar) mainView.findViewById(R.id.toolbar));
articleToolbarText = (TextView) mainView.findViewById(R.id.article_toolbar_text);
ColorStateList selectedLangColorStateList = AndroidUtils.createPressedColorStateList( ColorStateList selectedLangColorStateList = AndroidUtils.createPressedColorStateList(
getContext(), nightMode, getContext(), nightMode,
R.color.icon_color, R.color.wikivoyage_active_light, R.color.icon_color, R.color.wikivoyage_active_light,
@ -112,18 +160,45 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
WikivoyageArticleContentsFragment fragment = new WikivoyageArticleContentsFragment(); WikivoyageArticleContentsFragment fragment = new WikivoyageArticleContentsFragment();
fragment.setUsedOnMap(false); fragment.setUsedOnMap(false);
fragment.setArguments(args); fragment.setArguments(args);
fragment.setTargetFragment(WikivoyageArticleDialogFragment.this, 0); fragment.setTargetFragment(WikivoyageArticleDialogFragment.this, WikivoyageArticleContentsFragment.REQUEST_LINK_CODE);
fragment.show(fm, WikivoyageArticleContentsFragment.TAG); fragment.show(fm, WikivoyageArticleContentsFragment.TAG);
} }
}); });
trackButton = (TextView) mainView.findViewById(R.id.gpx_button);
trackButton.setCompoundDrawablesWithIntrinsicBounds(
getActiveIcon(R.drawable.ic_action_track_16), null, null, null
);
trackButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
if (article == null || fm == null) {
return;
}
final GPXFile gpx = article.getGpxFile();
TravelDbHelper dbHelper = getMyApplication().getTravelDbHelper();
File file = getMyApplication().getAppPath(IndexConstants.GPX_TRAVEL_DIR + dbHelper.getGPXName(article));
GPXUtilities.writeGpxFile(file, gpx, getMyApplication());
Bundle args = new Bundle();
args.putString(WikivoyageArticleContentsFragment.CONTENTS_JSON_KEY, article.getContentsJson());
Intent newIntent = new Intent(getActivity(), getMyApplication().getAppCustomization().getTrackActivity());
newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, gpx.path);
// newIntent.putExtra(TrackActivity.OPEN_POINTS_TAB, true);
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);
}
});
saveBtn = (TextView) mainView.findViewById(R.id.save_button); saveBtn = (TextView) mainView.findViewById(R.id.save_button);
boolean showImages = getSettings().WIKIVOYAGE_SHOW_IMAGES.get();
contentWebView = (WebView) mainView.findViewById(R.id.content_web_view); contentWebView = (WebView) mainView.findViewById(R.id.content_web_view);
contentWebView.getSettings().setJavaScriptEnabled(true); WebSettings webSettings = contentWebView.getSettings();
contentWebView.getSettings().setCacheMode(showImages ? WebSettings.LOAD_DEFAULT : WebSettings.LOAD_CACHE_ONLY); webSettings.setJavaScriptEnabled(true);
contentWebView.setWebViewClient(new CustomWebViewClient(getActivity(), getFragmentManager())); updateWebSettings();
contentWebView.setWebViewClient(new WikivoyageWebViewClient(getActivity(), getFragmentManager()));
return mainView; return mainView;
} }
@ -144,7 +219,27 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == WikivoyageArticleContentsFragment.REQUEST_LINK_CODE) { if (requestCode == WikivoyageArticleContentsFragment.REQUEST_LINK_CODE) {
String link = data.getStringExtra(WikivoyageArticleContentsFragment.CONTENTS_LINK_KEY); String link = data.getStringExtra(WikivoyageArticleContentsFragment.CONTENTS_LINK_KEY);
moveToAnchor(link); String title = data.getStringExtra(WikivoyageArticleContentsFragment.CONTENTS_TITLE_KEY);
moveToAnchor(link, title);
} else if (requestCode == WikivoyageShowPicturesDialogFragment.SHOW_PICTURES_CHANGED) {
updateWebSettings();
populateArticle();
}
}
@Override
public void onResume() {
super.onResume();
OsmandSettings settings = getMyApplication().getSettings();
if (!settings.WIKIVOYAGE_SHOW_IMAGES_ASKED.get()) {
FragmentActivity activity = getActivity();
FragmentManager fm = getFragmentManager();
if (activity != null && fm != null) {
WikivoyageShowPicturesDialogFragment fragment = new WikivoyageShowPicturesDialogFragment();
fragment.setTargetFragment(this, WikivoyageShowPicturesDialogFragment.SHOW_PICTURES_CHANGED);
fragment.show(fm, WikivoyageShowPicturesDialogFragment.TAG);
settings.WIKIVOYAGE_SHOW_IMAGES_ASKED.set(true);
}
} }
} }
@ -153,9 +248,26 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
return nightMode ? R.color.status_bar_wikivoyage_article_dark : R.color.status_bar_wikivoyage_article_light; return nightMode ? R.color.status_bar_wikivoyage_article_dark : R.color.status_bar_wikivoyage_article_light;
} }
private void updateWebSettings() {
WikivoyageShowImages showImages = getSettings().WIKIVOYAGE_SHOW_IMAGES.get();
WebSettings webSettings = contentWebView.getSettings();
switch (showImages) {
case ON:
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
break;
case OFF:
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
break;
case WIFI:
webSettings.setCacheMode(getMyApplication().getSettings().isWifiConnected() ?
WebSettings.LOAD_DEFAULT : WebSettings.LOAD_CACHE_ONLY);
break;
}
}
private void updateSaveButton() { private void updateSaveButton() {
if (article != null) { if (article != null) {
final WikivoyageLocalDataHelper helper = WikivoyageLocalDataHelper.getInstance(getMyApplication()); final TravelLocalDataHelper helper = getMyApplication().getTravelDbHelper().getLocalDataHelper();
final boolean saved = helper.isArticleSaved(article); final boolean saved = helper.isArticleSaved(article);
Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later); Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later);
saveBtn.setText(getString(saved ? R.string.shared_string_delete : R.string.shared_string_save)); saveBtn.setText(getString(saved ? R.string.shared_string_delete : R.string.shared_string_save));
@ -213,30 +325,35 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
if (selectedLang == null) { if (selectedLang == null) {
selectedLang = langs.get(0); selectedLang = langs.get(0);
} }
articleToolbarText.setText("");
article = getMyApplication().getWikivoyageDbHelper().getArticle(cityId, selectedLang); article = getMyApplication().getTravelDbHelper().getArticle(cityId, selectedLang);
if (article == null) { if (article == null) {
return; return;
} }
articleToolbarText.setText(article.getTitle());
if(article.getGpxFile() != null) {
trackButton.setText(getString(R.string.points) + " (" + article.getGpxFile().getPointsSize() +")");
}
WikivoyageLocalDataHelper.getInstance(getMyApplication()).addToHistory(article); TravelLocalDataHelper ldh = getMyApplication().getTravelDbHelper().getLocalDataHelper();
ldh.addToHistory(article);
updateSaveButton(); updateSaveButton();
selectedLangTv.setText(Algorithms.capitalizeFirstLetter(selectedLang)); selectedLangTv.setText(Algorithms.capitalizeFirstLetter(selectedLang));
contentWebView.loadDataWithBaseURL(getBaseUrl(), createHtmlContent(article), "text/html", "UTF-8", null); contentWebView.loadDataWithBaseURL(getBaseUrl(), createHtmlContent(article), "text/html", "UTF-8", null);
} }
private void moveToAnchor(String id) { private void moveToAnchor(String id, String title) {
contentWebView.loadUrl("javascript:scrollAnchor(\"" + id + "\")"); contentWebView.loadUrl("javascript:scrollAnchor(\"" + id + "\", \"" + title.trim() + "\")");
} }
@NonNull @NonNull
private String createHtmlContent(@NonNull WikivoyageArticle article) { private String createHtmlContent(@NonNull TravelArticle article) {
StringBuilder sb = new StringBuilder(HEADER_INNER); StringBuilder sb = new StringBuilder(HEADER_INNER);
String imageTitle = article.getImageTitle(); String imageTitle = article.getImageTitle();
if (!TextUtils.isEmpty(imageTitle)) { if (!TextUtils.isEmpty(imageTitle)) {
String url = WikivoyageArticle.getImageUrl(imageTitle, false); String url = TravelArticle.getImageUrl(imageTitle, false);
sb.append("<div class=\"title-image\" style=\"background-image: url(").append(url).append(")\"></div>"); sb.append("<div class=\"title-image\" style=\"background-image: url(").append(url).append(")\"></div>");
} }
sb.append("<div class=\"main\">\n"); sb.append("<div class=\"main\">\n");
@ -270,7 +387,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
@NonNull FragmentManager fm, @NonNull FragmentManager fm,
long cityId, long cityId,
@Nullable String selectedLang) { @Nullable String selectedLang) {
ArrayList<String> langs = app.getWikivoyageDbHelper().getArticleLangs(cityId); ArrayList<String> langs = app.getTravelDbHelper().getArticleLangs(cityId);
return showInstance(fm, cityId, langs, selectedLang); return showInstance(fm, cityId, langs, selectedLang);
} }

View file

@ -11,7 +11,7 @@ import net.osmand.plus.GPXUtilities.GPXFile;
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
public class WikivoyageArticle { public class TravelArticle {
private static final String IMAGE_ROOT_URL = "https://upload.wikimedia.org/wikipedia/commons/"; private static final String IMAGE_ROOT_URL = "https://upload.wikimedia.org/wikipedia/commons/";
private static final String THUMB_PREFIX = "320px-"; private static final String THUMB_PREFIX = "320px-";

View file

@ -7,12 +7,16 @@ import net.osmand.CollatorStringMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.CollatorStringMatcher.StringMatcherMode;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.OsmAndCollator; import net.osmand.OsmAndCollator;
import net.osmand.PlatformUtil;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -21,9 +25,13 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import org.apache.commons.logging.Log;
import gnu.trove.map.hash.TLongObjectHashMap; import gnu.trove.map.hash.TLongObjectHashMap;
public class WikivoyageDbHelper { public class TravelDbHelper {
private static final Log LOG = PlatformUtil.getLog(TravelDbHelper.class);
private static final String ARTICLES_TABLE_NAME = "wikivoyage_articles"; private static final String ARTICLES_TABLE_NAME = "wikivoyage_articles";
private static final String ARTICLES_COL_ID = "article_id"; private static final String ARTICLES_COL_ID = "article_id";
@ -67,16 +75,32 @@ public class WikivoyageDbHelper {
private File selectedTravelBook = null; private File selectedTravelBook = null;
private List<File> existingTravelBooks = new ArrayList<>(); private List<File> existingTravelBooks = new ArrayList<>();
private Collator collator; private Collator collator;
private TravelLocalDataHelper localDataHelper;
private boolean initialized = false;
public WikivoyageDbHelper(OsmandApplication application) {
public TravelDbHelper(OsmandApplication application) {
this.application = application; this.application = application;
collator = OsmAndCollator.primaryCollator(); collator = OsmAndCollator.primaryCollator();
if(application.getSettings().SELECTED_TRAVEL_BOOK.get() != null) {
initTravelBooks();
}
}
public TravelLocalDataHelper getLocalDataHelper() {
initTravelBooks();
return localDataHelper;
} }
public void initTravelBooks() { public void initTravelBooks() {
if(initialized) {
return;
}
initialized = true;
File[] possibleFiles = application.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).listFiles(); File[] possibleFiles = application.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).listFiles();
String travelBook = application.getSettings().SELECTED_TRAVEL_BOOK.get(); String travelBook = application.getSettings().SELECTED_TRAVEL_BOOK.get();
existingTravelBooks.clear(); existingTravelBooks.clear();
localDataHelper = new TravelLocalDataHelper(application);
if (possibleFiles != null) { if (possibleFiles != null) {
for (File f : possibleFiles) { for (File f : possibleFiles) {
if (f.getName().endsWith(IndexConstants.BINARY_WIKIVOYAGE_MAP_INDEX_EXT)) { if (f.getName().endsWith(IndexConstants.BINARY_WIKIVOYAGE_MAP_INDEX_EXT)) {
@ -108,7 +132,17 @@ public class WikivoyageDbHelper {
return connection; return connection;
} }
public void closeConnection() { public void selectTravelBook(File f) {
closeConnection();
if (f.exists()) {
connection = application.getSQLiteAPI().openByAbsolutePath(f.getAbsolutePath(), true);
selectedTravelBook = f;
application.getSettings().SELECTED_TRAVEL_BOOK.set(selectedTravelBook.getName());
localDataHelper.refreshCachedData();
}
}
private void closeConnection() {
if (connection != null) { if (connection != null) {
connection.close(); connection.close();
connection = null; connection = null;
@ -209,8 +243,8 @@ public class WikivoyageDbHelper {
} }
@Nullable @Nullable
public WikivoyageArticle getArticle(long cityId, String lang) { public TravelArticle getArticle(long cityId, String lang) {
WikivoyageArticle res = null; TravelArticle res = null;
SQLiteConnection conn = openConnection(); SQLiteConnection conn = openConnection();
if (conn != null) { if (conn != null) {
SQLiteCursor cursor = conn.rawQuery(ARTICLES_TABLE_SELECT + " WHERE " + ARTICLES_COL_CITY_ID + " = ? AND " SQLiteCursor cursor = conn.rawQuery(ARTICLES_TABLE_SELECT + " WHERE " + ARTICLES_COL_CITY_ID + " = ? AND "
@ -263,41 +297,49 @@ public class WikivoyageDbHelper {
} while (cursor.moveToNext()); } while (cursor.moveToNext());
} }
cursor.close(); cursor.close();
} }
return res; return res;
} }
@NonNull @NonNull
private WikivoyageArticle readArticle(SQLiteCursor cursor) { private TravelArticle readArticle(SQLiteCursor cursor) {
WikivoyageArticle res = new WikivoyageArticle(); TravelArticle res = new TravelArticle();
res.id = cursor.getString(0); res.id = cursor.getString(0);
res.title = cursor.getString(1); res.title = cursor.getString(1);
try { try {
res.content = Algorithms.gzipToString(cursor.getBlob(2)); res.content = Algorithms.gzipToString(cursor.getBlob(2));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOG.error(e.getMessage(), e);
} }
res.isPartOf = cursor.getString(3); res.isPartOf = cursor.getString(3);
res.lat = cursor.getDouble(4); res.lat = cursor.getDouble(4);
res.lon = cursor.getDouble(5); res.lon = cursor.getDouble(5);
res.imageTitle = cursor.getString(6); res.imageTitle = cursor.getString(6);
byte[] gpxFileBlob = cursor.getBlob(7);
res.cityId = cursor.getLong(8); res.cityId = cursor.getLong(8);
res.originalId = cursor.getLong(9); res.originalId = cursor.getLong(9);
res.lang = cursor.getString(10); res.lang = cursor.getString(10);
res.contentsJson = cursor.getString(11); res.contentsJson = cursor.getString(11);
res.aggregatedPartOf = cursor.getString(12); res.aggregatedPartOf = cursor.getString(12);
try {
String gpxContent = Algorithms.gzipToString(cursor.getBlob(7));
res.gpxFile = GPXUtilities.loadGPXFile(application, new ByteArrayInputStream(gpxContent.getBytes("UTF-8")));
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
return res; return res;
} }
public String formatTravelBookName(File tb) { public String formatTravelBookName(File tb) {
if(tb == null) { if (tb == null) {
return application.getString(R.string.shared_string_none); return application.getString(R.string.shared_string_none);
} }
String nm = tb.getName(); String nm = tb.getName();
return nm.substring(0, nm.indexOf('.')).replace('_', ' '); return nm.substring(0, nm.indexOf('.')).replace('_', ' ');
} }
public String getGPXName(TravelArticle article) {
return article.getTitle().replace('/', '_').replace('\'', '_').replace('\"', '_') + ".gpx";
}
} }

View file

@ -14,16 +14,14 @@ import java.util.List;
import gnu.trove.map.hash.TLongObjectHashMap; import gnu.trove.map.hash.TLongObjectHashMap;
public class WikivoyageLocalDataHelper { public class TravelLocalDataHelper {
private static final int HISTORY_ITEMS_LIMIT = 300; private static final int HISTORY_ITEMS_LIMIT = 300;
private static WikivoyageLocalDataHelper instance;
private WikivoyageLocalDataDbHelper dbHelper; private WikivoyageLocalDataDbHelper dbHelper;
private TLongObjectHashMap<WikivoyageSearchHistoryItem> historyMap; private TLongObjectHashMap<WikivoyageSearchHistoryItem> historyMap;
private List<WikivoyageArticle> savedArticles; private List<TravelArticle> savedArticles;
private Listener listener; private Listener listener;
@ -31,17 +29,14 @@ public class WikivoyageLocalDataHelper {
this.listener = listener; this.listener = listener;
} }
private WikivoyageLocalDataHelper(OsmandApplication app) { TravelLocalDataHelper(OsmandApplication app) {
dbHelper = new WikivoyageLocalDataDbHelper(app); dbHelper = new WikivoyageLocalDataDbHelper(app);
historyMap = dbHelper.getAllHistoryMap(); refreshCachedData();
savedArticles = dbHelper.getSavedArticles();
} }
public static WikivoyageLocalDataHelper getInstance(OsmandApplication app) { public void refreshCachedData() {
if (instance == null) { historyMap = dbHelper.getAllHistoryMap();
instance = new WikivoyageLocalDataHelper(app); savedArticles = dbHelper.getSavedArticles();
}
return instance;
} }
public List<WikivoyageSearchHistoryItem> getAllHistory() { public List<WikivoyageSearchHistoryItem> getAllHistory() {
@ -65,7 +60,7 @@ public class WikivoyageLocalDataHelper {
dbHelper.clearAllHistory(); dbHelper.clearAllHistory();
} }
public void addToHistory(@NonNull WikivoyageArticle article) { public void addToHistory(@NonNull TravelArticle article) {
addToHistory(article.getCityId(), article.getTitle(), article.getLang(), article.getIsPartOf()); addToHistory(article.getCityId(), article.getTitle(), article.getLang(), article.getIsPartOf());
} }
@ -95,13 +90,13 @@ public class WikivoyageLocalDataHelper {
} }
@NonNull @NonNull
public List<WikivoyageArticle> getSavedArticles() { public List<TravelArticle> getSavedArticles() {
return new ArrayList<>(savedArticles); return new ArrayList<>(savedArticles);
} }
public void addArticleToSaved(@NonNull WikivoyageArticle article) { public void addArticleToSaved(@NonNull TravelArticle article) {
if (!isArticleSaved(article)) { if (!isArticleSaved(article)) {
WikivoyageArticle saved = new WikivoyageArticle(); TravelArticle saved = new TravelArticle();
saved.cityId = article.cityId; saved.cityId = article.cityId;
saved.title = article.title; saved.title = article.title;
saved.lang = article.lang; saved.lang = article.lang;
@ -114,7 +109,7 @@ public class WikivoyageLocalDataHelper {
} }
} }
public void restoreSavedArticle(@NonNull WikivoyageArticle article) { public void restoreSavedArticle(@NonNull TravelArticle article) {
if (!isArticleSaved(article)) { if (!isArticleSaved(article)) {
savedArticles.add(article); savedArticles.add(article);
dbHelper.addSavedArticle(article); dbHelper.addSavedArticle(article);
@ -122,8 +117,8 @@ public class WikivoyageLocalDataHelper {
} }
} }
public void removeArticleFromSaved(@NonNull WikivoyageArticle article) { public void removeArticleFromSaved(@NonNull TravelArticle article) {
WikivoyageArticle savedArticle = getArticle(article.cityId, article.lang); TravelArticle savedArticle = getArticle(article.cityId, article.lang);
if (savedArticle != null) { if (savedArticle != null) {
savedArticles.remove(savedArticle); savedArticles.remove(savedArticle);
dbHelper.removeSavedArticle(savedArticle); dbHelper.removeSavedArticle(savedArticle);
@ -131,7 +126,7 @@ public class WikivoyageLocalDataHelper {
} }
} }
public boolean isArticleSaved(@NonNull WikivoyageArticle article) { public boolean isArticleSaved(@NonNull TravelArticle article) {
return getArticle(article.cityId, article.lang) != null; return getArticle(article.cityId, article.lang) != null;
} }
@ -142,8 +137,8 @@ public class WikivoyageLocalDataHelper {
} }
@Nullable @Nullable
private WikivoyageArticle getArticle(long cityId, String lang) { private TravelArticle getArticle(long cityId, String lang) {
for (WikivoyageArticle article : savedArticles) { for (TravelArticle article : savedArticles) {
if (article.cityId == cityId && article.lang != null && article.lang.equals(lang)) { if (article.cityId == cityId && article.lang != null && article.lang.equals(lang)) {
return article; return article;
} }
@ -244,7 +239,6 @@ public class WikivoyageLocalDataHelper {
conn.execSQL(BOOKMARKS_TABLE_CREATE); conn.execSQL(BOOKMARKS_TABLE_CREATE);
} }
@SuppressWarnings("unused")
private void onUpgrade(SQLiteConnection conn, int oldVersion, int newVersion) { private void onUpgrade(SQLiteConnection conn, int oldVersion, int newVersion) {
if (oldVersion < 2) { if (oldVersion < 2) {
conn.execSQL(BOOKMARKS_TABLE_CREATE); conn.execSQL(BOOKMARKS_TABLE_CREATE);
@ -252,9 +246,11 @@ public class WikivoyageLocalDataHelper {
if (oldVersion < 3) { if (oldVersion < 3) {
conn.execSQL("ALTER TABLE " + HISTORY_TABLE_NAME + " ADD " + HISTORY_COL_TRAVEL_BOOK + " TEXT"); conn.execSQL("ALTER TABLE " + HISTORY_TABLE_NAME + " ADD " + HISTORY_COL_TRAVEL_BOOK + " TEXT");
conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT"); conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT");
Object[] args = new Object[]{context.getWikivoyageDbHelper().getSelectedTravelBook().getName()}; if(context.getTravelDbHelper().getSelectedTravelBook() != null) {
conn.execSQL("UPDATE " + HISTORY_TABLE_NAME + " SET " + HISTORY_COL_TRAVEL_BOOK + " = ?", args); Object[] args = new Object[]{context.getTravelDbHelper().getSelectedTravelBook().getName()};
conn.execSQL("UPDATE " + BOOKMARKS_TABLE_NAME + " SET " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?", args); conn.execSQL("UPDATE " + HISTORY_TABLE_NAME + " SET " + HISTORY_COL_TRAVEL_BOOK + " = ?", args);
conn.execSQL("UPDATE " + BOOKMARKS_TABLE_NAME + " SET " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?", args);
}
} }
} }
@ -344,8 +340,8 @@ public class WikivoyageLocalDataHelper {
} }
@NonNull @NonNull
List<WikivoyageArticle> getSavedArticles() { List<TravelArticle> getSavedArticles() {
List<WikivoyageArticle> res = new ArrayList<>(); List<TravelArticle> res = new ArrayList<>();
SQLiteConnection conn = openConnection(true); SQLiteConnection conn = openConnection(true);
if (conn != null) { if (conn != null) {
try { try {
@ -357,6 +353,7 @@ public class WikivoyageLocalDataHelper {
res.add(readSavedArticle(cursor)); res.add(readSavedArticle(cursor));
} while (cursor.moveToNext()); } while (cursor.moveToNext());
} }
cursor.close();
} finally { } finally {
conn.close(); conn.close();
} }
@ -364,7 +361,7 @@ public class WikivoyageLocalDataHelper {
return res; return res;
} }
void addSavedArticle(WikivoyageArticle article) { void addSavedArticle(TravelArticle article) {
SQLiteConnection conn = openConnection(false); SQLiteConnection conn = openConnection(false);
if (conn != null) { if (conn != null) {
try { try {
@ -378,7 +375,7 @@ public class WikivoyageLocalDataHelper {
} }
} }
void removeSavedArticle(WikivoyageArticle article) { void removeSavedArticle(TravelArticle article) {
SQLiteConnection conn = openConnection(false); SQLiteConnection conn = openConnection(false);
if (conn != null) { if (conn != null) {
try { try {
@ -406,8 +403,8 @@ public class WikivoyageLocalDataHelper {
return res; return res;
} }
private WikivoyageArticle readSavedArticle(SQLiteCursor cursor) { private TravelArticle readSavedArticle(SQLiteCursor cursor) {
WikivoyageArticle res = new WikivoyageArticle(); TravelArticle res = new TravelArticle();
res.cityId = cursor.getLong(0); res.cityId = cursor.getLong(0);
res.title = cursor.getString(1); res.title = cursor.getString(1);

View file

@ -1,6 +1,7 @@
package net.osmand.plus.wikivoyage.data; package net.osmand.plus.wikivoyage.data;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.util.Log;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@ -11,6 +12,8 @@ import java.util.List;
public class WikivoyageJsonParser { public class WikivoyageJsonParser {
private static final String TAG = WikivoyageJsonParser.class.getSimpleName();
private static final String HEADERS = "headers"; private static final String HEADERS = "headers";
private static final String SUBHEADERS = "subheaders"; private static final String SUBHEADERS = "subheaders";
private static final String LINK = "link"; private static final String LINK = "link";
@ -25,7 +28,7 @@ public class WikivoyageJsonParser {
reader = new JSONObject(contentsJson); reader = new JSONObject(contentsJson);
jArray = reader.getJSONObject(HEADERS); jArray = reader.getJSONObject(HEADERS);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); Log.e(TAG, e.getMessage(), e);
return null; return null;
} }
@ -37,22 +40,23 @@ public class WikivoyageJsonParser {
WikivoyageContentItem headerItem = new WikivoyageContentItem(jArray.names().getString(i), link, topContentItem); WikivoyageContentItem headerItem = new WikivoyageContentItem(jArray.names().getString(i), link, topContentItem);
topContentItem.subItems.add(headerItem); topContentItem.subItems.add(headerItem);
JSONArray subheaders = header.getJSONArray(SUBHEADERS); JSONObject subheaders = header.getJSONObject(SUBHEADERS);
JSONArray subNames = subheaders.names();
List<String> subheaderNames = null; List<String> subheaderNames = null;
for (int j = 0; j < subheaders.length(); j++) { for (int j = 0; j < subheaders.length(); j++) {
JSONObject subheader = subheaders.getJSONObject(j); String title = subNames.get(j).toString();
JSONObject subheaderLink = subheader.getJSONObject(subheader.keys().next()); JSONObject subheaderLink = subheaders.getJSONObject(title);
if (subheaderNames == null) { if (subheaderNames == null) {
subheaderNames = new ArrayList<>(); subheaderNames = new ArrayList<>();
} }
subheaderNames.add(subheader.keys().next()); subheaderNames.add(title);
link = subheaderLink.getString(LINK); link = subheaderLink.getString(LINK);
WikivoyageContentItem subheaderItem = new WikivoyageContentItem(subheader.names().getString(0), link, headerItem); WikivoyageContentItem subheaderItem = new WikivoyageContentItem(title, link, headerItem);
headerItem.subItems.add(subheaderItem); headerItem.subItems.add(subheaderItem);
} }
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); Log.e(TAG, e.getMessage(), e);
} }
} }
return topContentItem; return topContentItem;

View file

@ -12,18 +12,19 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.squareup.picasso.Callback; import com.squareup.picasso.Callback;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator; import com.squareup.picasso.RequestCreator;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.plus.IconsCache; import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.widgets.tools.CropCircleTransformation; import net.osmand.plus.widgets.tools.CropCircleTransformation;
import net.osmand.plus.widgets.tools.CropRectTransformation; import net.osmand.plus.widgets.tools.CropRectTransformation;
import net.osmand.plus.wikivoyage.data.WikivoyageArticle; import net.osmand.plus.wikivoyage.WikivoyageUtils;
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper; import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -36,6 +37,7 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
private static final boolean USE_ALTERNATIVE_CARD = false; private static final boolean USE_ALTERNATIVE_CARD = false;
private final OsmandApplication app; private final OsmandApplication app;
private final OsmandSettings settings;
private final List<Object> items = new ArrayList<>(); private final List<Object> items = new ArrayList<>();
@ -50,7 +52,9 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
SavedArticlesRvAdapter(OsmandApplication app) { SavedArticlesRvAdapter(OsmandApplication app) {
this.app = app; this.app = app;
int colorId = app.getSettings().isLightContent() this.settings = app.getSettings();
int colorId = settings.isLightContent()
? R.color.wikivoyage_active_light : R.color.wikivoyage_active_dark; ? R.color.wikivoyage_active_light : R.color.wikivoyage_active_dark;
IconsCache ic = app.getIconsCache(); IconsCache ic = app.getIconsCache();
readIcon = ic.getIcon(R.drawable.ic_action_read_article, colorId); readIcon = ic.getIcon(R.drawable.ic_action_read_article, colorId);
@ -76,13 +80,11 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
holder.description.setText(String.valueOf(items.size() - 1)); holder.description.setText(String.valueOf(items.size() - 1));
} else { } else {
final ItemVH holder = (ItemVH) viewHolder; final ItemVH holder = (ItemVH) viewHolder;
WikivoyageArticle article = (WikivoyageArticle) getItem(position); TravelArticle article = (TravelArticle) getItem(position);
boolean lastItem = position == getItemCount() - 1; boolean lastItem = position == getItemCount() - 1;
RequestCreator rc = Picasso.get() RequestCreator rc = Picasso.get()
.load(WikivoyageArticle.getImageUrl(article.getImageTitle(), false)); .load(TravelArticle.getImageUrl(article.getImageTitle(), false));
if (!app.getSettings().WIKIVOYAGE_SHOW_IMAGES.get()) { WikivoyageUtils.setupNetworkPolicy(settings, rc);
rc.networkPolicy(NetworkPolicy.OFFLINE);
}
rc.transform(USE_ALTERNATIVE_CARD ? new CropRectTransformation() : new CropCircleTransformation()) rc.transform(USE_ALTERNATIVE_CARD ? new CropRectTransformation() : new CropCircleTransformation())
.into(holder.icon, new Callback() { .into(holder.icon, new Callback() {
@Override @Override
@ -172,9 +174,9 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Object item = getItemByPosition(); Object item = getItemByPosition();
if (item != null && item instanceof WikivoyageArticle) { if (item != null && item instanceof TravelArticle) {
if (listener != null) { if (listener != null) {
listener.openArticle((WikivoyageArticle) item); listener.openArticle((TravelArticle) item);
} }
} }
} }
@ -187,14 +189,15 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Object item = getItemByPosition(); Object item = getItemByPosition();
if (item != null && item instanceof WikivoyageArticle) { if (item != null && item instanceof TravelArticle) {
final WikivoyageArticle article = (WikivoyageArticle) item; final TravelArticle article = (TravelArticle) item;
WikivoyageLocalDataHelper.getInstance(app).removeArticleFromSaved(article); final TravelLocalDataHelper ldh = app.getTravelDbHelper().getLocalDataHelper();;
ldh.removeArticleFromSaved(article);
Snackbar snackbar = Snackbar.make(itemView, R.string.article_removed, Snackbar.LENGTH_LONG) Snackbar snackbar = Snackbar.make(itemView, R.string.article_removed, Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new View.OnClickListener() { .setAction(R.string.shared_string_undo, new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
WikivoyageLocalDataHelper.getInstance(app).restoreSavedArticle(article); ldh.restoreSavedArticle(article);
} }
}); });
AndroidUtils.setSnackbarTextColor(snackbar, R.color.wikivoyage_active_dark); AndroidUtils.setSnackbarTextColor(snackbar, R.color.wikivoyage_active_dark);
@ -215,6 +218,6 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
} }
interface Listener { interface Listener {
void openArticle(WikivoyageArticle article); void openArticle(TravelArticle article);
} }
} }

View file

@ -11,20 +11,25 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.base.BaseOsmAndFragment; import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment; import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
import net.osmand.plus.wikivoyage.data.WikivoyageArticle; import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper; import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import org.apache.commons.logging.Log;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public class SavedArticlesTabFragment extends BaseOsmAndFragment implements WikivoyageLocalDataHelper.Listener { public class SavedArticlesTabFragment extends BaseOsmAndFragment implements TravelLocalDataHelper.Listener {
private WikivoyageLocalDataHelper dataHelper; protected static final Log LOG = PlatformUtil.getLog(SavedArticlesTabFragment.class);
private TravelLocalDataHelper dataHelper;
private SavedArticlesRvAdapter adapter; private SavedArticlesRvAdapter adapter;
@ -32,14 +37,14 @@ public class SavedArticlesTabFragment extends BaseOsmAndFragment implements Wiki
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication(); final OsmandApplication app = getMyApplication();
dataHelper = WikivoyageLocalDataHelper.getInstance(app); dataHelper = app.getTravelDbHelper().getLocalDataHelper();
final View mainView = inflater.inflate(R.layout.fragment_saved_articles_tab, container, false); final View mainView = inflater.inflate(R.layout.fragment_saved_articles_tab, container, false);
adapter = new SavedArticlesRvAdapter(app); adapter = new SavedArticlesRvAdapter(app);
adapter.setListener(new SavedArticlesRvAdapter.Listener() { adapter.setListener(new SavedArticlesRvAdapter.Listener() {
@Override @Override
public void openArticle(WikivoyageArticle article) { public void openArticle(TravelArticle article) {
FragmentManager fm = getFragmentManager(); FragmentManager fm = getFragmentManager();
if (fm != null) { if (fm != null) {
WikivoyageArticleDialogFragment.showInstance(app, fm, article.getCityId(), article.getLang()); WikivoyageArticleDialogFragment.showInstance(app, fm, article.getCityId(), article.getLang());
@ -79,7 +84,7 @@ public class SavedArticlesTabFragment extends BaseOsmAndFragment implements Wiki
private List<Object> getItems() { private List<Object> getItems() {
List<Object> items = new ArrayList<>(); List<Object> items = new ArrayList<>();
List<WikivoyageArticle> savedArticles = dataHelper.getSavedArticles(); List<TravelArticle> savedArticles = dataHelper.getSavedArticles();
if (!savedArticles.isEmpty()) { if (!savedArticles.isEmpty()) {
Collections.reverse(savedArticles); Collections.reverse(savedArticles);
items.add(getString(R.string.saved_articles)); items.add(getString(R.string.saved_articles));
@ -121,12 +126,12 @@ public class SavedArticlesTabFragment extends BaseOsmAndFragment implements Wiki
Object newItem = newItems.get(newItemPosition); Object newItem = newItems.get(newItemPosition);
if (oldItem instanceof String && newItem instanceof String) { if (oldItem instanceof String && newItem instanceof String) {
return false; return false;
} else if (oldItem instanceof WikivoyageArticle && newItem instanceof WikivoyageArticle) { } else if (oldItem instanceof TravelArticle && newItem instanceof TravelArticle) {
if (newItemPosition == newItems.size() - 1 && lastItemChanged()) { if (newItemPosition == newItems.size() - 1 && lastItemChanged()) {
return false; return false;
} }
WikivoyageArticle oldArticle = (WikivoyageArticle) oldItem; TravelArticle oldArticle = (TravelArticle) oldItem;
WikivoyageArticle newArticle = (WikivoyageArticle) newItem; TravelArticle newArticle = (TravelArticle) newItem;
return oldArticle.getCityId() == newArticle.getCityId() return oldArticle.getCityId() == newArticle.getCityId()
&& oldArticle.getLang().equals(newArticle.getLang()); && oldArticle.getLang().equals(newArticle.getLang());
} }

View file

@ -1,93 +1,85 @@
package net.osmand.plus.wikivoyage.explore; package net.osmand.plus.wikivoyage.explore;
import java.io.File;
import java.util.List;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AlertDialogLayout; import android.support.v7.widget.PopupMenu;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.webkit.WebView; import android.webkit.WebView;
import android.widget.Toast;
import net.osmand.PicassoUtils; import net.osmand.PicassoUtils;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.WikivoyageShowImages;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.wikivoyage.data.WikivoyageDbHelper; import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper; import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import java.io.File;
import java.util.List;
public class WikivoyageOptionsBottomSheetDialogFragment extends MenuBottomSheetDialogFragment { public class WikivoyageOptionsBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
public final static String TAG = "WikivoyageOptionsBottomSheetDialogFragment"; public final static String TAG = "WikivoyageOptionsBottomSheetDialogFragment";
protected void selectTravelBookDialog() {
WikivoyageDbHelper dbHelper = getMyApplication().getWikivoyageDbHelper();
final List<File> list = dbHelper.getExistingTravelBooks();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
String[] ls = new String[list.size()];
for (int i = 0; i < ls.length; i++) {
ls[i] = dbHelper.formatTravelBookName(list.get(i));
}
builder.setTitle("Select travel book"); // TODO externalize
builder.setItems(ls, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getMyApplication(), list.get(which).getName(), Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton(R.string.shared_string_dismiss, null);
builder.show();
}
@Override @Override
public void createMenuItems(Bundle savedInstanceState) { public void createMenuItems(Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication(); final OsmandApplication app = getMyApplication();
final OsmandSettings.CommonPreference<Boolean> showImagesPref = app.getSettings().WIKIVOYAGE_SHOW_IMAGES; final OsmandSettings.CommonPreference<WikivoyageShowImages> showImagesPref = app.getSettings().WIKIVOYAGE_SHOW_IMAGES;
final WikivoyageDbHelper dbHelper = app.getWikivoyageDbHelper(); final TravelDbHelper dbHelper = app.getTravelDbHelper();
items.add(new TitleItem(getString(R.string.shared_string_options))); items.add(new TitleItem(getString(R.string.shared_string_options)));
if(dbHelper.getExistingTravelBooks().size() > 1) { if (dbHelper.getExistingTravelBooks().size() > 1) {
BaseBottomSheetItem selectTravelBook = new BottomSheetItemWithDescription.Builder() BaseBottomSheetItem selectTravelBook = new BottomSheetItemWithDescription.Builder()
.setDescription(dbHelper.formatTravelBookName(dbHelper.getSelectedTravelBook())) .setDescription(dbHelper.formatTravelBookName(dbHelper.getSelectedTravelBook()))
.setDescriptionColorId(nightMode ? R.color.wikivoyage_active_dark : R.color.wikivoyage_active_light) .setDescriptionColorId(nightMode ? R.color.wikivoyage_active_dark : R.color.wikivoyage_active_light)
.setTitle("Travel book") // TODO think & externalize .setTitle(getString(R.string.shared_string_travel_book))
.setLayoutId(R.layout.bottom_sheet_item_with_right_descr) .setLayoutId(R.layout.bottom_sheet_item_with_right_descr)
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
selectTravelBookDialog(); selectTravelBookDialog();
dismiss(); dismiss();
} }
}) })
.create(); .create();
items.add(selectTravelBook); items.add(selectTravelBook);
} }
BaseBottomSheetItem showImagesItem = new BottomSheetItemWithCompoundButton.Builder() BaseBottomSheetItem showImagesItem = new BottomSheetItemWithDescription.Builder()
.setChecked(showImagesPref.get()) .setDescription(getString(showImagesPref.get().name))
.setDescriptionColorId(nightMode ? R.color.wikivoyage_active_dark : R.color.wikivoyage_active_light)
.setIcon(getContentIcon(R.drawable.ic_type_img)) .setIcon(getContentIcon(R.drawable.ic_type_img))
.setTitle(getString(R.string.show_images)) .setTitle(getString(R.string.download_images))
.setLayoutId(R.layout.bottom_sheet_item_with_switch) .setLayoutId(R.layout.bottom_sheet_item_with_right_descr)
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
showImagesPref.set(!showImagesPref.get());
dismiss(); final PopupMenu popup = new PopupMenu(v.getContext(), v, Gravity.END);
for (final WikivoyageShowImages showImages : WikivoyageShowImages.values()) {
MenuItem item = popup.getMenu().add(getString(showImages.name));
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
showImagesPref.set(showImages);
dismiss();
return true;
}
});
}
popup.show();
} }
}) })
.create(); .create();
@ -118,7 +110,8 @@ public class WikivoyageOptionsBottomSheetDialogFragment extends MenuBottomSheetD
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
WikivoyageLocalDataHelper.getInstance(app).clearHistory(); TravelLocalDataHelper ldh = getMyApplication().getTravelDbHelper().getLocalDataHelper();
ldh.clearHistory();
dismiss(); dismiss();
} }
}) })
@ -126,5 +119,23 @@ public class WikivoyageOptionsBottomSheetDialogFragment extends MenuBottomSheetD
items.add(clearHistoryItem); items.add(clearHistoryItem);
} }
protected void selectTravelBookDialog() {
final TravelDbHelper dbHelper = getMyApplication().getTravelDbHelper();
final List<File> list = dbHelper.getExistingTravelBooks();
String[] ls = new String[list.size()];
for (int i = 0; i < ls.length; i++) {
ls[i] = dbHelper.formatTravelBookName(list.get(i));
}
new AlertDialog.Builder(getContext())
.setTitle(R.string.select_travel_book)
.setItems(ls, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dbHelper.selectTravelBook(list.get(which));
}
})
.setNegativeButton(R.string.shared_string_dismiss, null)
.show();
}
} }

View file

@ -19,7 +19,8 @@ import com.squareup.picasso.RequestCreator;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.widgets.tools.CropCircleTransformation; import net.osmand.plus.widgets.tools.CropCircleTransformation;
import net.osmand.plus.wikivoyage.data.WikivoyageArticle; import net.osmand.plus.wikivoyage.WikivoyageUtils;
import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.WikivoyageSearchHistoryItem; import net.osmand.plus.wikivoyage.data.WikivoyageSearchHistoryItem;
import net.osmand.plus.wikivoyage.data.WikivoyageSearchResult; import net.osmand.plus.wikivoyage.data.WikivoyageSearchResult;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -76,10 +77,8 @@ public class SearchRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView
if (item instanceof WikivoyageSearchResult) { if (item instanceof WikivoyageSearchResult) {
WikivoyageSearchResult searchRes = (WikivoyageSearchResult) item; WikivoyageSearchResult searchRes = (WikivoyageSearchResult) item;
RequestCreator rc = Picasso.get() RequestCreator rc = Picasso.get()
.load(WikivoyageArticle.getImageUrl(searchRes.getImageTitle(), true)); .load(TravelArticle.getImageUrl(searchRes.getImageTitle(), true));
if (!app.getSettings().WIKIVOYAGE_SHOW_IMAGES.get()) { WikivoyageUtils.setupNetworkPolicy(app.getSettings(), rc);
rc.networkPolicy(NetworkPolicy.OFFLINE);
}
rc.transform(new CropCircleTransformation()) rc.transform(new CropCircleTransformation())
.placeholder(placeholder) .placeholder(placeholder)
.into(holder.icon); .into(holder.icon);

View file

@ -22,7 +22,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment; import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment;
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment; import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper; import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.plus.wikivoyage.data.WikivoyageSearchHistoryItem; import net.osmand.plus.wikivoyage.data.WikivoyageSearchHistoryItem;
import net.osmand.plus.wikivoyage.data.WikivoyageSearchResult; import net.osmand.plus.wikivoyage.data.WikivoyageSearchResult;
@ -147,8 +147,8 @@ public class WikivoyageSearchDialogFragment extends WikivoyageBaseDialogFragment
private void setAdapterItems(@Nullable List<WikivoyageSearchResult> items) { private void setAdapterItems(@Nullable List<WikivoyageSearchResult> items) {
if (items == null || items.isEmpty()) { if (items == null || items.isEmpty()) {
adapter.setHistoryItems(WikivoyageLocalDataHelper TravelLocalDataHelper ldh = getMyApplication().getTravelDbHelper().getLocalDataHelper();
.getInstance(getMyApplication()).getAllHistory()); adapter.setHistoryItems(ldh.getAllHistory());
} else { } else {
adapter.setItems(items); adapter.setItems(items);
} }

View file

@ -42,7 +42,7 @@ public class WikivoyageSearchHelper {
} }
if (!isCancelled()) { if (!isCancelled()) {
List<WikivoyageSearchResult> results = application.getWikivoyageDbHelper().search(query); List<WikivoyageSearchResult> results = application.getTravelDbHelper().search(query);
if (!isCancelled()) { if (!isCancelled()) {
rm.publish(results); rm.publish(results);
} }

View file

@ -118,18 +118,18 @@ repositories {
} }
dependencies { dependencies {
compile project(path: ':OsmAnd-java', configuration: 'android') implementation project(path: ':OsmAnd-java', configuration: 'android')
compile 'com.android.support:multidex:1.0.1' implementation 'com.android.support:multidex:1.0.1'
compile 'com.android.support:appcompat-v7:27.1.0' implementation 'com.android.support:appcompat-v7:27.1.0'
compile 'com.android.support:design:27.1.0' implementation 'com.android.support:design:27.1.0'
compile 'commons-logging:commons-logging-api:1.1' implementation 'commons-logging:commons-logging-api:1.1'
compile 'com.moparisthebest:junidecode:0.1.1' implementation 'com.moparisthebest:junidecode:0.1.1'
compile fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs')
compile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" implementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar"
debugCompile "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" debugImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar"
nativeDebugCompile "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" nativeDebugImplementation "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar"
releaseCompile "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" releaseImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar"
} }

View file

@ -14,3 +14,7 @@ android.library.reference.12=aarDependencies/com.android.support-transition-27.1
android.library.reference.13=aarDependencies/com.android.support-recyclerview-v7-27.1.0 android.library.reference.13=aarDependencies/com.android.support-recyclerview-v7-27.1.0
android.library.reference.14=aarDependencies/net.osmand-OsmAndCore_android-0.1-SNAPSHOT android.library.reference.14=aarDependencies/net.osmand-OsmAndCore_android-0.1-SNAPSHOT
android.library.reference.15=aarDependencies/net.osmand-OsmAndCore_androidNativeRelease-0.1-SNAPSHOT android.library.reference.15=aarDependencies/net.osmand-OsmAndCore_androidNativeRelease-0.1-SNAPSHOT
android.library.reference.16=aarDependencies/com.android.support-multidex-1.0.1
android.library.reference.17=aarDependencies/android.arch.lifecycle-viewmodel-1.1.0
android.library.reference.18=aarDependencies/android.arch.lifecycle-livedata-core-1.1.0
android.library.reference.19=aarDependencies/android.arch.core-runtime-1.1.0

View file

@ -13,9 +13,10 @@ buildscript {
classpath 'com.github.ksoichiro:gradle-eclipse-aar-plugin:0.3.1' classpath 'com.github.ksoichiro:gradle-eclipse-aar-plugin:0.3.1'
} }
} }
apply plugin: 'com.github.ksoichiro.eclipse.aar'
apply plugin: 'com.github.ksoichiro.eclipse.aar'
allprojects { allprojects {
repositories { repositories {
mavenCentral() mavenCentral()
maven { maven {