Merge remote-tracking branch 'origin/add_track_recording_dialogs' into active-trip-rec
# Conflicts: # OsmAnd/res/values/strings.xml
This commit is contained in:
commit
33e09ad5ea
55 changed files with 1587 additions and 540 deletions
|
@ -38,6 +38,11 @@ public class ProfileSettingsParams extends AidlParams {
|
||||||
this.silent = silent;
|
this.silent = silent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProfileSettingsParams(Uri profileSettingsUri, List<AExportSettingsType> settingsTypeList,
|
||||||
|
boolean replace, String latestChanges, int version) {
|
||||||
|
this(profileSettingsUri, settingsTypeList, replace, false, latestChanges, version);
|
||||||
|
}
|
||||||
|
|
||||||
public ProfileSettingsParams(Parcel in) {
|
public ProfileSettingsParams(Parcel in) {
|
||||||
readFromParcel(in);
|
readFromParcel(in);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,9 @@ public class PlatformUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static XmlPullParser newXMLPullParser() throws XmlPullParserException{
|
public static XmlPullParser newXMLPullParser() throws XmlPullParserException{
|
||||||
return new org.kxml2.io.KXmlParser();
|
org.kxml2.io.KXmlParser xmlParser = new org.kxml2.io.KXmlParser();
|
||||||
|
xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||||
|
return xmlParser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static XmlSerializer newSerializer() {
|
public static XmlSerializer newSerializer() {
|
||||||
|
|
69
OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml
Normal file
69
OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/button_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:paddingStart="@dimen/content_padding_small"
|
||||||
|
android:paddingLeft="@dimen/content_padding_small"
|
||||||
|
android:paddingTop="@dimen/text_margin_small"
|
||||||
|
android:paddingEnd="@dimen/content_padding_small"
|
||||||
|
android:paddingRight="@dimen/content_padding_small"
|
||||||
|
android:paddingBottom="@dimen/text_margin_small"
|
||||||
|
tools:background="@drawable/dlg_btn_secondary_dark"
|
||||||
|
tools:ignore="UselessParent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
|
android:id="@+id/button_text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:textSize="@dimen/default_desc_text_size"
|
||||||
|
osmand:letterSpacing="@dimen/description_letter_spacing"
|
||||||
|
osmand:typeface="@string/font_roboto_medium"
|
||||||
|
tools:text="Title"
|
||||||
|
tools:textColor="@color/text_color_secondary_light" />
|
||||||
|
|
||||||
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
|
android:id="@+id/desc"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:textColor="@color/text_color_secondary_light"
|
||||||
|
android:textSize="@dimen/default_desc_text_size"
|
||||||
|
android:visibility="gone"
|
||||||
|
osmand:letterSpacing="@dimen/description_letter_spacing"
|
||||||
|
osmand:typeface="@string/font_roboto_medium"
|
||||||
|
tools:text="Description"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="@dimen/map_widget_icon"
|
||||||
|
android:layout_height="@dimen/map_widget_icon"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:layout_marginStart="@dimen/context_menu_padding_margin_large"
|
||||||
|
android:layout_marginLeft="@dimen/context_menu_padding_margin_large"
|
||||||
|
tools:srcCompat="@drawable/ic_action_appearance"
|
||||||
|
tools:tint="@color/icon_color_secondary_light" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
|
@ -1,36 +1,22 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="?attr/bg_color"
|
android:background="?attr/bg_color"
|
||||||
android:clickable="true"
|
android:orientation="vertical">
|
||||||
android:focusable="true"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
<androidx.appcompat.widget.Toolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="@dimen/toolbar_height"
|
android:layout_height="@dimen/toolbar_height"
|
||||||
android:layout_marginTop="@dimen/dialog_content_margin">
|
android:gravity="center_vertical"
|
||||||
|
android:padding="0dp" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<ScrollView
|
||||||
android:id="@+id/back_button"
|
|
||||||
style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:contentDescription="@string/shared_string_back"
|
|
||||||
app:srcCompat="@drawable/ic_arrow_back"
|
|
||||||
app:tint="@color/icon_color_default_light" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<androidx.core.widget.NestedScrollView
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="0dp"
|
||||||
android:layout_below="@id/toolbar"
|
android:layout_weight="1">
|
||||||
android:layout_above="@id/buttons">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -49,7 +35,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="@dimen/content_padding"
|
android:layout_marginLeft="@dimen/content_padding"
|
||||||
android:layout_marginTop="@dimen/content_padding"
|
android:layout_marginTop="@dimen/content_padding_small"
|
||||||
android:layout_marginRight="@dimen/content_padding"
|
android:layout_marginRight="@dimen/content_padding"
|
||||||
android:layout_marginBottom="@dimen/dashPadding"
|
android:layout_marginBottom="@dimen/dashPadding"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
|
@ -68,23 +54,25 @@
|
||||||
android:layout_marginTop="@dimen/dashPadding"
|
android:layout_marginTop="@dimen/dashPadding"
|
||||||
android:layout_marginRight="@dimen/content_padding"
|
android:layout_marginRight="@dimen/content_padding"
|
||||||
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
|
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
|
||||||
app:typeface="@string/font_roboto_regular"
|
|
||||||
android:text="@string/register_on_openplacereviews_desc"
|
android:text="@string/register_on_openplacereviews_desc"
|
||||||
android:textColor="?android:textColorPrimary"
|
android:textColor="?android:textColorPrimary"
|
||||||
|
android:textColorLink="@color/icon_color_active_light"
|
||||||
android:textSize="@dimen/default_list_text_size"
|
android:textSize="@dimen/default_list_text_size"
|
||||||
android:textColorLink="@color/icon_color_active_light" />
|
app:typeface="@string/font_roboto_regular" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/buttons"
|
android:id="@+id/buttons"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
android:layout_marginLeft="@dimen/content_padding"
|
android:layout_marginLeft="@dimen/content_padding"
|
||||||
android:layout_marginTop="@dimen/content_padding_small"
|
android:layout_marginTop="@dimen/content_padding_small"
|
||||||
android:layout_marginRight="@dimen/content_padding"
|
android:layout_marginRight="@dimen/content_padding"
|
||||||
android:layout_marginBottom="@dimen/content_padding_small"
|
android:layout_marginBottom="@dimen/content_padding_small"
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<include
|
<include
|
||||||
|
@ -102,4 +90,4 @@
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</LinearLayout>
|
|
@ -1,5 +1,4 @@
|
||||||
<LinearLayout
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@ -8,7 +7,8 @@
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="56dp"
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="@dimen/context_menu_action_buttons_height"
|
||||||
android:background="?attr/pstsTabBackground"
|
android:background="?attr/pstsTabBackground"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
@ -19,19 +19,19 @@
|
||||||
android:layout_width="52dp"
|
android:layout_width="52dp"
|
||||||
android:layout_height="52dp"
|
android:layout_height="52dp"
|
||||||
android:contentDescription="@string/shared_string_close"
|
android:contentDescription="@string/shared_string_close"
|
||||||
app:srcCompat="@drawable/ic_action_remove_dark"/>
|
app:srcCompat="@drawable/ic_action_remove_dark" />
|
||||||
|
|
||||||
<net.osmand.plus.widgets.TextViewEx
|
<net.osmand.plus.widgets.TextViewEx
|
||||||
android:id="@+id/titleTextView"
|
android:id="@+id/titleTextView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
android:layout_marginLeft="20dp"
|
android:layout_marginLeft="20dp"
|
||||||
android:text="@string/osm_live_subscription"
|
android:text="@string/osm_live_subscription"
|
||||||
android:textColor="@color/color_white"
|
android:textColor="@color/color_white"
|
||||||
android:textSize="@dimen/default_list_text_size_large"
|
android:textSize="@dimen/default_list_text_size_large"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:typeface="@string/font_roboto_regular"
|
app:typeface="@string/font_roboto_regular" />
|
||||||
android:layout_marginStart="20dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<include layout="@layout/card_bottom_divider"/>
|
<include layout="@layout/card_bottom_divider" />
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -67,8 +67,8 @@
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
android:minHeight="56dp"
|
android:minHeight="56dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
@ -76,54 +76,81 @@
|
||||||
android:layout_width="56dp"
|
android:layout_width="56dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:scaleType="center"
|
android:scaleType="center"
|
||||||
app:srcCompat="@drawable/ic_action_osm_live"
|
android:tint="@color/osmand_orange"
|
||||||
android:tint="@color/osmand_orange"/>
|
app:srcCompat="@drawable/ic_action_osm_live" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:paddingStart="2dp"
|
||||||
android:paddingLeft="2dp"
|
android:paddingLeft="2dp"
|
||||||
android:text="@string/osm_live_subscription_desc"
|
android:text="@string/osm_live_subscription_desc"
|
||||||
android:textColor="?android:attr/textColorPrimary"
|
android:textColor="?android:attr/textColorPrimary" />
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:paddingStart="2dp"
|
|
||||||
android:layout_marginStart="16dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
android:minHeight="56dp"
|
android:minHeight="56dp"
|
||||||
android:orientation="vertical">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatCheckBox
|
<androidx.appcompat.widget.AppCompatCheckBox
|
||||||
android:id="@+id/donationCheckbox"
|
android:id="@+id/donationCheckbox"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginTop="@dimen/context_menu_second_line_top_margin"
|
||||||
android:paddingLeft="34dp"
|
android:layout_marginStart="@dimen/list_content_padding"
|
||||||
android:text="@string/donation_to_osm"
|
android:layout_marginLeft="@dimen/list_content_padding"
|
||||||
android:paddingStart="34dp"
|
android:paddingStart="@dimen/local_size_height"
|
||||||
android:layout_marginStart="16dp" />
|
android:paddingLeft="@dimen/local_size_height"
|
||||||
|
android:paddingEnd="@dimen/local_size_height"
|
||||||
|
android:paddingRight="@dimen/local_size_height"
|
||||||
|
android:text="@string/donation_to_osm" />
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="72dp"
|
android:minHeight="56dp"
|
||||||
android:layout_marginRight="16dp"
|
android:orientation="vertical">
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:paddingLeft="2dp"
|
<TextView
|
||||||
android:text="@string/donation_to_osm_desc"
|
android:layout_width="match_parent"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginStart="@dimen/list_content_padding_large"
|
||||||
android:layout_marginStart="72dp"
|
android:layout_marginLeft="@dimen/context_menu_progress_padding_left"
|
||||||
android:paddingStart="2dp" />
|
android:layout_marginEnd="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:layout_marginRight="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:paddingStart="@dimen/subHeaderPadding"
|
||||||
|
android:paddingLeft="@dimen/subHeaderPadding"
|
||||||
|
android:paddingEnd="@dimen/subHeaderPadding"
|
||||||
|
android:paddingRight="@dimen/subHeaderPadding"
|
||||||
|
android:textColor="?android:textColorPrimary"
|
||||||
|
android:textSize="@dimen/default_list_text_size"
|
||||||
|
android:text="@string/donation_to_osm" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/list_content_padding_large"
|
||||||
|
android:layout_marginLeft="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:layout_marginEnd="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:layout_marginRight="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:paddingStart="@dimen/subHeaderPadding"
|
||||||
|
android:paddingLeft="@dimen/subHeaderPadding"
|
||||||
|
android:paddingEnd="@dimen/subHeaderPadding"
|
||||||
|
android:paddingRight="@dimen/subHeaderPadding"
|
||||||
|
android:text="@string/donation_to_osm_desc"
|
||||||
|
android:textColor="?android:attr/textColorSecondary"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -140,13 +167,13 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1dp"
|
android:layout_height="1dp"
|
||||||
android:layout_marginBottom="6dp"
|
android:layout_marginBottom="6dp"
|
||||||
android:background="?attr/dashboard_divider"/>
|
android:background="?attr/dashboard_divider" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
android:minHeight="56dp"
|
android:minHeight="56dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
@ -155,47 +182,48 @@
|
||||||
android:layout_width="56dp"
|
android:layout_width="56dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:scaleType="center"
|
android:scaleType="center"
|
||||||
app:srcCompat="@drawable/ic_world_globe_dark"/>
|
app:srcCompat="@drawable/ic_world_globe_dark" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:orientation="vertical"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:layout_marginEnd="16dp">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingLeft="2dp"
|
android:paddingStart="@dimen/subHeaderPadding"
|
||||||
|
android:paddingEnd="@dimen/subHeaderPadding"
|
||||||
|
android:paddingLeft="@dimen/subHeaderPadding"
|
||||||
|
android:paddingRight="@dimen/subHeaderPadding"
|
||||||
android:text="@string/osm_live_support_region"
|
android:text="@string/osm_live_support_region"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary" />
|
||||||
android:paddingStart="2dp" />
|
|
||||||
|
|
||||||
<net.osmand.plus.widgets.AutoCompleteTextViewEx
|
<net.osmand.plus.widgets.AutoCompleteTextViewEx
|
||||||
android:id="@+id/selectCountryEdit"
|
android:id="@+id/selectCountryEdit"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:drawableRightCompat="@drawable/ic_action_arrow_drop_down"
|
android:paddingStart="2dp"
|
||||||
app:drawableEndCompat="@drawable/ic_action_arrow_drop_down"
|
|
||||||
android:editable="false"
|
|
||||||
android:paddingLeft="2dp"
|
android:paddingLeft="2dp"
|
||||||
|
android:paddingEnd="0dp"
|
||||||
android:paddingRight="0dp"
|
android:paddingRight="0dp"
|
||||||
android:text="Ukraine"
|
android:text="Ukraine"
|
||||||
android:paddingStart="2dp"
|
app:drawableEndCompat="@drawable/ic_action_arrow_drop_down"
|
||||||
android:paddingEnd="0dp" />
|
app:drawableRightCompat="@drawable/ic_action_arrow_drop_down" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:paddingStart="2dp"
|
||||||
android:paddingLeft="2dp"
|
android:paddingLeft="2dp"
|
||||||
android:text="@string/osm_live_region_desc"
|
android:text="@string/osm_live_region_desc"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary" />
|
||||||
android:paddingStart="2dp" />
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -213,21 +241,21 @@
|
||||||
android:layout_width="56dp"
|
android:layout_width="56dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:scaleType="center"
|
android:scaleType="center"
|
||||||
app:srcCompat="@drawable/ic_action_message"/>
|
app:srcCompat="@drawable/ic_action_message" />
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/emailEdit"
|
android:id="@+id/emailEdit"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:hint="@string/shared_string_email_address"
|
android:hint="@string/shared_string_email_address"
|
||||||
android:inputType="textEmailAddress"
|
android:inputType="textEmailAddress"
|
||||||
android:paddingLeft="2dp"
|
android:paddingStart="2dp"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingLeft="2dp" />
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:paddingStart="2dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -235,14 +263,14 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="72dp"
|
||||||
android:layout_marginLeft="72dp"
|
android:layout_marginLeft="72dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginRight="16dp"
|
||||||
|
android:paddingStart="2dp"
|
||||||
android:paddingLeft="2dp"
|
android:paddingLeft="2dp"
|
||||||
android:text="@string/osm_live_email_desc"
|
android:text="@string/osm_live_email_desc"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary" />
|
||||||
android:paddingStart="2dp"
|
|
||||||
android:layout_marginStart="72dp"
|
|
||||||
android:layout_marginEnd="16dp" />
|
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -261,21 +289,21 @@
|
||||||
android:layout_width="56dp"
|
android:layout_width="56dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:scaleType="center"
|
android:scaleType="center"
|
||||||
app:srcCompat="@drawable/ic_action_user"/>
|
app:srcCompat="@drawable/ic_action_user" />
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/userNameEdit"
|
android:id="@+id/userNameEdit"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:hint="@string/osm_live_user_public_name"
|
android:hint="@string/osm_live_user_public_name"
|
||||||
android:inputType="text"
|
android:inputType="text"
|
||||||
android:paddingLeft="2dp"
|
android:paddingStart="2dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:paddingLeft="2dp" />
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:paddingStart="2dp" />
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -284,16 +312,16 @@
|
||||||
android:id="@+id/hideUserNameCheckbox"
|
android:id="@+id/hideUserNameCheckbox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="12dp"
|
android:layout_marginStart="72dp"
|
||||||
android:layout_marginLeft="72dp"
|
android:layout_marginLeft="72dp"
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:paddingStart="4dp"
|
||||||
android:paddingLeft="4dp"
|
android:paddingLeft="4dp"
|
||||||
android:text="@string/osm_live_hide_user_name"
|
android:text="@string/osm_live_hide_user_name"
|
||||||
android:textColor="?android:attr/textColorPrimary"
|
android:textColor="?android:attr/textColorPrimary" />
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:paddingStart="4dp"
|
|
||||||
android:layout_marginStart="72dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -303,35 +331,35 @@
|
||||||
android:id="@+id/editModeBottomView"
|
android:id="@+id/editModeBottomView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
android:visibility="visible">
|
android:visibility="visible">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/saveChangesButton"
|
android:id="@+id/saveChangesButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="72dp"
|
||||||
android:layout_marginLeft="72dp"
|
android:layout_marginLeft="72dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:background="?attr/btn_round"
|
android:background="?attr/btn_round"
|
||||||
|
android:paddingStart="16dp"
|
||||||
android:paddingLeft="16dp"
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
android:paddingRight="16dp"
|
android:paddingRight="16dp"
|
||||||
android:text="@string/shared_string_save_changes"
|
android:text="@string/shared_string_save_changes"
|
||||||
android:textColor="@color/color_white"
|
android:textColor="@color/color_white" />
|
||||||
android:layout_marginStart="72dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:paddingStart="16dp"
|
|
||||||
android:paddingEnd="16dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<include layout="@layout/card_bottom_divider"/>
|
<include layout="@layout/card_bottom_divider" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="16dp"/>
|
android:layout_height="16dp" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:layout_marginRight="@dimen/favorites_icon_right_margin"
|
android:layout_marginRight="@dimen/favorites_icon_right_margin"
|
||||||
tools:src="@drawable/ic_map"
|
tools:src="@drawable/ic_map"
|
||||||
android:layout_marginEnd="@dimen/favorites_icon_right_margin" />
|
android:layout_marginEnd="@dimen/favorites_icon_right_margin" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
@ -81,26 +81,26 @@
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:src="@drawable/ic_action_import"
|
tools:src="@drawable/ic_action_import"
|
||||||
tools:visibility="visible"
|
tools:visibility="visible"
|
||||||
android:layout_marginStart="@dimen/dashFavIconMargin" />
|
android:layout_marginStart="@dimen/dashFavIconMargin" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/rightButton"
|
android:id="@+id/rightButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="33dp"
|
android:layout_height="wrap_content"
|
||||||
android:minWidth="40dp"
|
|
||||||
android:paddingLeft="18dp"
|
|
||||||
android:paddingRight="18dp"
|
|
||||||
android:background="@drawable/buy_btn_background_light"
|
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="@dimen/dashFavIconMargin"
|
||||||
android:layout_marginLeft="@dimen/dashFavIconMargin"
|
android:layout_marginLeft="@dimen/dashFavIconMargin"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginEnd="@dimen/list_header_padding"
|
||||||
android:textColor="@color/buy_button_color"
|
android:layout_marginRight="@dimen/list_header_padding"
|
||||||
|
android:minWidth="@dimen/list_header_height"
|
||||||
|
android:minHeight="@dimen/list_content_padding_large"
|
||||||
|
android:paddingStart="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:paddingLeft="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:paddingEnd="@dimen/context_menu_progress_padding_left"
|
||||||
|
android:paddingRight="@dimen/context_menu_progress_padding_left"
|
||||||
android:text="@string/buy"
|
android:text="@string/buy"
|
||||||
android:visibility="gone"
|
android:textColor="@color/text_color_tab_active_light"
|
||||||
android:layout_marginStart="@dimen/dashFavIconMargin"
|
android:visibility="gone" />
|
||||||
android:layout_marginEnd="8dp"
|
|
||||||
android:paddingEnd="18dp"
|
|
||||||
android:paddingStart="18dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -4332,5 +4332,12 @@
|
||||||
<string name="poi_wildlife_crossing_bat_bridge">Bat bridge</string>
|
<string name="poi_wildlife_crossing_bat_bridge">Bat bridge</string>
|
||||||
<string name="poi_wildlife_crossing_bat_tunnel">Bat tunnel</string>
|
<string name="poi_wildlife_crossing_bat_tunnel">Bat tunnel</string>
|
||||||
|
|
||||||
|
<string name="poi_piste_ski_jump">Ski jump</string>
|
||||||
|
<string name="poi_piste_name">Piste name</string>
|
||||||
|
<string name="poi_gladed_yes">Gladed: yes</string>
|
||||||
|
<string name="poi_patrolled_yes">Patrolled: yes</string>
|
||||||
|
<string name="poi_patrolled_no">Patrolled: no</string>
|
||||||
|
<string name="poi_piste_status_open">Piste status: open</string>
|
||||||
|
<string name="poi_piste_status_closed">Piste status: closed</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -413,4 +413,6 @@
|
||||||
|
|
||||||
<dimen name="radioButtonSize">32dp</dimen>
|
<dimen name="radioButtonSize">32dp</dimen>
|
||||||
<dimen name="checkBoxSize">24dp</dimen>
|
<dimen name="checkBoxSize">24dp</dimen>
|
||||||
|
|
||||||
|
<dimen name="zero">0dp</dimen>
|
||||||
</resources>
|
</resources>
|
|
@ -12,7 +12,14 @@
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<string name="on_pause">On pause</string>
|
<string name="track_recording_description">Are you sure you want to stop recording?\nAll unsaved data will be lost.</string>
|
||||||
|
<string name="track_recording_title">Track recording stopped</string>
|
||||||
|
<string name="track_recording_save_and_stop">Save and stop recording</string>
|
||||||
|
<string name="track_recording_stop_without_saving">Stop without saving</string>
|
||||||
|
<string name="login_open_place_reviews">Login to OpenPlaceReviews</string>
|
||||||
|
<string name="opr_use_dev_url">Use test.openplacereviews.org</string>
|
||||||
|
<string name="open_place_reviews">OpenPlaceReviews</string>
|
||||||
|
<string name="open_place_reviews_plugin_description">OpenPlaceReviews is a community-driven project about public places such as restaurants, hotels, museums, waypoints. It collects all public information about them such as photos, reviews, links to other systems link OpenStreetMap, Wikipedia.\n\nAll OpenPlaceReview data is open and available to everyone: http://openplacereviews.org/data.\n\nYou can read more at: http://openplacereviews.org</string>
|
||||||
<string name="hillshade_slope_contour_lines">Hillshade / Slope / Contour lines</string>
|
<string name="hillshade_slope_contour_lines">Hillshade / Slope / Contour lines</string>
|
||||||
<string name="toast_select_edits_for_upload">Select edits for upload</string>
|
<string name="toast_select_edits_for_upload">Select edits for upload</string>
|
||||||
<string name="uploaded_count">Uploaded %1$d of %2$d</string>
|
<string name="uploaded_count">Uploaded %1$d of %2$d</string>
|
||||||
|
|
31
OsmAnd/res/xml/open_place_reviews.xml
Normal file
31
OsmAnd/res/xml/open_place_reviews.xml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:title="@string/open_place_reviews">
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="opr_settings_info"
|
||||||
|
android:layout="@layout/preference_info"
|
||||||
|
android:persistent="false"
|
||||||
|
android:selectable="false"
|
||||||
|
android:title="@string/plugin_global_prefs_info" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="opr_login_data"
|
||||||
|
android:layout="@layout/preference_with_descr"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/login_open_place_reviews" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="opr_logout"
|
||||||
|
android:layout="@layout/preference_login"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/login_account" />
|
||||||
|
|
||||||
|
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
|
||||||
|
android:key="opr_use_dev_url"
|
||||||
|
android:layout="@layout/preference_with_descr_dialog_and_switch"
|
||||||
|
android:title="@string/opr_use_dev_url"
|
||||||
|
tools:icon="@drawable/ic_plugin_developer" />
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
|
@ -28,7 +28,6 @@ import net.osmand.map.OsmandRegions.RegionTranslation;
|
||||||
import net.osmand.map.WorldRegion;
|
import net.osmand.map.WorldRegion;
|
||||||
import net.osmand.osm.AbstractPoiType;
|
import net.osmand.osm.AbstractPoiType;
|
||||||
import net.osmand.osm.MapPoiTypes;
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.plus.helpers.DayNightHelper;
|
|
||||||
import net.osmand.plus.activities.LocalIndexHelper;
|
import net.osmand.plus.activities.LocalIndexHelper;
|
||||||
import net.osmand.plus.activities.LocalIndexInfo;
|
import net.osmand.plus.activities.LocalIndexInfo;
|
||||||
import net.osmand.plus.activities.SavingTrackHelper;
|
import net.osmand.plus.activities.SavingTrackHelper;
|
||||||
|
@ -36,6 +35,7 @@ import net.osmand.plus.base.MapViewTrackingUtilities;
|
||||||
import net.osmand.plus.download.DownloadActivity;
|
import net.osmand.plus.download.DownloadActivity;
|
||||||
import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
|
import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
|
||||||
import net.osmand.plus.helpers.AvoidSpecificRoads;
|
import net.osmand.plus.helpers.AvoidSpecificRoads;
|
||||||
|
import net.osmand.plus.helpers.DayNightHelper;
|
||||||
import net.osmand.plus.helpers.LockHelper;
|
import net.osmand.plus.helpers.LockHelper;
|
||||||
import net.osmand.plus.helpers.WaypointHelper;
|
import net.osmand.plus.helpers.WaypointHelper;
|
||||||
import net.osmand.plus.inapp.InAppPurchaseHelperImpl;
|
import net.osmand.plus.inapp.InAppPurchaseHelperImpl;
|
||||||
|
@ -45,6 +45,7 @@ import net.osmand.plus.mapmarkers.MapMarkersHelper;
|
||||||
import net.osmand.plus.monitoring.LiveMonitoringHelper;
|
import net.osmand.plus.monitoring.LiveMonitoringHelper;
|
||||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||||
import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
|
import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
|
||||||
|
import net.osmand.plus.openplacereviews.OprAuthHelper;
|
||||||
import net.osmand.plus.osmedit.oauth.OsmOAuthHelper;
|
import net.osmand.plus.osmedit.oauth.OsmOAuthHelper;
|
||||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||||
import net.osmand.plus.quickaction.QuickActionRegistry;
|
import net.osmand.plus.quickaction.QuickActionRegistry;
|
||||||
|
@ -468,6 +469,7 @@ public class AppInitializer implements IProgress {
|
||||||
app.settingsHelper = startupInit(new SettingsHelper(app), SettingsHelper.class);
|
app.settingsHelper = startupInit(new SettingsHelper(app), SettingsHelper.class);
|
||||||
app.quickActionRegistry = startupInit(new QuickActionRegistry(app.getSettings()), QuickActionRegistry.class);
|
app.quickActionRegistry = startupInit(new QuickActionRegistry(app.getSettings()), QuickActionRegistry.class);
|
||||||
app.osmOAuthHelper = startupInit(new OsmOAuthHelper(app), OsmOAuthHelper.class);
|
app.osmOAuthHelper = startupInit(new OsmOAuthHelper(app), OsmOAuthHelper.class);
|
||||||
|
app.oprAuthHelper = startupInit(new OprAuthHelper(app), OprAuthHelper.class);
|
||||||
app.onlineRoutingHelper = startupInit(new OnlineRoutingHelper(app), OnlineRoutingHelper.class);
|
app.onlineRoutingHelper = startupInit(new OnlineRoutingHelper(app), OnlineRoutingHelper.class);
|
||||||
|
|
||||||
initOpeningHoursParser();
|
initOpeningHoursParser();
|
||||||
|
|
|
@ -4,16 +4,13 @@ import android.app.Notification;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.location.LocationManager;
|
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.plus.helpers.LocationServiceHelper;
|
import net.osmand.plus.helpers.LocationServiceHelper;
|
||||||
import net.osmand.plus.helpers.LocationServiceHelper.LocationCallback;
|
import net.osmand.plus.helpers.LocationServiceHelper.LocationCallback;
|
||||||
import net.osmand.plus.notifications.OsmandNotification;
|
import net.osmand.plus.notifications.OsmandNotification;
|
||||||
|
@ -95,12 +92,6 @@ public class NavigationService extends Service {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLocationAvailability(boolean locationAvailable) {
|
public void onLocationAvailability(boolean locationAvailable) {
|
||||||
if (!locationAvailable) {
|
|
||||||
OsmandApplication app = (OsmandApplication) getApplication();
|
|
||||||
if (app != null) {
|
|
||||||
app.showToastMessage(getString(R.string.off_router_service_no_gps_available));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
|
@ -137,10 +128,12 @@ public class NavigationService extends Service {
|
||||||
app.setNavigationService(null);
|
app.setNavigationService(null);
|
||||||
usedBy = 0;
|
usedBy = 0;
|
||||||
// remove updates
|
// remove updates
|
||||||
try {
|
if (locationServiceHelper != null) {
|
||||||
locationServiceHelper.removeLocationUpdates();
|
try {
|
||||||
} catch (SecurityException e) {
|
locationServiceHelper.removeLocationUpdates();
|
||||||
// Location service permission not granted
|
} catch (SecurityException e) {
|
||||||
|
// Location service permission not granted
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// remove notification
|
// remove notification
|
||||||
stopForeground(Boolean.TRUE);
|
stopForeground(Boolean.TRUE);
|
||||||
|
|
|
@ -70,6 +70,7 @@ import net.osmand.plus.mapmarkers.MapMarkersHelper;
|
||||||
import net.osmand.plus.measurementtool.MeasurementEditingContext;
|
import net.osmand.plus.measurementtool.MeasurementEditingContext;
|
||||||
import net.osmand.plus.monitoring.LiveMonitoringHelper;
|
import net.osmand.plus.monitoring.LiveMonitoringHelper;
|
||||||
import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
|
import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
|
||||||
|
import net.osmand.plus.openplacereviews.OprAuthHelper;
|
||||||
import net.osmand.plus.osmedit.oauth.OsmOAuthHelper;
|
import net.osmand.plus.osmedit.oauth.OsmOAuthHelper;
|
||||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||||
import net.osmand.plus.quickaction.QuickActionRegistry;
|
import net.osmand.plus.quickaction.QuickActionRegistry;
|
||||||
|
@ -161,6 +162,7 @@ public class OsmandApplication extends MultiDexApplication {
|
||||||
GpxDbHelper gpxDbHelper;
|
GpxDbHelper gpxDbHelper;
|
||||||
QuickActionRegistry quickActionRegistry;
|
QuickActionRegistry quickActionRegistry;
|
||||||
OsmOAuthHelper osmOAuthHelper;
|
OsmOAuthHelper osmOAuthHelper;
|
||||||
|
OprAuthHelper oprAuthHelper;
|
||||||
MeasurementEditingContext measurementEditingContext;
|
MeasurementEditingContext measurementEditingContext;
|
||||||
OnlineRoutingHelper onlineRoutingHelper;
|
OnlineRoutingHelper onlineRoutingHelper;
|
||||||
|
|
||||||
|
@ -396,6 +398,10 @@ public class OsmandApplication extends MultiDexApplication {
|
||||||
return osmOAuthHelper;
|
return osmOAuthHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OprAuthHelper getOprAuthHelper() {
|
||||||
|
return oprAuthHelper;
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized DownloadIndexesThread getDownloadThread() {
|
public synchronized DownloadIndexesThread getDownloadThread() {
|
||||||
if (downloadIndexesThread == null) {
|
if (downloadIndexesThread == null) {
|
||||||
downloadIndexesThread = new DownloadIndexesThread(this);
|
downloadIndexesThread = new DownloadIndexesThread(this);
|
||||||
|
|
|
@ -35,9 +35,12 @@ import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
|
||||||
import net.osmand.plus.download.IndexItem;
|
import net.osmand.plus.download.IndexItem;
|
||||||
import net.osmand.plus.mapcontextmenu.MenuBuilder;
|
import net.osmand.plus.mapcontextmenu.MenuBuilder;
|
||||||
import net.osmand.plus.mapcontextmenu.MenuController;
|
import net.osmand.plus.mapcontextmenu.MenuController;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener;
|
||||||
import net.osmand.plus.mapillary.MapillaryPlugin;
|
import net.osmand.plus.mapillary.MapillaryPlugin;
|
||||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||||
import net.osmand.plus.myplaces.FavoritesActivity;
|
import net.osmand.plus.myplaces.FavoritesActivity;
|
||||||
|
import net.osmand.plus.openplacereviews.OpenPlaceReviewsPlugin;
|
||||||
import net.osmand.plus.openseamapsplugin.NauticalMapsPlugin;
|
import net.osmand.plus.openseamapsplugin.NauticalMapsPlugin;
|
||||||
import net.osmand.plus.osmedit.OsmEditingPlugin;
|
import net.osmand.plus.osmedit.OsmEditingPlugin;
|
||||||
import net.osmand.plus.parkingpoint.ParkingPositionPlugin;
|
import net.osmand.plus.parkingpoint.ParkingPositionPlugin;
|
||||||
|
@ -66,6 +69,7 @@ import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public abstract class OsmandPlugin {
|
public abstract class OsmandPlugin {
|
||||||
|
@ -133,7 +137,7 @@ public abstract class OsmandPlugin {
|
||||||
public boolean init(@NonNull OsmandApplication app, @Nullable Activity activity) {
|
public boolean init(@NonNull OsmandApplication app, @Nullable Activity activity) {
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
// called from UI
|
// called from UI
|
||||||
for (ApplicationMode appMode: getAddedAppModes()) {
|
for (ApplicationMode appMode : getAddedAppModes()) {
|
||||||
ApplicationMode.changeProfileAvailability(appMode, true, app);
|
ApplicationMode.changeProfileAvailability(appMode, true, app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,6 +212,16 @@ public abstract class OsmandPlugin {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected List<ImageCard> getContextMenuImageCards(@NonNull Map<String, String> params,
|
||||||
|
@Nullable Map<String, String> additionalParams,
|
||||||
|
@Nullable GetImageCardsListener listener) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ImageCard createContextMenuImageCard(@NonNull JSONObject imageObject) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plugin was installed
|
* Plugin was installed
|
||||||
*/
|
*/
|
||||||
|
@ -263,25 +277,19 @@ public abstract class OsmandPlugin {
|
||||||
|
|
||||||
public static void initPlugins(@NonNull OsmandApplication app) {
|
public static void initPlugins(@NonNull OsmandApplication app) {
|
||||||
Set<String> enabledPlugins = app.getSettings().getEnabledPlugins();
|
Set<String> enabledPlugins = app.getSettings().getEnabledPlugins();
|
||||||
|
|
||||||
allPlugins.clear();
|
allPlugins.clear();
|
||||||
|
enablePluginByDefault(app, enabledPlugins, new WikipediaPlugin(app));
|
||||||
enableHiddenPlugin(app, enabledPlugins, new MapillaryPlugin(app));
|
|
||||||
enableHiddenPlugin(app, enabledPlugins, new WikipediaPlugin(app));
|
|
||||||
|
|
||||||
allPlugins.add(new OsmandRasterMapsPlugin(app));
|
allPlugins.add(new OsmandRasterMapsPlugin(app));
|
||||||
allPlugins.add(new OsmandMonitoringPlugin(app));
|
allPlugins.add(new OsmandMonitoringPlugin(app));
|
||||||
checkMarketPlugin(app, enabledPlugins, new SRTMPlugin(app));
|
checkMarketPlugin(app, enabledPlugins, new SRTMPlugin(app));
|
||||||
|
|
||||||
// ? questionable - definitely not market plugin
|
|
||||||
// checkMarketPlugin(app, enabledPlugins, new TouringViewPlugin(app), false, TouringViewPlugin.COMPONENT, null);
|
|
||||||
checkMarketPlugin(app, enabledPlugins, new NauticalMapsPlugin(app));
|
checkMarketPlugin(app, enabledPlugins, new NauticalMapsPlugin(app));
|
||||||
checkMarketPlugin(app, enabledPlugins, new SkiMapsPlugin(app));
|
checkMarketPlugin(app, enabledPlugins, new SkiMapsPlugin(app));
|
||||||
|
|
||||||
allPlugins.add(new AudioVideoNotesPlugin(app));
|
allPlugins.add(new AudioVideoNotesPlugin(app));
|
||||||
checkMarketPlugin(app, enabledPlugins, new ParkingPositionPlugin(app));
|
checkMarketPlugin(app, enabledPlugins, new ParkingPositionPlugin(app));
|
||||||
allPlugins.add(new AccessibilityPlugin(app));
|
|
||||||
allPlugins.add(new OsmEditingPlugin(app));
|
allPlugins.add(new OsmEditingPlugin(app));
|
||||||
|
enablePluginByDefault(app, enabledPlugins, new OpenPlaceReviewsPlugin(app));
|
||||||
|
enablePluginByDefault(app, enabledPlugins, new MapillaryPlugin(app));
|
||||||
|
allPlugins.add(new AccessibilityPlugin(app));
|
||||||
allPlugins.add(new OsmandDevelopmentPlugin(app));
|
allPlugins.add(new OsmandDevelopmentPlugin(app));
|
||||||
|
|
||||||
loadCustomPlugins(app);
|
loadCustomPlugins(app);
|
||||||
|
@ -373,7 +381,7 @@ public abstract class OsmandPlugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void enableHiddenPlugin(@NonNull OsmandApplication app, @NonNull Set<String> enabledPlugins, @NonNull OsmandPlugin plugin) {
|
private static void enablePluginByDefault(@NonNull OsmandApplication app, @NonNull Set<String> enabledPlugins, @NonNull OsmandPlugin plugin) {
|
||||||
allPlugins.add(plugin);
|
allPlugins.add(plugin);
|
||||||
if (!enabledPlugins.contains(plugin.getId()) && !app.getSettings().getPlugins().contains("-" + plugin.getId())) {
|
if (!enabledPlugins.contains(plugin.getId()) && !app.getSettings().getPlugins().contains("-" + plugin.getId())) {
|
||||||
enabledPlugins.add(plugin.getId());
|
enabledPlugins.add(plugin.getId());
|
||||||
|
@ -734,7 +742,6 @@ public abstract class OsmandPlugin {
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void onMapActivityCreate(MapActivity activity) {
|
public static void onMapActivityCreate(MapActivity activity) {
|
||||||
for (OsmandPlugin plugin : getEnabledPlugins()) {
|
for (OsmandPlugin plugin : getEnabledPlugins()) {
|
||||||
plugin.mapActivityCreate(activity);
|
plugin.mapActivityCreate(activity);
|
||||||
|
@ -868,6 +875,23 @@ public abstract class OsmandPlugin {
|
||||||
return collection;
|
return collection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void populateContextMenuImageCards(@NonNull List<ImageCard> imageCards, @NonNull Map<String, String> params,
|
||||||
|
@Nullable Map<String, String> additionalParams, @Nullable GetImageCardsListener listener) {
|
||||||
|
for (OsmandPlugin plugin : getEnabledPlugins()) {
|
||||||
|
imageCards.addAll(plugin.getContextMenuImageCards(params, additionalParams, listener));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageCard createImageCardForJson(@NonNull JSONObject imageObject) {
|
||||||
|
for (OsmandPlugin plugin : getEnabledPlugins()) {
|
||||||
|
ImageCard imageCard = plugin.createContextMenuImageCard(imageObject);
|
||||||
|
if (imageCard != null) {
|
||||||
|
return imageCard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isPackageInstalled(String packageInfo, Context ctx) {
|
public static boolean isPackageInstalled(String packageInfo, Context ctx) {
|
||||||
if (packageInfo == null) {
|
if (packageInfo == null) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.osmand.plus.api;
|
package net.osmand.plus.api;
|
||||||
|
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
public interface SQLiteAPI {
|
public interface SQLiteAPI {
|
||||||
|
|
||||||
|
@ -55,8 +56,6 @@ public interface SQLiteAPI {
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface SQLiteStatement {
|
public interface SQLiteStatement {
|
||||||
|
@ -81,7 +80,9 @@ public interface SQLiteAPI {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLiteConnection getOrCreateDatabase(String name, boolean readOnly);
|
@Nullable
|
||||||
|
SQLiteConnection getOrCreateDatabase(String name, boolean readOnly);
|
||||||
|
|
||||||
public SQLiteConnection openByAbsolutePath(String path, boolean readOnly);
|
@Nullable
|
||||||
|
SQLiteConnection openByAbsolutePath(String path, boolean readOnly);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package net.osmand.plus.api;
|
package net.osmand.plus.api;
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
public class SQLiteAPIImpl implements SQLiteAPI {
|
public class SQLiteAPIImpl implements SQLiteAPI {
|
||||||
|
|
||||||
private OsmandApplication app;
|
private OsmandApplication app;
|
||||||
|
@ -20,6 +22,7 @@ public class SQLiteAPIImpl implements SQLiteAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public SQLiteConnection getOrCreateDatabase(String name, boolean readOnly) {
|
public SQLiteConnection getOrCreateDatabase(String name, boolean readOnly) {
|
||||||
android.database.sqlite.SQLiteDatabase db = null;
|
android.database.sqlite.SQLiteDatabase db = null;
|
||||||
|
@ -29,13 +32,12 @@ public class SQLiteAPIImpl implements SQLiteAPI {
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
LOG.error(e.getMessage(), e);
|
LOG.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
if(db == null) {
|
if (db == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new SQLiteDatabaseWrapper(db) ;
|
return new SQLiteDatabaseWrapper(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class SQLiteDatabaseWrapper implements SQLiteConnection {
|
public class SQLiteDatabaseWrapper implements SQLiteConnection {
|
||||||
android.database.sqlite.SQLiteDatabase ds;
|
android.database.sqlite.SQLiteDatabase ds;
|
||||||
|
|
||||||
|
@ -206,15 +208,15 @@ public class SQLiteAPIImpl implements SQLiteAPI {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public SQLiteConnection openByAbsolutePath(String path, boolean readOnly) {
|
public SQLiteConnection openByAbsolutePath(String path, boolean readOnly) {
|
||||||
// fix http://stackoverflow.com/questions/26937152/workaround-for-nexus-9-sqlite-file-write-operations-on-external-dirs
|
// fix http://stackoverflow.com/questions/26937152/workaround-for-nexus-9-sqlite-file-write-operations-on-external-dirs
|
||||||
android.database.sqlite.SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null,
|
android.database.sqlite.SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null,
|
||||||
readOnly? SQLiteDatabase.OPEN_READONLY : (SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING));
|
readOnly ? SQLiteDatabase.OPEN_READONLY : (SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING));
|
||||||
if(db == null) {
|
if (db == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new SQLiteDatabaseWrapper(db) ;
|
return new SQLiteDatabaseWrapper(db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,8 +143,8 @@ public class OsmandDevelopmentPlugin extends OsmandPlugin {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disable(OsmandApplication app) {
|
public void disable(OsmandApplication app) {
|
||||||
if (app.getSettings().USE_DEV_URL.get()) {
|
if (app.getSettings().OSM_USE_DEV_URL.get()) {
|
||||||
app.getSettings().USE_DEV_URL.set(false);
|
app.getSettings().OSM_USE_DEV_URL.set(false);
|
||||||
app.getOsmOAuthHelper().resetAuthorization();
|
app.getOsmOAuthHelper().resetAuthorization();
|
||||||
}
|
}
|
||||||
super.disable(app);
|
super.disable(app);
|
||||||
|
|
|
@ -19,9 +19,9 @@ 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.BottomSheetItemWithDescription;
|
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
|
||||||
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
|
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
|
||||||
import net.osmand.plus.mapcontextmenu.UploadPhotosAsyncTask.UploadPhotosListener;
|
import net.osmand.plus.mapcontextmenu.UploadPhotosAsyncTask.UploadPhotosProgressListener;
|
||||||
|
|
||||||
public class UploadPhotoProgressBottomSheet extends MenuBottomSheetDialogFragment implements UploadPhotosListener {
|
public class UploadPhotoProgressBottomSheet extends MenuBottomSheetDialogFragment implements UploadPhotosProgressListener {
|
||||||
|
|
||||||
public static final String TAG = UploadPhotoProgressBottomSheet.class.getSimpleName();
|
public static final String TAG = UploadPhotoProgressBottomSheet.class.getSimpleName();
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ public class UploadPhotoProgressBottomSheet extends MenuBottomSheetDialogFragmen
|
||||||
return uploadingFinished ? R.string.shared_string_close : R.string.shared_string_cancel;
|
return uploadingFinished ? R.string.shared_string_close : R.string.shared_string_cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UploadPhotosListener showInstance(@NonNull FragmentManager fragmentManager, int maxProgress, OnDismissListener listener) {
|
public static UploadPhotosProgressListener showInstance(@NonNull FragmentManager fragmentManager, int maxProgress, OnDismissListener listener) {
|
||||||
UploadPhotoProgressBottomSheet fragment = new UploadPhotoProgressBottomSheet();
|
UploadPhotoProgressBottomSheet fragment = new UploadPhotoProgressBottomSheet();
|
||||||
fragment.setRetainInstance(true);
|
fragment.setRetainInstance(true);
|
||||||
fragment.setMaxProgress(maxProgress);
|
fragment.setMaxProgress(maxProgress);
|
||||||
|
|
|
@ -22,6 +22,7 @@ import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
|
||||||
import net.osmand.plus.mapmarkers.MapMarkersGroup;
|
import net.osmand.plus.mapmarkers.MapMarkersGroup;
|
||||||
import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
|
import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
|
||||||
import net.osmand.plus.openplacereviews.OPRConstants;
|
import net.osmand.plus.openplacereviews.OPRConstants;
|
||||||
|
import net.osmand.plus.openplacereviews.OprAuthHelper.OprAuthorizationListener;
|
||||||
import net.osmand.plus.search.QuickSearchDialogFragment;
|
import net.osmand.plus.search.QuickSearchDialogFragment;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
|
@ -326,8 +327,8 @@ public class IntentHelper {
|
||||||
if (uri.toString().startsWith(OPRConstants.OPR_OAUTH_PREFIX)) {
|
if (uri.toString().startsWith(OPRConstants.OPR_OAUTH_PREFIX)) {
|
||||||
String token = uri.getQueryParameter("opr-token");
|
String token = uri.getQueryParameter("opr-token");
|
||||||
String username = uri.getQueryParameter("opr-nickname");
|
String username = uri.getQueryParameter("opr-nickname");
|
||||||
app.getSettings().OPR_ACCESS_TOKEN.set(token);
|
app.getOprAuthHelper().addListener(getOprAuthorizationListener());
|
||||||
app.getSettings().OPR_USERNAME.set(username);
|
app.getOprAuthHelper().authorize(token, username);
|
||||||
mapActivity.setIntent(null);
|
mapActivity.setIntent(null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -348,6 +349,19 @@ public class IntentHelper {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OprAuthorizationListener getOprAuthorizationListener() {
|
||||||
|
return new OprAuthorizationListener() {
|
||||||
|
@Override
|
||||||
|
public void authorizationCompleted() {
|
||||||
|
for (Fragment fragment : mapActivity.getSupportFragmentManager().getFragments()) {
|
||||||
|
if (fragment instanceof OprAuthorizationListener) {
|
||||||
|
((OprAuthorizationListener) fragment).authorizationCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private boolean handleSendText(Intent intent) {
|
private boolean handleSendText(Intent intent) {
|
||||||
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
|
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
|
||||||
if (!Algorithms.isEmpty(sharedText)) {
|
if (!Algorithms.isEmpty(sharedText)) {
|
||||||
|
|
|
@ -63,7 +63,7 @@ class GpxOrFavouritesImportTask extends BaseLoadAsyncTask<Void, Void, GPXFile> {
|
||||||
ZipEntry entry;
|
ZipEntry entry;
|
||||||
while ((entry = zis.getNextEntry()) != null) {
|
while ((entry = zis.getNextEntry()) != null) {
|
||||||
if (entry.getName().endsWith(ImportHelper.KML_SUFFIX)) {
|
if (entry.getName().endsWith(ImportHelper.KML_SUFFIX)) {
|
||||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
InputStream gpxStream = convertKmlToGpxStream(zis);
|
||||||
if (gpxStream != null) {
|
if (gpxStream != null) {
|
||||||
fileSize = gpxStream.available();
|
fileSize = gpxStream.available();
|
||||||
return GPXUtilities.loadGPXFile(gpxStream);
|
return GPXUtilities.loadGPXFile(gpxStream);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.osmand.plus.importfiles;
|
package net.osmand.plus.importfiles;
|
||||||
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -9,13 +10,13 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.OpenableColumns;
|
import android.provider.OpenableColumns;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.CallbackWithObject;
|
import net.osmand.CallbackWithObject;
|
||||||
import net.osmand.GPXUtilities;
|
import net.osmand.GPXUtilities;
|
||||||
import net.osmand.GPXUtilities.GPXFile;
|
import net.osmand.GPXUtilities.GPXFile;
|
||||||
|
@ -418,7 +419,7 @@ public class ImportHelper {
|
||||||
final boolean useImportDir, boolean forceImportFavourites, boolean showInDetailsActivity) {
|
final boolean useImportDir, boolean forceImportFavourites, boolean showInDetailsActivity) {
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
if (result.error != null) {
|
if (result.error != null) {
|
||||||
Toast.makeText(activity, result.error.getMessage(), Toast.LENGTH_LONG).show();
|
app.showToastMessage(result.error.getMessage());
|
||||||
if (gpxImportCompleteListener != null) {
|
if (gpxImportCompleteListener != null) {
|
||||||
gpxImportCompleteListener.onImportComplete(false);
|
gpxImportCompleteListener.onImportComplete(false);
|
||||||
}
|
}
|
||||||
|
@ -439,34 +440,36 @@ public class ImportHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
new AlertDialog.Builder(activity)
|
if (AndroidUtils.isActivityNotDestroyed(activity)) {
|
||||||
.setTitle(R.string.shared_string_import2osmand)
|
new AlertDialog.Builder(activity)
|
||||||
.setMessage(R.string.import_gpx_failed_descr)
|
.setTitle(R.string.shared_string_import2osmand)
|
||||||
.setNeutralButton(R.string.shared_string_permissions, new DialogInterface.OnClickListener() {
|
.setMessage(R.string.import_gpx_failed_descr)
|
||||||
@Override
|
.setNeutralButton(R.string.shared_string_permissions, new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
@Override
|
||||||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||||
Uri uri = Uri.fromParts("package", app.getPackageName(), null);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
intent.setData(uri);
|
Uri uri = Uri.fromParts("package", app.getPackageName(), null);
|
||||||
app.startActivity(intent);
|
intent.setData(uri);
|
||||||
if (gpxImportCompleteListener != null) {
|
app.startActivity(intent);
|
||||||
gpxImportCompleteListener.onImportComplete(false);
|
if (gpxImportCompleteListener != null) {
|
||||||
|
gpxImportCompleteListener.onImportComplete(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.setNegativeButton(R.string.shared_string_cancel, new DialogInterface.OnClickListener() {
|
||||||
.setNegativeButton(R.string.shared_string_cancel, new DialogInterface.OnClickListener() {
|
@Override
|
||||||
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
if (gpxImportCompleteListener != null) {
|
||||||
if (gpxImportCompleteListener != null) {
|
gpxImportCompleteListener.onImportComplete(false);
|
||||||
gpxImportCompleteListener.onImportComplete(false);
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.show();
|
||||||
.show();
|
}
|
||||||
}
|
}
|
||||||
if (forceImportFavourites) {
|
if (forceImportFavourites) {
|
||||||
final Intent newIntent = new Intent(activity, app.getAppCustomization().getFavoritesActivity());
|
Intent newIntent = new Intent(activity, app.getAppCustomization().getFavoritesActivity());
|
||||||
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
newIntent.putExtra(TAB_ID, GPX_TAB);
|
newIntent.putExtra(TAB_ID, GPX_TAB);
|
||||||
activity.startActivity(newIntent);
|
activity.startActivity(newIntent);
|
||||||
|
@ -577,7 +580,7 @@ public class ImportHelper {
|
||||||
showPlanRouteFragment();
|
showPlanRouteFragment();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(activity, warning, Toast.LENGTH_LONG).show();
|
app.showToastMessage(warning);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,26 +622,27 @@ public class ImportHelper {
|
||||||
final boolean forceImportFavourites, final boolean forceImportGpx) {
|
final boolean forceImportFavourites, final boolean forceImportGpx) {
|
||||||
if (gpxFile == null || gpxFile.isPointsEmpty()) {
|
if (gpxFile == null || gpxFile.isPointsEmpty()) {
|
||||||
if (forceImportFavourites) {
|
if (forceImportFavourites) {
|
||||||
final DialogInterface.OnClickListener importAsTrackListener = new DialogInterface.OnClickListener() {
|
if (AndroidUtils.isActivityNotDestroyed(activity)) {
|
||||||
@Override
|
OnClickListener importAsTrackListener = new OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
@Override
|
||||||
switch (which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
case DialogInterface.BUTTON_POSITIVE:
|
switch (which) {
|
||||||
handleResult(gpxFile, fileName, fileSize, save, useImportDir, true);
|
case DialogInterface.BUTTON_POSITIVE:
|
||||||
break;
|
handleResult(gpxFile, fileName, fileSize, save, useImportDir, true);
|
||||||
case DialogInterface.BUTTON_NEGATIVE:
|
break;
|
||||||
dialog.dismiss();
|
case DialogInterface.BUTTON_NEGATIVE:
|
||||||
break;
|
dialog.dismiss();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
};
|
new AlertDialog.Builder(activity)
|
||||||
|
.setTitle(R.string.import_track)
|
||||||
new AlertDialog.Builder(activity)
|
.setMessage(activity.getString(R.string.import_track_desc, fileName))
|
||||||
.setTitle(R.string.import_track)
|
.setPositiveButton(R.string.shared_string_import, importAsTrackListener)
|
||||||
.setMessage(activity.getString(R.string.import_track_desc, fileName))
|
.setNegativeButton(R.string.shared_string_cancel, importAsTrackListener)
|
||||||
.setPositiveButton(R.string.shared_string_import, importAsTrackListener)
|
.show();
|
||||||
.setNegativeButton(R.string.shared_string_cancel, importAsTrackListener)
|
}
|
||||||
.show();
|
|
||||||
} else {
|
} else {
|
||||||
handleResult(gpxFile, fileName, fileSize, save, useImportDir, false);
|
handleResult(gpxFile, fileName, fileSize, save, useImportDir, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ class KmzImportTask extends BaseLoadAsyncTask<Void, Void, GPXFile> {
|
||||||
ZipEntry entry;
|
ZipEntry entry;
|
||||||
while ((entry = zis.getNextEntry()) != null) {
|
while ((entry = zis.getNextEntry()) != null) {
|
||||||
if (entry.getName().endsWith(KML_SUFFIX)) {
|
if (entry.getName().endsWith(KML_SUFFIX)) {
|
||||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
InputStream gpxStream = convertKmlToGpxStream(zis);
|
||||||
if (gpxStream != null) {
|
if (gpxStream != null) {
|
||||||
fileSize = gpxStream.available();
|
fileSize = gpxStream.available();
|
||||||
return GPXUtilities.loadGPXFile(gpxStream);
|
return GPXUtilities.loadGPXFile(gpxStream);
|
||||||
|
|
|
@ -36,6 +36,7 @@ import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.graphics.drawable.DrawableCompat;
|
import androidx.core.graphics.drawable.DrawableCompat;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.Amenity;
|
import net.osmand.data.Amenity;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.PointDescription;
|
import net.osmand.data.PointDescription;
|
||||||
|
@ -47,11 +48,12 @@ import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandPlugin;
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.Version;
|
|
||||||
import net.osmand.plus.activities.ActivityResultListener;
|
import net.osmand.plus.activities.ActivityResultListener;
|
||||||
import net.osmand.plus.activities.ActivityResultListener.OnActivityResultListener;
|
import net.osmand.plus.activities.ActivityResultListener.OnActivityResultListener;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||||
import net.osmand.plus.helpers.FontCache;
|
import net.osmand.plus.helpers.FontCache;
|
||||||
|
import net.osmand.plus.mapcontextmenu.UploadPhotosAsyncTask.UploadPhotosListener;
|
||||||
import net.osmand.plus.mapcontextmenu.builders.cards.AbstractCard;
|
import net.osmand.plus.mapcontextmenu.builders.cards.AbstractCard;
|
||||||
import net.osmand.plus.mapcontextmenu.builders.cards.CardsRowBuilder;
|
import net.osmand.plus.mapcontextmenu.builders.cards.CardsRowBuilder;
|
||||||
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
|
@ -75,6 +77,10 @@ import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -87,6 +93,7 @@ import static net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCa
|
||||||
|
|
||||||
public class MenuBuilder {
|
public class MenuBuilder {
|
||||||
|
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(MenuBuilder.class);
|
||||||
private static final int PICK_IMAGE = 1231;
|
private static final int PICK_IMAGE = 1231;
|
||||||
public static final float SHADOW_HEIGHT_TOP_DP = 17f;
|
public static final float SHADOW_HEIGHT_TOP_DP = 17f;
|
||||||
public static final int TITLE_LIMIT = 60;
|
public static final int TITLE_LIMIT = 60;
|
||||||
|
@ -131,16 +138,14 @@ public class MenuBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlaceIdAcquired(String[] placeId) {
|
public void onPlaceIdAcquired(final String[] placeId) {
|
||||||
MenuBuilder.this.placeId = placeId;
|
MenuBuilder.this.placeId = placeId;
|
||||||
if (placeId.length < 2) {
|
app.runInUIThread(new Runnable() {
|
||||||
app.runInUIThread(new Runnable() {
|
@Override
|
||||||
@Override
|
public void run() {
|
||||||
public void run() {
|
AndroidUiHelper.updateVisibility(photoButton, placeId.length >= 2);
|
||||||
photoButton.setVisibility(View.GONE);
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -158,6 +163,16 @@ public class MenuBuilder {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public void addImageCard(ImageCard card) {
|
||||||
|
if (onlinePhotoCards.size() == 1 && onlinePhotoCards.get(0) instanceof NoImagesCard) {
|
||||||
|
onlinePhotoCards.clear();
|
||||||
|
}
|
||||||
|
onlinePhotoCards.add(0, card);
|
||||||
|
if (onlinePhotoCardsRow != null) {
|
||||||
|
onlinePhotoCardsRow.setCards(onlinePhotoCards);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface CollapseExpandListener {
|
public interface CollapseExpandListener {
|
||||||
void onCollapseExpand(boolean collapsed);
|
void onCollapseExpand(boolean collapsed);
|
||||||
}
|
}
|
||||||
|
@ -443,10 +458,7 @@ public class MenuBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//TODO This feature is under development
|
AndroidUiHelper.updateVisibility(view, false);
|
||||||
if (!Version.isDeveloperVersion(app)) {
|
|
||||||
view.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
photoButton = view;
|
photoButton = view;
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +493,27 @@ public class MenuBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
execute(new UploadPhotosAsyncTask(mapActivity, imagesUri, getLatLon(), placeId, getAdditionalCardParams(), imageCardListener));
|
UploadPhotosListener listener = new UploadPhotosListener() {
|
||||||
|
@Override
|
||||||
|
public void uploadPhotosSuccess(final String response) {
|
||||||
|
app.runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (AndroidUtils.isActivityNotDestroyed(mapActivity)) {
|
||||||
|
try {
|
||||||
|
ImageCard imageCard = OsmandPlugin.createImageCardForJson(new JSONObject(response));
|
||||||
|
if (imageCard != null) {
|
||||||
|
addImageCard(imageCard);
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
execute(new UploadPhotosAsyncTask(mapActivity, imagesUri, placeId, listener));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -4,23 +4,20 @@ import android.content.DialogInterface;
|
||||||
import android.content.DialogInterface.OnDismissListener;
|
import android.content.DialogInterface.OnDismissListener;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Matrix;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.LatLon;
|
|
||||||
import net.osmand.osm.io.NetworkUtils;
|
import net.osmand.osm.io.NetworkUtils;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.dialogs.UploadPhotoProgressBottomSheet;
|
import net.osmand.plus.dialogs.UploadPhotoProgressBottomSheet;
|
||||||
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask;
|
|
||||||
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener;
|
|
||||||
import net.osmand.plus.openplacereviews.OPRConstants;
|
import net.osmand.plus.openplacereviews.OPRConstants;
|
||||||
import net.osmand.plus.openplacereviews.OprStartFragment;
|
import net.osmand.plus.openplacereviews.OprStartFragment;
|
||||||
import net.osmand.plus.osmedit.opr.OpenDBAPI;
|
import net.osmand.plus.osmedit.opr.OpenDBAPI;
|
||||||
|
@ -36,33 +33,27 @@ import java.io.InputStream;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
|
|
||||||
private static final Log LOG = PlatformUtil.getLog(UploadPhotosAsyncTask.class);
|
private static final Log LOG = PlatformUtil.getLog(UploadPhotosAsyncTask.class);
|
||||||
|
|
||||||
private static final int MAX_IMAGE_LENGTH = 2048;
|
private static final int IMAGE_MAX_SIZE = 4096;
|
||||||
|
|
||||||
private final OsmandApplication app;
|
private final OsmandApplication app;
|
||||||
private final WeakReference<MapActivity> activityRef;
|
private final WeakReference<MapActivity> activityRef;
|
||||||
private final OpenDBAPI openDBAPI = new OpenDBAPI();
|
private final OpenDBAPI openDBAPI = new OpenDBAPI();
|
||||||
private final LatLon latLon;
|
|
||||||
private final List<Uri> data;
|
private final List<Uri> data;
|
||||||
private final String[] placeId;
|
private final String[] placeId;
|
||||||
private final Map<String, String> params;
|
private final UploadPhotosListener listener;
|
||||||
private final GetImageCardsListener imageCardListener;
|
private UploadPhotosProgressListener progressListener;
|
||||||
private UploadPhotosListener listener;
|
|
||||||
|
|
||||||
public UploadPhotosAsyncTask(MapActivity activity, List<Uri> data, LatLon latLon, String[] placeId,
|
public UploadPhotosAsyncTask(MapActivity activity, List<Uri> data, String[] placeId, UploadPhotosListener listener) {
|
||||||
Map<String, String> params, GetImageCardsListener imageCardListener) {
|
|
||||||
app = (OsmandApplication) activity.getApplicationContext();
|
app = (OsmandApplication) activity.getApplicationContext();
|
||||||
activityRef = new WeakReference<>(activity);
|
activityRef = new WeakReference<>(activity);
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.latLon = latLon;
|
|
||||||
this.params = params;
|
|
||||||
this.placeId = placeId;
|
this.placeId = placeId;
|
||||||
this.imageCardListener = imageCardListener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -70,7 +61,7 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
FragmentActivity activity = activityRef.get();
|
FragmentActivity activity = activityRef.get();
|
||||||
if (AndroidUtils.isActivityNotDestroyed(activity)) {
|
if (AndroidUtils.isActivityNotDestroyed(activity)) {
|
||||||
FragmentManager manager = activity.getSupportFragmentManager();
|
FragmentManager manager = activity.getSupportFragmentManager();
|
||||||
listener = UploadPhotoProgressBottomSheet.showInstance(manager, data.size(), new OnDismissListener() {
|
progressListener = UploadPhotoProgressBottomSheet.showInstance(manager, data.size(), new OnDismissListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onDismiss(DialogInterface dialog) {
|
public void onDismiss(DialogInterface dialog) {
|
||||||
cancel(false);
|
cancel(false);
|
||||||
|
@ -81,8 +72,8 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onProgressUpdate(Integer... values) {
|
protected void onProgressUpdate(Integer... values) {
|
||||||
if (listener != null) {
|
if (progressListener != null) {
|
||||||
listener.uploadPhotosProgressUpdate(values[0]);
|
progressListener.uploadPhotosProgressUpdate(values[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,18 +94,19 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Void aVoid) {
|
protected void onPostExecute(Void aVoid) {
|
||||||
if (listener != null) {
|
if (progressListener != null) {
|
||||||
listener.uploadPhotosFinished();
|
progressListener.uploadPhotosFinished();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean handleSelectedImage(final Uri uri) {
|
private boolean handleSelectedImage(final Uri uri) {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
InputStream inputStream = null;
|
InputStream inputStream = null;
|
||||||
|
int[] imageDimensions = null;
|
||||||
try {
|
try {
|
||||||
inputStream = app.getContentResolver().openInputStream(uri);
|
inputStream = app.getContentResolver().openInputStream(uri);
|
||||||
if (inputStream != null) {
|
if (inputStream != null) {
|
||||||
success = uploadImageToPlace(inputStream);
|
imageDimensions = calcImageDimensions(inputStream);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOG.error(e);
|
LOG.error(e);
|
||||||
|
@ -122,12 +114,32 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
} finally {
|
} finally {
|
||||||
Algorithms.closeStream(inputStream);
|
Algorithms.closeStream(inputStream);
|
||||||
}
|
}
|
||||||
|
if (imageDimensions != null && imageDimensions.length == 2) {
|
||||||
|
try {
|
||||||
|
inputStream = app.getContentResolver().openInputStream(uri);
|
||||||
|
if (inputStream != null) {
|
||||||
|
int width = imageDimensions[0];
|
||||||
|
int height = imageDimensions[1];
|
||||||
|
success = uploadImageToPlace(inputStream, width, height);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error(e);
|
||||||
|
app.showToastMessage(R.string.cannot_upload_image);
|
||||||
|
} finally {
|
||||||
|
Algorithms.closeStream(inputStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean uploadImageToPlace(InputStream image) {
|
private boolean uploadImageToPlace(InputStream image, int width, int height) {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
InputStream serverData = new ByteArrayInputStream(compressImageToJpeg(image));
|
byte[] jpegImageBytes = compressImageToJpeg(image, width, height);
|
||||||
|
if (jpegImageBytes == null || jpegImageBytes.length == 0) {
|
||||||
|
app.showToastMessage(R.string.cannot_upload_image);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
InputStream serverData = new ByteArrayInputStream(jpegImageBytes);
|
||||||
String baseUrl = OPRConstants.getBaseUrl(app);
|
String baseUrl = OPRConstants.getBaseUrl(app);
|
||||||
// all these should be constant
|
// all these should be constant
|
||||||
String url = baseUrl + "api/ipfs/image";
|
String url = baseUrl + "api/ipfs/image";
|
||||||
|
@ -156,13 +168,9 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
checkTokenAndShowScreen();
|
checkTokenAndShowScreen();
|
||||||
} else {
|
} else {
|
||||||
success = true;
|
success = true;
|
||||||
String str = app.getString(R.string.successfully_uploaded_pattern, 1, 1);
|
|
||||||
app.showToastMessage(str);
|
|
||||||
//refresh the image
|
//refresh the image
|
||||||
|
if (listener != null) {
|
||||||
MapActivity activity = activityRef.get();
|
listener.uploadPhotosSuccess(response);
|
||||||
if (activity != null) {
|
|
||||||
MenuBuilder.execute(new GetImageCardsTask(activity, latLon, params, imageCardListener));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -191,36 +199,55 @@ public class UploadPhotosAsyncTask extends AsyncTask<Void, Integer, Void> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] compressImageToJpeg(InputStream image) {
|
private int[] calcImageDimensions(InputStream image) {
|
||||||
BufferedInputStream bufferedInputStream = new BufferedInputStream(image);
|
BufferedInputStream bufferedInputStream = new BufferedInputStream(image);
|
||||||
Bitmap bmp = BitmapFactory.decodeStream(bufferedInputStream);
|
BitmapFactory.Options opts = new BitmapFactory.Options();
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
opts.inJustDecodeBounds = true;
|
||||||
int h = bmp.getHeight();
|
BitmapFactory.decodeStream(bufferedInputStream, null, opts);
|
||||||
int w = bmp.getWidth();
|
return new int[] { opts.outWidth, opts.outHeight };
|
||||||
boolean scale = false;
|
|
||||||
while (w > MAX_IMAGE_LENGTH || h > MAX_IMAGE_LENGTH) {
|
|
||||||
w = w / 2;
|
|
||||||
h = h / 2;
|
|
||||||
scale = true;
|
|
||||||
}
|
|
||||||
if (scale) {
|
|
||||||
Matrix matrix = new Matrix();
|
|
||||||
matrix.postScale(w, h);
|
|
||||||
Bitmap resizedBitmap = Bitmap.createBitmap(
|
|
||||||
bmp, 0, 0, w, h, matrix, false);
|
|
||||||
bmp.recycle();
|
|
||||||
bmp = resizedBitmap;
|
|
||||||
}
|
|
||||||
bmp.compress(Bitmap.CompressFormat.JPEG, 90, os);
|
|
||||||
return os.toByteArray();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private byte[] compressImageToJpeg(InputStream image, int width, int height) {
|
||||||
|
BufferedInputStream bufferedInputStream = new BufferedInputStream(image);
|
||||||
|
int w = width;
|
||||||
|
int h = height;
|
||||||
|
boolean scale = false;
|
||||||
|
int divider = 1;
|
||||||
|
while (w > IMAGE_MAX_SIZE || h > IMAGE_MAX_SIZE) {
|
||||||
|
w /= 2;
|
||||||
|
h /= 2;
|
||||||
|
divider *= 2;
|
||||||
|
scale = true;
|
||||||
|
}
|
||||||
|
Bitmap bmp;
|
||||||
|
if (scale) {
|
||||||
|
BitmapFactory.Options opts = new BitmapFactory.Options();
|
||||||
|
opts.inSampleSize = divider;
|
||||||
|
bmp = BitmapFactory.decodeStream(bufferedInputStream, null, opts);
|
||||||
|
} else {
|
||||||
|
bmp = BitmapFactory.decodeStream(bufferedInputStream);
|
||||||
|
}
|
||||||
|
if (bmp != null) {
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
bmp.compress(Bitmap.CompressFormat.JPEG, 90, os);
|
||||||
|
return os.toByteArray();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface UploadPhotosListener {
|
public interface UploadPhotosProgressListener {
|
||||||
|
|
||||||
void uploadPhotosProgressUpdate(int progress);
|
void uploadPhotosProgressUpdate(int progress);
|
||||||
|
|
||||||
void uploadPhotosFinished();
|
void uploadPhotosFinished();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface UploadPhotosListener {
|
||||||
|
|
||||||
|
void uploadPhotosSuccess(String response);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -19,17 +19,13 @@ import net.osmand.AndroidNetworkUtils;
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.Amenity;
|
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.Version;
|
import net.osmand.plus.Version;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.mapcontextmenu.MenuBuilder;
|
import net.osmand.plus.mapcontextmenu.MenuBuilder;
|
||||||
import net.osmand.plus.mapillary.MapillaryContributeCard;
|
|
||||||
import net.osmand.plus.mapillary.MapillaryImageCard;
|
|
||||||
import net.osmand.plus.openplacereviews.OPRConstants;
|
|
||||||
import net.osmand.plus.wikimedia.WikiImageHelper;
|
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
@ -41,18 +37,17 @@ import java.text.DateFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static net.osmand.plus.mapillary.MapillaryPlugin.TYPE_MAPILLARY_CONTRIBUTE;
|
||||||
|
import static net.osmand.plus.mapillary.MapillaryPlugin.TYPE_MAPILLARY_PHOTO;
|
||||||
|
|
||||||
public abstract class ImageCard extends AbstractCard {
|
public abstract class ImageCard extends AbstractCard {
|
||||||
|
|
||||||
public static String TYPE_MAPILLARY_PHOTO = "mapillary-photo";
|
|
||||||
public static String TYPE_MAPILLARY_CONTRIBUTE = "mapillary-contribute";
|
|
||||||
|
|
||||||
private static final Log LOG = PlatformUtil.getLog(ImageCard.class);
|
private static final Log LOG = PlatformUtil.getLog(ImageCard.class);
|
||||||
protected String type;
|
protected String type;
|
||||||
|
@ -184,11 +179,7 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
try {
|
try {
|
||||||
if (imageObject.has("type")) {
|
if (imageObject.has("type")) {
|
||||||
String type = imageObject.getString("type");
|
String type = imageObject.getString("type");
|
||||||
if (TYPE_MAPILLARY_PHOTO.equals(type)) {
|
if (!TYPE_MAPILLARY_CONTRIBUTE.equals(type) && !TYPE_MAPILLARY_PHOTO.equals(type)) {
|
||||||
imageCard = new MapillaryImageCard(mapActivity, imageObject);
|
|
||||||
} else if (TYPE_MAPILLARY_CONTRIBUTE.equals(type)) {
|
|
||||||
imageCard = new MapillaryContributeCard(mapActivity, imageObject);
|
|
||||||
} else {
|
|
||||||
imageCard = new UrlImageCard(mapActivity, imageObject);
|
imageCard = new UrlImageCard(mapActivity, imageObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,14 +189,6 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
return imageCard;
|
return imageCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ImageCard createCardOpr(MapActivity mapActivity, JSONObject imageObject) {
|
|
||||||
ImageCard imageCard = null;
|
|
||||||
if (imageObject.has("cid")) {
|
|
||||||
imageCard = new IPFSImageCard(mapActivity, imageObject);
|
|
||||||
}
|
|
||||||
return imageCard;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getCa() {
|
public double getCa() {
|
||||||
return ca;
|
return ca;
|
||||||
}
|
}
|
||||||
|
@ -410,28 +393,6 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String[] getIdFromResponse(String response) {
|
|
||||||
try {
|
|
||||||
JSONArray obj = new JSONObject(response).getJSONArray("objects");
|
|
||||||
JSONArray images = (JSONArray) ((JSONObject) obj.get(0)).get("id");
|
|
||||||
return toStringArray(images);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return new String[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String[] toStringArray(JSONArray array) {
|
|
||||||
if (array == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
String[] arr = new String[array.length()];
|
|
||||||
for (int i = 0; i < arr.length; i++) {
|
|
||||||
arr[i] = array.optString(i);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GetImageCardsTask extends AsyncTask<Void, Void, List<ImageCard>> {
|
public static class GetImageCardsTask extends AsyncTask<Void, Void, List<ImageCard>> {
|
||||||
|
|
||||||
private MapActivity mapActivity;
|
private MapActivity mapActivity;
|
||||||
|
@ -451,7 +412,7 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
}
|
}
|
||||||
|
|
||||||
public GetImageCardsTask(@NonNull MapActivity mapActivity, LatLon latLon,
|
public GetImageCardsTask(@NonNull MapActivity mapActivity, LatLon latLon,
|
||||||
@Nullable Map<String, String> params, GetImageCardsListener listener) {
|
@Nullable Map<String, String> params, GetImageCardsListener listener) {
|
||||||
this.mapActivity = mapActivity;
|
this.mapActivity = mapActivity;
|
||||||
this.app = mapActivity.getMyApplication();
|
this.app = mapActivity.getMyApplication();
|
||||||
this.latLon = latLon;
|
this.latLon = latLon;
|
||||||
|
@ -460,23 +421,9 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<ImageCard> doInBackground(Void... params) {
|
protected List<ImageCard> doInBackground(Void... voids) {
|
||||||
TrafficStats.setThreadStatsTag(GET_IMAGE_CARD_THREAD_ID);
|
TrafficStats.setThreadStatsTag(GET_IMAGE_CARD_THREAD_ID);
|
||||||
List<ImageCard> result = new ArrayList<>();
|
List<ImageCard> result = new ArrayList<>();
|
||||||
Object o = mapActivity.getMapLayers().getContextMenuLayer().getSelectedObject();
|
|
||||||
if (o instanceof Amenity) {
|
|
||||||
Amenity am = (Amenity) o;
|
|
||||||
long amenityId = am.getId() >> 1;
|
|
||||||
String baseUrl = OPRConstants.getBaseUrl(app);
|
|
||||||
String url = baseUrl + "api/objects-by-index?type=opr.place&index=osmid&key=" + amenityId;
|
|
||||||
String response = AndroidNetworkUtils.sendRequest(app, url, Collections.<String, String>emptyMap(),
|
|
||||||
"Requesting location images...", false, false);
|
|
||||||
if (response != null) {
|
|
||||||
getPicturesForPlace(result, response);
|
|
||||||
String[] id = getIdFromResponse(response);
|
|
||||||
listener.onPlaceIdAcquired(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
final Map<String, String> pms = new LinkedHashMap<>();
|
final Map<String, String> pms = new LinkedHashMap<>();
|
||||||
pms.put("lat", "" + (float) latLon.getLatitude());
|
pms.put("lat", "" + (float) latLon.getLatitude());
|
||||||
|
@ -493,19 +440,8 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
if (!Algorithms.isEmpty(preferredLang)) {
|
if (!Algorithms.isEmpty(preferredLang)) {
|
||||||
pms.put("lang", preferredLang);
|
pms.put("lang", preferredLang);
|
||||||
}
|
}
|
||||||
if (this.params != null) {
|
OsmandPlugin.populateContextMenuImageCards(result, pms, params, listener);
|
||||||
String wikidataId = this.params.get(Amenity.WIKIDATA);
|
|
||||||
if (wikidataId != null) {
|
|
||||||
this.params.remove(Amenity.WIKIDATA);
|
|
||||||
WikiImageHelper.addWikidataImageCards(mapActivity, wikidataId, result);
|
|
||||||
}
|
|
||||||
String wikimediaContent = this.params.get(Amenity.WIKIMEDIA_COMMONS);
|
|
||||||
if (wikimediaContent != null) {
|
|
||||||
this.params.remove(Amenity.WIKIMEDIA_COMMONS);
|
|
||||||
WikiImageHelper.addWikimediaImageCards(mapActivity, wikimediaContent, result);
|
|
||||||
}
|
|
||||||
pms.putAll(this.params);
|
|
||||||
}
|
|
||||||
String response = AndroidNetworkUtils.sendRequest(app, "https://osmand.net/api/cm_place", pms,
|
String response = AndroidNetworkUtils.sendRequest(app, "https://osmand.net/api/cm_place", pms,
|
||||||
"Requesting location images...", false, false);
|
"Requesting location images...", false, false);
|
||||||
|
|
||||||
|
@ -517,7 +453,10 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
try {
|
try {
|
||||||
JSONObject imageObject = (JSONObject) images.get(i);
|
JSONObject imageObject = (JSONObject) images.get(i);
|
||||||
if (imageObject != JSONObject.NULL) {
|
if (imageObject != JSONObject.NULL) {
|
||||||
ImageCard imageCard = ImageCard.createCard(mapActivity, imageObject);
|
ImageCard imageCard = OsmandPlugin.createImageCardForJson(imageObject);
|
||||||
|
if (imageCard == null) {
|
||||||
|
imageCard = ImageCard.createCard(mapActivity, imageObject);
|
||||||
|
}
|
||||||
if (imageCard != null) {
|
if (imageCard != null) {
|
||||||
result.add(imageCard);
|
result.add(imageCard);
|
||||||
}
|
}
|
||||||
|
@ -537,36 +476,6 @@ public abstract class ImageCard extends AbstractCard {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getPicturesForPlace(List<ImageCard> result, String response) {
|
|
||||||
try {
|
|
||||||
if (!Algorithms.isEmpty(response)) {
|
|
||||||
JSONArray obj = new JSONObject(response).getJSONArray("objects");
|
|
||||||
JSONObject imagesWrapper = ((JSONObject) ((JSONObject) obj.get(0)).get("images"));
|
|
||||||
Iterator<String> it = imagesWrapper.keys();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
JSONArray images = imagesWrapper.getJSONArray(it.next());
|
|
||||||
if (images.length() > 0) {
|
|
||||||
for (int i = 0; i < images.length(); i++) {
|
|
||||||
try {
|
|
||||||
JSONObject imageObject = (JSONObject) images.get(i);
|
|
||||||
if (imageObject != JSONObject.NULL) {
|
|
||||||
ImageCard imageCard = ImageCard.createCardOpr(mapActivity, imageObject);
|
|
||||||
if (imageCard != null) {
|
|
||||||
result.add(imageCard);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
LOG.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
LOG.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(List<ImageCard> cardList) {
|
protected void onPostExecute(List<ImageCard> cardList) {
|
||||||
result = cardList;
|
result = cardList;
|
||||||
|
|
|
@ -17,27 +17,34 @@ import androidx.appcompat.widget.SwitchCompat;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.map.ITileSource;
|
import net.osmand.map.ITileSource;
|
||||||
import net.osmand.map.TileSourceManager;
|
import net.osmand.map.TileSourceManager;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
|
||||||
import net.osmand.plus.ContextMenuAdapter;
|
import net.osmand.plus.ContextMenuAdapter;
|
||||||
import net.osmand.plus.ContextMenuItem;
|
import net.osmand.plus.ContextMenuItem;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandPlugin;
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.Version;
|
import net.osmand.plus.Version;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.activities.MapActivityLayers;
|
import net.osmand.plus.activities.MapActivityLayers;
|
||||||
import net.osmand.plus.base.BottomSheetDialogFragment;
|
import net.osmand.plus.base.BottomSheetDialogFragment;
|
||||||
import net.osmand.plus.dashboard.DashboardOnMap;
|
import net.osmand.plus.dashboard.DashboardOnMap;
|
||||||
import net.osmand.plus.views.layers.MapInfoLayer;
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
|
import net.osmand.plus.openplacereviews.OpenPlaceReviewsPlugin;
|
||||||
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
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.views.layers.MapInfoLayer;
|
||||||
import net.osmand.plus.views.mapwidgets.MapWidgetRegistry.MapWidgetRegInfo;
|
import net.osmand.plus.views.mapwidgets.MapWidgetRegistry.MapWidgetRegInfo;
|
||||||
import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
|
import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -47,11 +54,18 @@ import static net.osmand.plus.ContextMenuAdapter.makeDeleteAction;
|
||||||
|
|
||||||
public class MapillaryPlugin extends OsmandPlugin {
|
public class MapillaryPlugin extends OsmandPlugin {
|
||||||
|
|
||||||
|
public static String TYPE_MAPILLARY_PHOTO = "mapillary-photo";
|
||||||
|
public static String TYPE_MAPILLARY_CONTRIBUTE = "mapillary-contribute";
|
||||||
|
|
||||||
public static final String ID = "osmand.mapillary";
|
public static final String ID = "osmand.mapillary";
|
||||||
private static final String MAPILLARY_PACKAGE_ID = "app.mapillary";
|
private static final String MAPILLARY_PACKAGE_ID = "app.mapillary";
|
||||||
|
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(OpenPlaceReviewsPlugin.class);
|
||||||
|
|
||||||
private OsmandSettings settings;
|
private OsmandSettings settings;
|
||||||
|
|
||||||
|
private MapActivity mapActivity;
|
||||||
|
|
||||||
private MapillaryRasterLayer rasterLayer;
|
private MapillaryRasterLayer rasterLayer;
|
||||||
private MapillaryVectorLayer vectorLayer;
|
private MapillaryVectorLayer vectorLayer;
|
||||||
private TextInfoWidget mapillaryControl;
|
private TextInfoWidget mapillaryControl;
|
||||||
|
@ -62,11 +76,6 @@ public class MapillaryPlugin extends OsmandPlugin {
|
||||||
settings = app.getSettings();
|
settings = app.getSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisible() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getLogoResourceId() {
|
public int getLogoResourceId() {
|
||||||
return R.drawable.ic_action_mapillary;
|
return R.drawable.ic_action_mapillary;
|
||||||
|
@ -92,6 +101,14 @@ public class MapillaryPlugin extends OsmandPlugin {
|
||||||
return app.getString(R.string.mapillary);
|
return app.getString(R.string.mapillary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean init(@NonNull OsmandApplication app, Activity activity) {
|
||||||
|
if (activity instanceof MapActivity) {
|
||||||
|
mapActivity = (MapActivity) activity;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerLayers(MapActivity activity) {
|
public void registerLayers(MapActivity activity) {
|
||||||
createLayers();
|
createLayers();
|
||||||
|
@ -228,6 +245,41 @@ public class MapillaryPlugin extends OsmandPlugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ImageCard createContextMenuImageCard(@NonNull JSONObject imageObject) {
|
||||||
|
ImageCard imageCard = null;
|
||||||
|
if (mapActivity != null) {
|
||||||
|
try {
|
||||||
|
if (imageObject.has("type")) {
|
||||||
|
String type = imageObject.getString("type");
|
||||||
|
if (TYPE_MAPILLARY_PHOTO.equals(type)) {
|
||||||
|
imageCard = new MapillaryImageCard(mapActivity, imageObject);
|
||||||
|
} else if (TYPE_MAPILLARY_CONTRIBUTE.equals(type)) {
|
||||||
|
imageCard = new MapillaryContributeCard(mapActivity, imageObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return imageCard;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityResume(MapActivity activity) {
|
||||||
|
this.mapActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityResumeOnTop(MapActivity activity) {
|
||||||
|
this.mapActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityPause(MapActivity activity) {
|
||||||
|
this.mapActivity = null;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean openMapillary(FragmentActivity activity, String imageKey) {
|
public static boolean openMapillary(FragmentActivity activity, String imageKey) {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
OsmandApplication app = (OsmandApplication) activity.getApplication();
|
OsmandApplication app = (OsmandApplication) activity.getApplication();
|
||||||
|
|
|
@ -19,8 +19,8 @@ import com.github.mikephil.charting.data.ChartData;
|
||||||
import com.github.mikephil.charting.data.LineData;
|
import com.github.mikephil.charting.data.LineData;
|
||||||
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||||
|
|
||||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
@ -30,10 +30,10 @@ import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
|
||||||
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionAdapterListener;
|
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionAdapterListener;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
||||||
import net.osmand.plus.measurementtool.MeasurementToolFragment.OnUpdateInfoListener;
|
import net.osmand.plus.measurementtool.MeasurementToolFragment.OnUpdateInfoListener;
|
||||||
|
import net.osmand.plus.measurementtool.graph.BaseGraphAdapter;
|
||||||
import net.osmand.plus.measurementtool.graph.CommonGraphAdapter;
|
import net.osmand.plus.measurementtool.graph.CommonGraphAdapter;
|
||||||
import net.osmand.plus.measurementtool.graph.CustomGraphAdapter;
|
import net.osmand.plus.measurementtool.graph.CustomGraphAdapter;
|
||||||
import net.osmand.plus.measurementtool.graph.CustomGraphAdapter.LegendViewType;
|
import net.osmand.plus.measurementtool.graph.CustomGraphAdapter.LegendViewType;
|
||||||
import net.osmand.plus.measurementtool.graph.BaseGraphAdapter;
|
|
||||||
import net.osmand.plus.measurementtool.graph.GraphAdapterHelper;
|
import net.osmand.plus.measurementtool.graph.GraphAdapterHelper;
|
||||||
import net.osmand.plus.measurementtool.graph.GraphAdapterHelper.RefreshMapCallback;
|
import net.osmand.plus.measurementtool.graph.GraphAdapterHelper.RefreshMapCallback;
|
||||||
import net.osmand.plus.routepreparationmenu.RouteDetailsFragment;
|
import net.osmand.plus.routepreparationmenu.RouteDetailsFragment;
|
||||||
|
@ -422,7 +422,7 @@ public class GraphsCard extends BaseCard implements OnUpdateInfoListener {
|
||||||
GpxUiHelper.setupGPXChart(commonGraphAdapter.getChart(), 4, 24f, 16f, !nightMode, true);
|
GpxUiHelper.setupGPXChart(commonGraphAdapter.getChart(), 4, 24f, 16f, !nightMode, true);
|
||||||
List<ILineDataSet> dataSets = GpxUiHelper.getDataSets(commonGraphAdapter.getChart(),
|
List<ILineDataSet> dataSets = GpxUiHelper.getDataSets(commonGraphAdapter.getChart(),
|
||||||
app, analysis, firstType, secondType, false);
|
app, analysis, firstType, secondType, false);
|
||||||
return !Algorithms.isEmpty(dataSets) ? new LineData(dataSets) : null;
|
return new LineData(dataSets);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,12 +447,11 @@ public class GraphsCard extends BaseCard implements OnUpdateInfoListener {
|
||||||
@Override
|
@Override
|
||||||
public BarData getChartData() {
|
public BarData getChartData() {
|
||||||
GpxUiHelper.setupHorizontalGPXChart(app, customGraphAdapter.getChart(), 5, 9, 24, true, nightMode);
|
GpxUiHelper.setupHorizontalGPXChart(app, customGraphAdapter.getChart(), 5, 9, 24, true, nightMode);
|
||||||
BarData data = null;
|
|
||||||
if (!Algorithms.isEmpty(statistics.elements)) {
|
if (!Algorithms.isEmpty(statistics.elements)) {
|
||||||
data = GpxUiHelper.buildStatisticChart(app, customGraphAdapter.getChart(),
|
return GpxUiHelper.buildStatisticChart(app, customGraphAdapter.getChart(),
|
||||||
statistics, analysis, true, nightMode);
|
statistics, analysis, true, nightMode);
|
||||||
}
|
}
|
||||||
return data;
|
return new BarData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,160 @@
|
||||||
|
package net.osmand.plus.monitoring;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.UiUtilities;
|
||||||
|
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
|
||||||
|
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
|
||||||
|
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
|
||||||
|
import net.osmand.plus.widgets.TextViewEx;
|
||||||
|
|
||||||
|
import androidx.annotation.DimenRes;
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
import androidx.appcompat.widget.AppCompatImageView;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogFragment implements View.OnClickListener {
|
||||||
|
|
||||||
|
public static final String TAG = ClearRecordedDataBottomSheetFragment.class.getSimpleName();
|
||||||
|
|
||||||
|
private OsmandApplication app;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createMenuItems(Bundle savedInstanceState) {
|
||||||
|
app = requiredMyApplication();
|
||||||
|
|
||||||
|
items.add(new BottomSheetItemWithDescription.Builder()
|
||||||
|
.setDescription(app.getString(R.string.clear_recorded_data_warning))
|
||||||
|
.setDescriptionColorId(!nightMode ? R.color.text_color_primary_light : R.color.text_color_primary_dark)
|
||||||
|
.setDescriptionMaxLines(2)
|
||||||
|
.setTitle(app.getString(R.string.clear_recorded_data))
|
||||||
|
.setLayoutId(R.layout.bottom_sheet_item_title_with_description)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
|
||||||
|
|
||||||
|
items.add(new BaseBottomSheetItem.Builder()
|
||||||
|
.setCustomView(setupBtn(inflater, ButtonType.CLEAR))
|
||||||
|
.setOnClickListener(this)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
items.add(new BaseBottomSheetItem.Builder()
|
||||||
|
.setCustomView(setupBtn(inflater, ButtonType.CANCEL))
|
||||||
|
.setOnClickListener(this)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private View setupBtn(LayoutInflater inflater, ButtonType type) {
|
||||||
|
View button = inflater.inflate(R.layout.bottom_sheet_item_button_with_icon, null);
|
||||||
|
button.setTag(type);
|
||||||
|
Context context = button.getContext();
|
||||||
|
|
||||||
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||||
|
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
|
||||||
|
int top = context.getResources().getDimensionPixelSize(type.topMarginRes);
|
||||||
|
int bottom = context.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
||||||
|
params.setMargins(horizontal, top, horizontal, bottom);
|
||||||
|
button.setLayoutParams(params);
|
||||||
|
|
||||||
|
UiUtilities.setupDialogButton(nightMode, button, type.effect, type.titleId);
|
||||||
|
|
||||||
|
TextViewEx title = button.findViewById(R.id.button_text);
|
||||||
|
int margin = context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
|
||||||
|
UiUtilities.setMargins(title, 0, margin, 0, margin);
|
||||||
|
|
||||||
|
int colorRes;
|
||||||
|
if (type.effect == UiUtilities.DialogButtonType.SECONDARY_HARMFUL) {
|
||||||
|
colorRes = R.color.color_osm_edit_delete;
|
||||||
|
} else {
|
||||||
|
colorRes = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light;
|
||||||
|
}
|
||||||
|
AppCompatImageView icon = button.findViewById(R.id.icon);
|
||||||
|
icon.setImageDrawable(getIcon(type.iconRes, colorRes));
|
||||||
|
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Object o = v.getTag();
|
||||||
|
if (!(o instanceof ButtonType)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ButtonType tag = (ButtonType) o;
|
||||||
|
if (tag == ButtonType.CLEAR) {
|
||||||
|
app.getSavingTrackHelper().clearRecordedData(true);
|
||||||
|
}
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// Replace later with tTripRecordingActiveBottomSheet.hide()
|
||||||
|
Fragment target = getTargetFragment();
|
||||||
|
if (target instanceof TripRecordingActiveBottomSheet) {
|
||||||
|
Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog();
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
// Replace later with tTripRecordingActiveBottomSheet.show()
|
||||||
|
Fragment target = getTargetFragment();
|
||||||
|
if (target instanceof TripRecordingActiveBottomSheet) {
|
||||||
|
Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog();
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ButtonType {
|
||||||
|
CLEAR(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark, R.dimen.dialog_content_margin, UiUtilities.DialogButtonType.SECONDARY_HARMFUL),
|
||||||
|
CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close, R.dimen.content_padding_small, UiUtilities.DialogButtonType.SECONDARY);
|
||||||
|
|
||||||
|
@StringRes
|
||||||
|
private final int titleId;
|
||||||
|
@DrawableRes
|
||||||
|
private final int iconRes;
|
||||||
|
@DimenRes
|
||||||
|
private final int topMarginRes;
|
||||||
|
private final UiUtilities.DialogButtonType effect;
|
||||||
|
|
||||||
|
ButtonType(int titleId, int iconRes, int topMarginRes, UiUtilities.DialogButtonType effect) {
|
||||||
|
this.titleId = titleId;
|
||||||
|
this.iconRes = iconRes;
|
||||||
|
this.topMarginRes = topMarginRes;
|
||||||
|
this.effect = effect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean hideButtonsContainer() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
|
||||||
|
if (!fragmentManager.isStateSaved()) {
|
||||||
|
ClearRecordedDataBottomSheetFragment fragment = new ClearRecordedDataBottomSheetFragment();
|
||||||
|
fragment.setTargetFragment(target, 0);
|
||||||
|
fragment.show(fragmentManager, TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
package net.osmand.plus.monitoring;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.UiUtilities;
|
||||||
|
import net.osmand.plus.UiUtilities.DialogButtonType;
|
||||||
|
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
|
||||||
|
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
|
||||||
|
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
|
import net.osmand.plus.widgets.TextViewEx;
|
||||||
|
|
||||||
|
import androidx.annotation.DimenRes;
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
import androidx.appcompat.widget.AppCompatImageView;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragment implements View.OnClickListener {
|
||||||
|
|
||||||
|
public static final String TAG = StopTrackRecordingBottomFragment.class.getSimpleName();
|
||||||
|
|
||||||
|
private OsmandApplication app;
|
||||||
|
private OsmandSettings settings;
|
||||||
|
private OsmandMonitoringPlugin plugin;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createMenuItems(Bundle savedInstanceState) {
|
||||||
|
app = requiredMyApplication();
|
||||||
|
settings = app.getSettings();
|
||||||
|
plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
|
||||||
|
|
||||||
|
items.add(new BottomSheetItemWithDescription.Builder()
|
||||||
|
.setDescription(app.getString(R.string.track_recording_description))
|
||||||
|
.setDescriptionColorId(!nightMode ? R.color.text_color_primary_light : R.color.text_color_primary_dark)
|
||||||
|
.setDescriptionMaxLines(4)
|
||||||
|
.setTitle(app.getString(R.string.track_recording_title))
|
||||||
|
.setLayoutId(R.layout.bottom_sheet_item_title_with_description)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
|
||||||
|
|
||||||
|
items.add(new BaseBottomSheetItem.Builder()
|
||||||
|
.setCustomView(setupButton(inflater, ButtonType.STOP_AND_DISCARD))
|
||||||
|
.setOnClickListener(this)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
items.add(new BaseBottomSheetItem.Builder()
|
||||||
|
.setCustomView(setupButton(inflater, ButtonType.SAVE_AND_STOP))
|
||||||
|
.setOnClickListener(this)
|
||||||
|
.create());
|
||||||
|
|
||||||
|
items.add(new BaseBottomSheetItem.Builder()
|
||||||
|
.setCustomView(setupButton(inflater, ButtonType.CANCEL))
|
||||||
|
.setOnClickListener(this)
|
||||||
|
.create());
|
||||||
|
}
|
||||||
|
|
||||||
|
private View setupButton(LayoutInflater inflater, ButtonType type) {
|
||||||
|
View button = inflater.inflate(R.layout.bottom_sheet_item_button_with_icon, null);
|
||||||
|
button.setTag(type);
|
||||||
|
Context context = button.getContext();
|
||||||
|
|
||||||
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||||
|
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
|
||||||
|
int top = context.getResources().getDimensionPixelSize(type.topMarginRes);
|
||||||
|
int bottom = context.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
||||||
|
params.setMargins(horizontal, top, horizontal, bottom);
|
||||||
|
button.setLayoutParams(params);
|
||||||
|
|
||||||
|
UiUtilities.setupDialogButton(nightMode, button, type.effect, type.titleId);
|
||||||
|
|
||||||
|
TextViewEx title = button.findViewById(R.id.button_text);
|
||||||
|
int margin = context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
|
||||||
|
UiUtilities.setMargins(title, 0, margin, 0, margin);
|
||||||
|
|
||||||
|
int colorRes;
|
||||||
|
if (type.effect == DialogButtonType.SECONDARY_HARMFUL) {
|
||||||
|
colorRes = R.color.color_osm_edit_delete;
|
||||||
|
} else {
|
||||||
|
colorRes = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light;
|
||||||
|
}
|
||||||
|
AppCompatImageView icon = button.findViewById(R.id.icon);
|
||||||
|
icon.setImageDrawable(getIcon(type.iconRes, colorRes));
|
||||||
|
|
||||||
|
if (type == ButtonType.STOP_AND_DISCARD) {
|
||||||
|
int size = context.getResources().getDimensionPixelSize(R.dimen.map_widget_height);
|
||||||
|
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(size, size);
|
||||||
|
icon.setLayoutParams(iconParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Object o = v.getTag();
|
||||||
|
if (!(o instanceof ButtonType)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ButtonType tag = (ButtonType) o;
|
||||||
|
if (tag == ButtonType.STOP_AND_DISCARD) {
|
||||||
|
if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
|
||||||
|
plugin.stopRecording();
|
||||||
|
app.getNotificationHelper().refreshNotifications();
|
||||||
|
}
|
||||||
|
app.getSavingTrackHelper().clearRecordedData(true);
|
||||||
|
} else if (tag == ButtonType.SAVE_AND_STOP) {
|
||||||
|
if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
|
||||||
|
plugin.saveCurrentTrack();
|
||||||
|
app.getNotificationHelper().refreshNotifications();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// Replace later with tTripRecordingActiveBottomSheet.hide()
|
||||||
|
Fragment target = getTargetFragment();
|
||||||
|
if (target instanceof TripRecordingActiveBottomSheet) {
|
||||||
|
Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog();
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
// Replace later with tTripRecordingActiveBottomSheet.show()
|
||||||
|
Fragment target = getTargetFragment();
|
||||||
|
if (target instanceof TripRecordingActiveBottomSheet) {
|
||||||
|
Dialog dialog = ((TripRecordingActiveBottomSheet) target).getDialog();
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ButtonType {
|
||||||
|
STOP_AND_DISCARD(R.string.track_recording_stop_without_saving, R.drawable.ic_action_rec_stop, R.dimen.dialog_content_margin, DialogButtonType.SECONDARY_HARMFUL),
|
||||||
|
SAVE_AND_STOP(R.string.track_recording_save_and_stop, R.drawable.ic_action_save_to_file, R.dimen.content_padding_small, DialogButtonType.SECONDARY),
|
||||||
|
CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close, R.dimen.zero, DialogButtonType.SECONDARY);
|
||||||
|
|
||||||
|
@StringRes
|
||||||
|
private final int titleId;
|
||||||
|
@DrawableRes
|
||||||
|
private final int iconRes;
|
||||||
|
@DimenRes
|
||||||
|
private final int topMarginRes;
|
||||||
|
private final DialogButtonType effect;
|
||||||
|
|
||||||
|
ButtonType(int titleId, int iconRes, int topMarginRes, DialogButtonType type) {
|
||||||
|
this.titleId = titleId;
|
||||||
|
this.iconRes = iconRes;
|
||||||
|
this.topMarginRes = topMarginRes;
|
||||||
|
this.effect = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean hideButtonsContainer() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
|
||||||
|
if (!fragmentManager.isStateSaved()) {
|
||||||
|
StopTrackRecordingBottomFragment fragment = new StopTrackRecordingBottomFragment();
|
||||||
|
fragment.setTargetFragment(target, 0);
|
||||||
|
fragment.show(fragmentManager, TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -192,9 +192,9 @@ public class EditTrackGroupDialogFragment extends MenuBottomSheetDialogFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseBottomSheetItem createCopyToMarkersItem(final GPXFile gpxFile) {
|
private BaseBottomSheetItem createCopyToMarkersItem(final GPXFile gpxFile) {
|
||||||
final MapMarkersGroup markersGroup = getOrCreateMarkersGroup(gpxFile);
|
MapMarkersGroup markersGroup = mapMarkersHelper.getMarkersGroup(gpxFile);
|
||||||
final Set<String> categories = markersGroup.getWptCategories();
|
final boolean synced = markersGroup != null && (Algorithms.isEmpty(markersGroup.getWptCategories())
|
||||||
final boolean synced = categories != null && categories.contains(group.getName());
|
|| markersGroup.getWptCategories().contains(group.getName()));
|
||||||
|
|
||||||
return new SimpleBottomSheetItem.Builder()
|
return new SimpleBottomSheetItem.Builder()
|
||||||
.setIcon(getContentIcon(synced ? R.drawable.ic_action_delete_dark : R.drawable.ic_action_copy))
|
.setIcon(getContentIcon(synced ? R.drawable.ic_action_delete_dark : R.drawable.ic_action_copy))
|
||||||
|
@ -203,18 +203,25 @@ public class EditTrackGroupDialogFragment extends MenuBottomSheetDialogFragment
|
||||||
.setOnClickListener(new View.OnClickListener() {
|
.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
updateGroupWptCategory(gpxFile, markersGroup, categories, synced);
|
updateGroupWptCategory(gpxFile, synced);
|
||||||
dismiss();
|
dismiss();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.create();
|
.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateGroupWptCategory(GPXFile gpxFile, MapMarkersGroup markersGroup, Set<String> categories, boolean synced) {
|
private void updateGroupWptCategory(GPXFile gpxFile, boolean synced) {
|
||||||
SelectedGpxFile selectedGpxFile = selectedGpxHelper.getSelectedFileByPath(gpxFile.path);
|
SelectedGpxFile selectedGpxFile = selectedGpxHelper.getSelectedFileByPath(gpxFile.path);
|
||||||
if (selectedGpxFile == null) {
|
if (selectedGpxFile == null) {
|
||||||
selectedGpxHelper.selectGpxFile(gpxFile, true, false, false, false, false);
|
selectedGpxHelper.selectGpxFile(gpxFile, true, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
boolean groupCreated = false;
|
||||||
|
MapMarkersGroup markersGroup = mapMarkersHelper.getMarkersGroup(gpxFile);
|
||||||
|
if (markersGroup == null) {
|
||||||
|
groupCreated = true;
|
||||||
|
markersGroup = mapMarkersHelper.addOrEnableGroup(gpxFile);
|
||||||
|
}
|
||||||
|
Set<String> categories = markersGroup.getWptCategories();
|
||||||
Set<String> selectedCategories = new HashSet<>();
|
Set<String> selectedCategories = new HashSet<>();
|
||||||
if (categories != null) {
|
if (categories != null) {
|
||||||
selectedCategories.addAll(categories);
|
selectedCategories.addAll(categories);
|
||||||
|
@ -224,16 +231,14 @@ public class EditTrackGroupDialogFragment extends MenuBottomSheetDialogFragment
|
||||||
} else {
|
} else {
|
||||||
selectedCategories.add(group.getName());
|
selectedCategories.add(group.getName());
|
||||||
}
|
}
|
||||||
mapMarkersHelper.updateGroupWptCategories(markersGroup, selectedCategories);
|
if (Algorithms.isEmpty(selectedCategories)) {
|
||||||
mapMarkersHelper.runSynchronization(markersGroup);
|
mapMarkersHelper.removeMarkersGroup(markersGroup);
|
||||||
}
|
} else {
|
||||||
|
mapMarkersHelper.updateGroupWptCategories(markersGroup, selectedCategories);
|
||||||
private MapMarkersGroup getOrCreateMarkersGroup(GPXFile gpxFile) {
|
if (!groupCreated) {
|
||||||
MapMarkersGroup markersGroup = mapMarkersHelper.getMarkersGroup(gpxFile);
|
mapMarkersHelper.runSynchronization(markersGroup);
|
||||||
if (markersGroup == null) {
|
}
|
||||||
markersGroup = mapMarkersHelper.addOrEnableGroup(gpxFile);
|
|
||||||
}
|
}
|
||||||
return markersGroup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseBottomSheetItem createCopyToFavoritesItem() {
|
private BaseBottomSheetItem createCopyToFavoritesItem() {
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
package net.osmand.plus.mapcontextmenu.builders.cards;
|
package net.osmand.plus.openplacereviews;
|
||||||
|
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
@ -16,16 +20,17 @@ public class IPFSImageCard extends ImageCard {
|
||||||
|
|
||||||
public IPFSImageCard(MapActivity mapActivity, JSONObject imageObject) {
|
public IPFSImageCard(MapActivity mapActivity, JSONObject imageObject) {
|
||||||
super(mapActivity, imageObject);
|
super(mapActivity, imageObject);
|
||||||
String cid = "";
|
|
||||||
try {
|
try {
|
||||||
cid = (String) imageObject.get("cid");
|
String calcImageUrl = mapActivity.getString(R.string.opr_base_url) + "api/ipfs/image?";
|
||||||
|
calcImageUrl += "cid=" + (String) imageObject.getString("cid");
|
||||||
|
calcImageUrl += "&hash=" + (String) imageObject.getString("hash");
|
||||||
|
calcImageUrl += "&ext=" + (String) imageObject.getString("extension");
|
||||||
|
url = calcImageUrl;
|
||||||
|
imageHiresUrl = url;
|
||||||
|
imageUrl = url;
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
LOG.error(e);
|
LOG.error(e);
|
||||||
}
|
}
|
||||||
String BASE_URL = mapActivity.getString(R.string.opr_base_url) + "api/ipfs/image-ipfs?cid=";
|
|
||||||
url = BASE_URL + cid;
|
|
||||||
imageHiresUrl = BASE_URL + cid;
|
|
||||||
imageUrl = BASE_URL + cid;
|
|
||||||
icon = ContextCompat.getDrawable(getMyApplication(), R.drawable.ic_logo_openplacereview);
|
icon = ContextCompat.getDrawable(getMyApplication(), R.drawable.ic_logo_openplacereview);
|
||||||
if (!Algorithms.isEmpty(getUrl())) {
|
if (!Algorithms.isEmpty(getUrl())) {
|
||||||
View.OnClickListener onClickListener = new View.OnClickListener() {
|
View.OnClickListener onClickListener = new View.OnClickListener() {
|
|
@ -1,9 +1,9 @@
|
||||||
package net.osmand.plus.openplacereviews;
|
package net.osmand.plus.openplacereviews;
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.osmedit.opr.OpenDBAPI;
|
import net.osmand.plus.osmedit.opr.OpenDBAPI;
|
||||||
|
|
||||||
public class OPRConstants {
|
public class OPRConstants {
|
||||||
|
@ -11,28 +11,27 @@ public class OPRConstants {
|
||||||
private static final String PURPOSE = OpenDBAPI.PURPOSE;
|
private static final String PURPOSE = OpenDBAPI.PURPOSE;
|
||||||
private static final String CALLBACK_URL = OPR_OAUTH_PREFIX + "://osmand_opr_auth";
|
private static final String CALLBACK_URL = OPR_OAUTH_PREFIX + "://osmand_opr_auth";
|
||||||
|
|
||||||
public static String getBaseUrl(Context ctx) {
|
public static String getBaseUrl(@NonNull OsmandApplication app) {
|
||||||
return ctx.getString(R.string.opr_base_url);
|
return app.getSettings().getOprUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getLoginUrl(@NonNull OsmandApplication app) {
|
||||||
public static String getLoginUrl(Context ctx) {
|
return getBaseUrl(app) + "login" + getQueryString();
|
||||||
return getBaseUrl(ctx) + "login" + getQueryString(ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getRegisterUrl(Context ctx) {
|
public static String getRegisterUrl(@NonNull OsmandApplication app) {
|
||||||
return getBaseUrl(ctx) + "signup" + getQueryString(ctx);
|
return getBaseUrl(app) + "signup" + getQueryString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getQueryString(Context ctx) {
|
public static String getQueryString() {
|
||||||
return "?" + getPurposeParam(ctx) + "&" + getCallbackParam(ctx);
|
return "?" + getPurposeParam() + "&" + getCallbackParam();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getPurposeParam(Context ctx) {
|
public static String getPurposeParam() {
|
||||||
return "purpose=" + PURPOSE;
|
return "purpose=" + PURPOSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCallbackParam(Context ctx) {
|
public static String getCallbackParam() {
|
||||||
return "callback=" + CALLBACK_URL;
|
return "callback=" + CALLBACK_URL;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,199 @@
|
||||||
|
package net.osmand.plus.openplacereviews;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.osmand.AndroidNetworkUtils;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
|
import net.osmand.data.Amenity;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener;
|
||||||
|
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class OpenPlaceReviewsPlugin extends OsmandPlugin {
|
||||||
|
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(OpenPlaceReviewsPlugin.class);
|
||||||
|
|
||||||
|
public static final String ID = "osmand.openplacereviews";
|
||||||
|
|
||||||
|
private MapActivity mapActivity;
|
||||||
|
|
||||||
|
public OpenPlaceReviewsPlugin(OsmandApplication app) {
|
||||||
|
super(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return app.getString(R.string.open_place_reviews);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getDescription() {
|
||||||
|
return app.getString(R.string.open_place_reviews_plugin_description);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SettingsScreenType getSettingsScreenType() {
|
||||||
|
return SettingsScreenType.OPEN_PLACE_REVIEWS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLogoResourceId() {
|
||||||
|
return R.drawable.ic_img_logo_openplacereview;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Drawable getAssetResourceImage() {
|
||||||
|
return app.getUIUtilities().getIcon(R.drawable.img_plugin_openplacereviews);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityResume(MapActivity activity) {
|
||||||
|
this.mapActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityResumeOnTop(MapActivity activity) {
|
||||||
|
this.mapActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityPause(MapActivity activity) {
|
||||||
|
this.mapActivity = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<ImageCard> getContextMenuImageCards(@NonNull Map<String, String> params,
|
||||||
|
@Nullable Map<String, String> additionalParams,
|
||||||
|
@Nullable GetImageCardsListener listener) {
|
||||||
|
List<ImageCard> imageCards = new ArrayList<>();
|
||||||
|
if (mapActivity != null) {
|
||||||
|
Object object = mapActivity.getMapLayers().getContextMenuLayer().getSelectedObject();
|
||||||
|
if (object instanceof Amenity) {
|
||||||
|
Amenity am = (Amenity) object;
|
||||||
|
long amenityId = am.getId() >> 1;
|
||||||
|
String baseUrl = OPRConstants.getBaseUrl(app);
|
||||||
|
String url = baseUrl + "api/objects-by-index?type=opr.place&index=osmid&key=" + amenityId;
|
||||||
|
String response = AndroidNetworkUtils.sendRequest(app, url, Collections.<String, String>emptyMap(),
|
||||||
|
"Requesting location images...", false, false);
|
||||||
|
if (response != null) {
|
||||||
|
getPicturesForPlace(imageCards, response);
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onPlaceIdAcquired(getIdFromResponse(response));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return imageCards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ImageCard createContextMenuImageCard(@NonNull JSONObject imageObject) {
|
||||||
|
ImageCard imageCard = null;
|
||||||
|
if (mapActivity != null && imageObject != JSONObject.NULL) {
|
||||||
|
imageCard = createCardOpr(mapActivity, imageObject);
|
||||||
|
}
|
||||||
|
return imageCard;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getPicturesForPlace(List<ImageCard> result, String response) {
|
||||||
|
try {
|
||||||
|
if (!Algorithms.isEmpty(response)) {
|
||||||
|
JSONArray obj = new JSONObject(response).getJSONArray("objects");
|
||||||
|
JSONObject imagesWrapper = ((JSONObject) ((JSONObject) obj.get(0)).get("images"));
|
||||||
|
Iterator<String> it = imagesWrapper.keys();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
JSONArray images = imagesWrapper.getJSONArray(it.next());
|
||||||
|
if (images.length() > 0) {
|
||||||
|
for (int i = 0; i < images.length(); i++) {
|
||||||
|
try {
|
||||||
|
JSONObject imageObject = (JSONObject) images.get(i);
|
||||||
|
if (imageObject != JSONObject.NULL) {
|
||||||
|
ImageCard imageCard = createCardOpr(mapActivity, imageObject);
|
||||||
|
if (imageCard != null) {
|
||||||
|
result.add(imageCard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageCard createCardOpr(MapActivity mapActivity, JSONObject imageObject) {
|
||||||
|
ImageCard imageCard = null;
|
||||||
|
if (imageObject.has("cid")) {
|
||||||
|
imageCard = new IPFSImageCard(mapActivity, imageObject);
|
||||||
|
}
|
||||||
|
return imageCard;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] getIdFromResponse(String response) {
|
||||||
|
try {
|
||||||
|
JSONArray obj = new JSONObject(response).getJSONArray("objects");
|
||||||
|
JSONArray images = (JSONArray) ((JSONObject) obj.get(0)).get("id");
|
||||||
|
return toStringArray(images);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] toStringArray(JSONArray array) {
|
||||||
|
if (array == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
String[] arr = new String[array.length()];
|
||||||
|
for (int i = 0; i < arr.length; i++) {
|
||||||
|
arr[i] = array.optString(i);
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean init(@NonNull OsmandApplication app, Activity activity) {
|
||||||
|
if (activity instanceof MapActivity) {
|
||||||
|
mapActivity = (MapActivity) activity;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable(OsmandApplication app) {
|
||||||
|
if (app.getSettings().OPR_USE_DEV_URL.get()) {
|
||||||
|
app.getSettings().OPR_USE_DEV_URL.set(false);
|
||||||
|
app.getOprAuthHelper().resetAuthorization();
|
||||||
|
}
|
||||||
|
super.disable(app);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
package net.osmand.plus.openplacereviews;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.osmedit.opr.OpenDBAPI;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class OprAuthHelper {
|
||||||
|
|
||||||
|
private final OsmandApplication app;
|
||||||
|
private final OsmandSettings settings;
|
||||||
|
private final Set<OprAuthorizationListener> listeners = new HashSet<>();
|
||||||
|
|
||||||
|
public OprAuthHelper(@NonNull OsmandApplication app) {
|
||||||
|
this.app = app;
|
||||||
|
settings = app.getSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addListener(OprAuthorizationListener listener) {
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeListener(OprAuthorizationListener listener) {
|
||||||
|
listeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetAuthorization() {
|
||||||
|
if (isLoginExists()) {
|
||||||
|
settings.OPR_USERNAME.resetToDefault();
|
||||||
|
settings.OPR_ACCESS_TOKEN.resetToDefault();
|
||||||
|
settings.OPR_BLOCKCHAIN_NAME.resetToDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLoginExists() {
|
||||||
|
return !Algorithms.isEmpty(settings.OPR_USERNAME.get())
|
||||||
|
&& !Algorithms.isEmpty(settings.OPR_BLOCKCHAIN_NAME.get())
|
||||||
|
&& !Algorithms.isEmpty(settings.OPR_ACCESS_TOKEN.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyAndRemoveListeners() {
|
||||||
|
for (OprAuthorizationListener listener : listeners) {
|
||||||
|
listener.authorizationCompleted();
|
||||||
|
}
|
||||||
|
listeners.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void authorize(final String token, final String username) {
|
||||||
|
CheckOprAuthTask checkOprAuthTask = new CheckOprAuthTask(app, token, username);
|
||||||
|
checkOprAuthTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class CheckOprAuthTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
|
|
||||||
|
private final OsmandApplication app;
|
||||||
|
private final OpenDBAPI openDBAPI = new OpenDBAPI();
|
||||||
|
|
||||||
|
private final String token;
|
||||||
|
private final String username;
|
||||||
|
|
||||||
|
private CheckOprAuthTask(@NonNull OsmandApplication app, String token, String username) {
|
||||||
|
this.app = app;
|
||||||
|
this.token = token;
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(Void... params) {
|
||||||
|
String baseUrl = OPRConstants.getBaseUrl(app);
|
||||||
|
return openDBAPI.checkPrivateKeyValid(app, baseUrl, username, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Boolean result) {
|
||||||
|
if (result) {
|
||||||
|
app.getSettings().OPR_ACCESS_TOKEN.set(token);
|
||||||
|
app.getSettings().OPR_USERNAME.set(username);
|
||||||
|
} else {
|
||||||
|
app.getOprAuthHelper().resetAuthorization();
|
||||||
|
}
|
||||||
|
app.getOprAuthHelper().notifyAndRemoveListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OprAuthorizationListener {
|
||||||
|
void authorizationCompleted();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
package net.osmand.plus.openplacereviews;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.activity.OnBackPressedCallback;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.openplacereviews.OprAuthHelper.OprAuthorizationListener;
|
||||||
|
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
|
||||||
|
import net.osmand.plus.settings.fragments.OnPreferenceChanged;
|
||||||
|
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
|
||||||
|
|
||||||
|
public class OprSettingsFragment extends BaseSettingsFragment implements OnPreferenceChanged, OprAuthorizationListener {
|
||||||
|
|
||||||
|
private static final String OPR_LOGOUT = "opr_logout";
|
||||||
|
public static final String OPR_LOGIN_DATA = "opr_login_data";
|
||||||
|
|
||||||
|
private OprAuthHelper authHelper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
authHelper = app.getOprAuthHelper();
|
||||||
|
|
||||||
|
FragmentActivity activity = requireMyActivity();
|
||||||
|
activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||||
|
public void handleOnBackPressed() {
|
||||||
|
MapActivity mapActivity = getMapActivity();
|
||||||
|
if (mapActivity != null) {
|
||||||
|
mapActivity.launchPrevActivityIntent();
|
||||||
|
}
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setupPreferences() {
|
||||||
|
Preference oprSettingsInfo = findPreference("opr_settings_info");
|
||||||
|
oprSettingsInfo.setIconSpaceReserved(false);
|
||||||
|
|
||||||
|
setupLoginPref();
|
||||||
|
setupLogoutPref();
|
||||||
|
setupUseDevUrlPref();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupLoginPref() {
|
||||||
|
Preference nameAndPasswordPref = findPreference(OPR_LOGIN_DATA);
|
||||||
|
nameAndPasswordPref.setVisible(!authHelper.isLoginExists());
|
||||||
|
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupLogoutPref() {
|
||||||
|
Preference nameAndPasswordPref = findPreference(OPR_LOGOUT);
|
||||||
|
nameAndPasswordPref.setVisible(authHelper.isLoginExists());
|
||||||
|
nameAndPasswordPref.setSummary(settings.OPR_USERNAME.get());
|
||||||
|
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupUseDevUrlPref() {
|
||||||
|
SwitchPreferenceEx useDevUrlPref = findPreference(settings.OPR_USE_DEV_URL.getId());
|
||||||
|
useDevUrlPref.setVisible(OsmandPlugin.isDevelopment());
|
||||||
|
useDevUrlPref.setIcon(getPersistentPrefIcon(R.drawable.ic_plugin_developer));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
String prefId = preference.getKey();
|
||||||
|
if (OPR_LOGIN_DATA.equals(prefId)) {
|
||||||
|
FragmentManager fragmentManager = getFragmentManager();
|
||||||
|
if (fragmentManager != null) {
|
||||||
|
OprStartFragment.showInstance(fragmentManager);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (OPR_LOGOUT.equals(prefId)) {
|
||||||
|
oprLogout();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onPreferenceClick(preference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String prefId = preference.getKey();
|
||||||
|
if (settings.OPR_USE_DEV_URL.getId().equals(prefId) && newValue instanceof Boolean) {
|
||||||
|
settings.OPR_USE_DEV_URL.set((Boolean) newValue);
|
||||||
|
oprLogout();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onPreferenceChange(preference, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void oprLogout() {
|
||||||
|
authHelper.resetAuthorization();
|
||||||
|
app.showShortToastMessage(R.string.osm_edit_logout_success);
|
||||||
|
updateAllSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPreferenceChanged(String prefId) {
|
||||||
|
if (settings.OPR_USE_DEV_URL.getId().equals(prefId)) {
|
||||||
|
oprLogout();
|
||||||
|
}
|
||||||
|
updateAllSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void authorizationCompleted() {
|
||||||
|
if (getContext() != null) {
|
||||||
|
updateAllSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,18 +16,21 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.browser.customtabs.CustomTabsIntent;
|
import androidx.browser.customtabs.CustomTabsIntent;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||||
|
import net.osmand.plus.openplacereviews.OprAuthHelper.OprAuthorizationListener;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
public class OprStartFragment extends BaseOsmAndFragment {
|
public class OprStartFragment extends BaseOsmAndFragment implements OprAuthorizationListener {
|
||||||
private static final String TAG = OprStartFragment.class.getSimpleName();
|
private static final String TAG = OprStartFragment.class.getSimpleName();
|
||||||
private static final Log LOG = PlatformUtil.getLog(OprStartFragment.class);
|
private static final Log LOG = PlatformUtil.getLog(OprStartFragment.class);
|
||||||
private static final String openPlaceReviewsUrl = "OpenPlaceReviews.org";
|
private static final String openPlaceReviewsUrl = "OpenPlaceReviews.org";
|
||||||
|
@ -36,18 +39,22 @@ public class OprStartFragment extends BaseOsmAndFragment {
|
||||||
@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) {
|
||||||
nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
||||||
View v = UiUtilities.getInflater(requireMyActivity(), nightMode).inflate(R.layout.fragment_opr_login, container,
|
|
||||||
false);
|
View v = UiUtilities.getInflater(requireMyActivity(), nightMode).inflate(R.layout.fragment_opr_login, container, false);
|
||||||
View createAccount = v.findViewById(R.id.register_opr_create_account);
|
AndroidUtils.addStatusBarPadding21v(requireMyActivity(), v);
|
||||||
v.findViewById(R.id.back_button).setOnClickListener(new View.OnClickListener() {
|
|
||||||
|
Toolbar toolbar = (Toolbar) v.findViewById(R.id.toolbar);
|
||||||
|
int icBackResId = AndroidUtils.getNavigationIconResId(v.getContext());
|
||||||
|
toolbar.setNavigationIcon(getContentIcon(icBackResId));
|
||||||
|
toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up);
|
||||||
|
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View v) {
|
||||||
FragmentActivity activity = getActivity();
|
dismiss();
|
||||||
if (activity != null) {
|
|
||||||
activity.getSupportFragmentManager().popBackStack();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
View createAccount = v.findViewById(R.id.register_opr_create_account);
|
||||||
UiUtilities.setupDialogButton(nightMode, createAccount, UiUtilities.DialogButtonType.PRIMARY,
|
UiUtilities.setupDialogButton(nightMode, createAccount, UiUtilities.DialogButtonType.PRIMARY,
|
||||||
R.string.register_opr_create_new_account);
|
R.string.register_opr_create_new_account);
|
||||||
createAccount.setOnClickListener(new View.OnClickListener() {
|
createAccount.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@ -70,14 +77,14 @@ public class OprStartFragment extends BaseOsmAndFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleHaveAccount() {
|
private void handleHaveAccount() {
|
||||||
String url = OPRConstants.getLoginUrl(requireContext());
|
String url = OPRConstants.getLoginUrl(requireMyApplication());
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
|
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleCreateAccount() {
|
private void handleCreateAccount() {
|
||||||
String url = OPRConstants.getRegisterUrl(requireContext());
|
String url = OPRConstants.getRegisterUrl(requireMyApplication());
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
|
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
|
||||||
|
@ -114,6 +121,17 @@ public class OprStartFragment extends BaseOsmAndFragment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void authorizationCompleted() {
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void dismiss() {
|
||||||
|
FragmentActivity activity = getActivity();
|
||||||
|
if (activity != null) {
|
||||||
|
activity.getSupportFragmentManager().popBackStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void showInstance(@NonNull FragmentManager fm) {
|
public static void showInstance(@NonNull FragmentManager fm) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -52,8 +52,8 @@ public class EditPOIMenuController extends MenuController {
|
||||||
OsmandSettings settings = app.getSettings();
|
OsmandSettings settings = app.getSettings();
|
||||||
OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(app);
|
OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(app);
|
||||||
boolean isLogged = client.isValidToken()
|
boolean isLogged = client.isValidToken()
|
||||||
|| !Algorithms.isEmpty(settings.USER_NAME.get())
|
|| !Algorithms.isEmpty(settings.OSM_USER_NAME.get())
|
||||||
&& !Algorithms.isEmpty(settings.USER_PASSWORD.get());
|
&& !Algorithms.isEmpty(settings.OSM_USER_PASSWORD.get());
|
||||||
|
|
||||||
FragmentManager fragmentManager = activity.getSupportFragmentManager();
|
FragmentManager fragmentManager = activity.getSupportFragmentManager();
|
||||||
if (point instanceof OpenstreetmapPoint) {
|
if (point instanceof OpenstreetmapPoint) {
|
||||||
|
|
|
@ -84,7 +84,7 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil {
|
||||||
additionalData.put("tags", tagstring);
|
additionalData.put("tags", tagstring);
|
||||||
additionalData.put("visibility", visibility);
|
additionalData.put("visibility", visibility);
|
||||||
return NetworkUtils.uploadFile(url, f,
|
return NetworkUtils.uploadFile(url, f,
|
||||||
settings.USER_NAME.get() + ":" + settings.USER_PASSWORD.get(),
|
settings.OSM_USER_NAME.get() + ":" + settings.OSM_USER_PASSWORD.get(),
|
||||||
adapter.getClient(),
|
adapter.getClient(),
|
||||||
"file",
|
"file",
|
||||||
true, additionalData);
|
true, additionalData);
|
||||||
|
@ -138,7 +138,7 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil {
|
||||||
connection.setRequestMethod(requestMethod);
|
connection.setRequestMethod(requestMethod);
|
||||||
connection.setRequestProperty("User-Agent", Version.getFullVersion(ctx)); //$NON-NLS-1$
|
connection.setRequestProperty("User-Agent", Version.getFullVersion(ctx)); //$NON-NLS-1$
|
||||||
StringBuilder responseBody = new StringBuilder();
|
StringBuilder responseBody = new StringBuilder();
|
||||||
String token = settings.USER_NAME.get() + ":" + settings.USER_PASSWORD.get(); //$NON-NLS-1$
|
String token = settings.OSM_USER_NAME.get() + ":" + settings.OSM_USER_PASSWORD.get(); //$NON-NLS-1$
|
||||||
connection.addRequestProperty("Authorization", "Basic " + Base64.encode(token.getBytes("UTF-8"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
connection.addRequestProperty("Authorization", "Basic " + Base64.encode(token.getBytes("UTF-8"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||||
connection.setDoInput(true);
|
connection.setDoInput(true);
|
||||||
if (requestMethod.equals("PUT") || requestMethod.equals("POST") || requestMethod.equals("DELETE")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
if (requestMethod.equals("PUT") || requestMethod.equals("POST") || requestMethod.equals("DELETE")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||||
|
@ -322,9 +322,9 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil {
|
||||||
ser.attribute(null, "version", "0.6"); //$NON-NLS-1$ //$NON-NLS-2$
|
ser.attribute(null, "version", "0.6"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
ser.attribute(null, "generator", Version.getAppName(ctx)); //$NON-NLS-1$
|
ser.attribute(null, "generator", Version.getAppName(ctx)); //$NON-NLS-1$
|
||||||
if (n instanceof Node) {
|
if (n instanceof Node) {
|
||||||
writeNode((Node) n, info, ser, changeSetId, settings.USER_NAME.get());
|
writeNode((Node) n, info, ser, changeSetId, settings.OSM_USER_NAME.get());
|
||||||
} else if (n instanceof Way) {
|
} else if (n instanceof Way) {
|
||||||
writeWay((Way) n, info, ser, changeSetId, settings.USER_NAME.get());
|
writeWay((Way) n, info, ser, changeSetId, settings.OSM_USER_NAME.get());
|
||||||
}
|
}
|
||||||
ser.endTag(null, OsmPoint.stringAction.get(action));
|
ser.endTag(null, OsmPoint.stringAction.get(action));
|
||||||
ser.endTag(null, "osmChange"); //$NON-NLS-1$
|
ser.endTag(null, "osmChange"); //$NON-NLS-1$
|
||||||
|
|
|
@ -141,7 +141,7 @@ public class OsmBugsRemoteUtil implements OsmBugsUtil {
|
||||||
connection.setRequestMethod(requestMethod);
|
connection.setRequestMethod(requestMethod);
|
||||||
connection.setRequestProperty("User-Agent", Version.getFullVersion(app));
|
connection.setRequestProperty("User-Agent", Version.getFullVersion(app));
|
||||||
if (!anonymous) {
|
if (!anonymous) {
|
||||||
String token = settings.USER_NAME.get() + ":" + settings.USER_PASSWORD.get();
|
String token = settings.OSM_USER_NAME.get() + ":" + settings.OSM_USER_PASSWORD.get();
|
||||||
connection.addRequestProperty("Authorization", "Basic " + Base64.encode(token.getBytes(StandardCharsets.UTF_8)));
|
connection.addRequestProperty("Authorization", "Basic " + Base64.encode(token.getBytes(StandardCharsets.UTF_8)));
|
||||||
}
|
}
|
||||||
connection.setDoInput(true);
|
connection.setDoInput(true);
|
||||||
|
|
|
@ -112,7 +112,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
|
||||||
boolean validToken = isValidToken();
|
boolean validToken = isValidToken();
|
||||||
Preference nameAndPasswordPref = findPreference(OSM_LOGOUT);
|
Preference nameAndPasswordPref = findPreference(OSM_LOGOUT);
|
||||||
if (validToken || isLoginExists()) {
|
if (validToken || isLoginExists()) {
|
||||||
String userName = validToken ? settings.USER_DISPLAY_NAME.get() : settings.USER_NAME.get();
|
String userName = validToken ? settings.OSM_USER_DISPLAY_NAME.get() : settings.OSM_USER_NAME.get();
|
||||||
nameAndPasswordPref.setVisible(true);
|
nameAndPasswordPref.setVisible(true);
|
||||||
nameAndPasswordPref.setSummary(userName);
|
nameAndPasswordPref.setSummary(userName);
|
||||||
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
|
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
|
||||||
|
@ -126,7 +126,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isLoginExists() {
|
private boolean isLoginExists() {
|
||||||
return !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get());
|
return !Algorithms.isEmpty(settings.OSM_USER_NAME.get()) && !Algorithms.isEmpty(settings.OSM_USER_PASSWORD.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupOfflineEditingPref() {
|
private void setupOfflineEditingPref() {
|
||||||
|
@ -140,7 +140,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupUseDevUrlPref() {
|
private void setupUseDevUrlPref() {
|
||||||
SwitchPreferenceEx useDevUrlPref = findPreference(settings.USE_DEV_URL.getId());
|
SwitchPreferenceEx useDevUrlPref = findPreference(settings.OSM_USE_DEV_URL.getId());
|
||||||
if (OsmandPlugin.isDevelopment()) {
|
if (OsmandPlugin.isDevelopment()) {
|
||||||
Drawable icon = getPersistentPrefIcon(R.drawable.ic_action_laptop);
|
Drawable icon = getPersistentPrefIcon(R.drawable.ic_action_laptop);
|
||||||
useDevUrlPref.setDescription(getString(R.string.use_dev_url_descr));
|
useDevUrlPref.setDescription(getString(R.string.use_dev_url_descr));
|
||||||
|
@ -176,8 +176,8 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
String prefId = preference.getKey();
|
String prefId = preference.getKey();
|
||||||
if (settings.USE_DEV_URL.getId().equals(prefId) && newValue instanceof Boolean) {
|
if (settings.OSM_USE_DEV_URL.getId().equals(prefId) && newValue instanceof Boolean) {
|
||||||
settings.USE_DEV_URL.set((Boolean) newValue);
|
settings.OSM_USE_DEV_URL.set((Boolean) newValue);
|
||||||
osmLogout();
|
osmLogout();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPreferenceChanged(String prefId) {
|
public void onPreferenceChanged(String prefId) {
|
||||||
if (settings.USE_DEV_URL.getId().equals(prefId)) {
|
if (settings.OSM_USE_DEV_URL.getId().equals(prefId)) {
|
||||||
osmLogout();
|
osmLogout();
|
||||||
}
|
}
|
||||||
updateAllSettings();
|
updateAllSettings();
|
||||||
|
|
|
@ -457,9 +457,9 @@ public class OsmEditingPlugin extends OsmandPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean sendGPXFiles(final FragmentActivity activity, Fragment fragment, final GpxInfo... info) {
|
public boolean sendGPXFiles(final FragmentActivity activity, Fragment fragment, final GpxInfo... info) {
|
||||||
String name = settings.USER_NAME.get();
|
String name = settings.OSM_USER_NAME.get();
|
||||||
String pwd = settings.USER_PASSWORD.get();
|
String pwd = settings.OSM_USER_PASSWORD.get();
|
||||||
String authToken = settings.USER_ACCESS_TOKEN.get();
|
String authToken = settings.OSM_USER_ACCESS_TOKEN.get();
|
||||||
if ((Algorithms.isEmpty(name) || Algorithms.isEmpty(pwd)) && Algorithms.isEmpty(authToken)) {
|
if ((Algorithms.isEmpty(name) || Algorithms.isEmpty(pwd)) && Algorithms.isEmpty(authToken)) {
|
||||||
LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), fragment);
|
LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), fragment);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -30,8 +30,8 @@ public class ValidateOsmLoginDetailsTask extends AsyncTask<Void, Void, OsmBugRes
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(OsmBugResult osmBugResult) {
|
protected void onPostExecute(OsmBugResult osmBugResult) {
|
||||||
if (osmBugResult.warning != null) {
|
if (osmBugResult.warning != null) {
|
||||||
app.getSettings().USER_NAME.resetToDefault();
|
app.getSettings().OSM_USER_NAME.resetToDefault();
|
||||||
app.getSettings().USER_PASSWORD.resetToDefault();
|
app.getSettings().OSM_USER_PASSWORD.resetToDefault();
|
||||||
app.showToastMessage(osmBugResult.warning);
|
app.showToastMessage(osmBugResult.warning);
|
||||||
} else {
|
} else {
|
||||||
app.showToastMessage(R.string.osm_authorization_success);
|
app.showToastMessage(R.string.osm_authorization_success);
|
||||||
|
|
|
@ -69,10 +69,10 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
||||||
messageField = sendGpxView.findViewById(R.id.message_field);
|
messageField = sendGpxView.findViewById(R.id.message_field);
|
||||||
|
|
||||||
TextView accountName = sendGpxView.findViewById(R.id.user_name);
|
TextView accountName = sendGpxView.findViewById(R.id.user_name);
|
||||||
if (!Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get())) {
|
if (!Algorithms.isEmpty(settings.OSM_USER_DISPLAY_NAME.get())) {
|
||||||
accountName.setText(settings.USER_DISPLAY_NAME.get());
|
accountName.setText(settings.OSM_USER_DISPLAY_NAME.get());
|
||||||
} else {
|
} else {
|
||||||
accountName.setText(settings.USER_NAME.get());
|
accountName.setText(settings.OSM_USER_NAME.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
String fileName = gpxInfos[0].getFileName();
|
String fileName = gpxInfos[0].getFileName();
|
||||||
|
|
|
@ -61,7 +61,7 @@ public class SendOsmNoteBottomSheetFragment extends MenuBottomSheetDialogFragmen
|
||||||
private EditText noteText;
|
private EditText noteText;
|
||||||
|
|
||||||
private boolean isLoginOAuth() {
|
private boolean isLoginOAuth() {
|
||||||
return !Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get());
|
return !Algorithms.isEmpty(settings.OSM_USER_DISPLAY_NAME.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -150,8 +150,8 @@ public class SendOsmNoteBottomSheetFragment extends MenuBottomSheetDialogFragmen
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateAccountName() {
|
private void updateAccountName() {
|
||||||
String userNameOAuth = settings.USER_DISPLAY_NAME.get();
|
String userNameOAuth = settings.OSM_USER_DISPLAY_NAME.get();
|
||||||
String userNameOpenID = settings.USER_NAME.get();
|
String userNameOpenID = settings.OSM_USER_NAME.get();
|
||||||
String userName = isLoginOAuth() ? userNameOAuth : userNameOpenID;
|
String userName = isLoginOAuth() ? userNameOAuth : userNameOpenID;
|
||||||
accountName.setText(userName);
|
accountName.setText(userName);
|
||||||
updateSignIn(uploadAnonymously.isChecked());
|
updateSignIn(uploadAnonymously.isChecked());
|
||||||
|
@ -230,7 +230,7 @@ public class SendOsmNoteBottomSheetFragment extends MenuBottomSheetDialogFragmen
|
||||||
private boolean isLogged() {
|
private boolean isLogged() {
|
||||||
OsmOAuthAuthorizationAdapter adapter = app.getOsmOAuthHelper().getAuthorizationAdapter();
|
OsmOAuthAuthorizationAdapter adapter = app.getOsmOAuthHelper().getAuthorizationAdapter();
|
||||||
return adapter.isValidToken()
|
return adapter.isValidToken()
|
||||||
|| !Algorithms.isEmpty(settings.USER_NAME.get())
|
|| !Algorithms.isEmpty(settings.OSM_USER_NAME.get())
|
||||||
&& !Algorithms.isEmpty(settings.USER_PASSWORD.get());
|
&& !Algorithms.isEmpty(settings.OSM_USER_PASSWORD.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class SendPoiBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
||||||
|
|
||||||
|
|
||||||
private boolean isLoginOAuth(OsmandSettings settings) {
|
private boolean isLoginOAuth(OsmandSettings settings) {
|
||||||
return !Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get());
|
return !Algorithms.isEmpty(settings.OSM_USER_DISPLAY_NAME.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -68,8 +68,8 @@ public class SendPoiBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
||||||
messageEditText.setSelection(messageEditText.getText().length());
|
messageEditText.setSelection(messageEditText.getText().length());
|
||||||
final TextView accountName = sendOsmPoiView.findViewById(R.id.user_name);
|
final TextView accountName = sendOsmPoiView.findViewById(R.id.user_name);
|
||||||
OsmandSettings settings = app.getSettings();
|
OsmandSettings settings = app.getSettings();
|
||||||
String userNameOAuth = settings.USER_DISPLAY_NAME.get();
|
String userNameOAuth = settings.OSM_USER_DISPLAY_NAME.get();
|
||||||
String userNameOpenID = settings.USER_NAME.get();
|
String userNameOpenID = settings.OSM_USER_NAME.get();
|
||||||
String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID;
|
String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID;
|
||||||
accountName.setText(userName);
|
accountName.setText(userName);
|
||||||
final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
||||||
|
|
|
@ -42,7 +42,7 @@ public class OsmOAuthAuthorizationAdapter {
|
||||||
DefaultApi10a api10a;
|
DefaultApi10a api10a;
|
||||||
String key;
|
String key;
|
||||||
String secret;
|
String secret;
|
||||||
if (app.getSettings().USE_DEV_URL.get()) {
|
if (app.getSettings().OSM_USE_DEV_URL.get()) {
|
||||||
api10a = new OsmOAuthAuthorizationClient.OsmDevApi();
|
api10a = new OsmOAuthAuthorizationClient.OsmDevApi();
|
||||||
key = app.getString(R.string.osm_oauth_developer_key);
|
key = app.getString(R.string.osm_oauth_developer_key);
|
||||||
secret = app.getString(R.string.osm_oauth_developer_secret);
|
secret = app.getString(R.string.osm_oauth_developer_secret);
|
||||||
|
@ -68,8 +68,8 @@ public class OsmOAuthAuthorizationAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void restoreToken() {
|
public void restoreToken() {
|
||||||
String token = app.getSettings().USER_ACCESS_TOKEN.get();
|
String token = app.getSettings().OSM_USER_ACCESS_TOKEN.get();
|
||||||
String tokenSecret = app.getSettings().USER_ACCESS_TOKEN_SECRET.get();
|
String tokenSecret = app.getSettings().OSM_USER_ACCESS_TOKEN_SECRET.get();
|
||||||
if (!(token.isEmpty() || tokenSecret.isEmpty())) {
|
if (!(token.isEmpty() || tokenSecret.isEmpty())) {
|
||||||
client.setAccessToken(new OAuth1AccessToken(token, tokenSecret));
|
client.setAccessToken(new OAuth1AccessToken(token, tokenSecret));
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,8 +83,8 @@ public class OsmOAuthAuthorizationAdapter {
|
||||||
|
|
||||||
private void saveToken() {
|
private void saveToken() {
|
||||||
OAuth1AccessToken accessToken = client.getAccessToken();
|
OAuth1AccessToken accessToken = client.getAccessToken();
|
||||||
app.getSettings().USER_ACCESS_TOKEN.set(accessToken.getToken());
|
app.getSettings().OSM_USER_ACCESS_TOKEN.set(accessToken.getToken());
|
||||||
app.getSettings().USER_ACCESS_TOKEN_SECRET.set(accessToken.getTokenSecret());
|
app.getSettings().OSM_USER_ACCESS_TOKEN_SECRET.set(accessToken.getTokenSecret());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadWebView(ViewGroup root, boolean nightMode, String url) {
|
private void loadWebView(ViewGroup root, boolean nightMode, String url) {
|
||||||
|
@ -172,7 +172,7 @@ public class OsmOAuthAuthorizationAdapter {
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
log.error(e);
|
log.error(e);
|
||||||
}
|
}
|
||||||
app.getSettings().USER_DISPLAY_NAME.set(userName);
|
app.getSettings().OSM_USER_DISPLAY_NAME.set(userName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUserName() throws InterruptedException, ExecutionException, IOException, XmlPullParserException {
|
public String getUserName() throws InterruptedException, ExecutionException, IOException, XmlPullParserException {
|
||||||
|
|
|
@ -54,18 +54,18 @@ public class OsmOAuthHelper {
|
||||||
|
|
||||||
public void resetAuthorization() {
|
public void resetAuthorization() {
|
||||||
if (isValidToken()) {
|
if (isValidToken()) {
|
||||||
settings.USER_ACCESS_TOKEN.resetToDefault();
|
settings.OSM_USER_ACCESS_TOKEN.resetToDefault();
|
||||||
settings.USER_ACCESS_TOKEN_SECRET.resetToDefault();
|
settings.OSM_USER_ACCESS_TOKEN_SECRET.resetToDefault();
|
||||||
authorizationAdapter.resetToken();
|
authorizationAdapter.resetToken();
|
||||||
} else if (isLoginExists()) {
|
} else if (isLoginExists()) {
|
||||||
settings.USER_NAME.resetToDefault();
|
settings.OSM_USER_NAME.resetToDefault();
|
||||||
settings.USER_PASSWORD.resetToDefault();
|
settings.OSM_USER_PASSWORD.resetToDefault();
|
||||||
}
|
}
|
||||||
updateAdapter();
|
updateAdapter();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isLoginExists() {
|
private boolean isLoginExists() {
|
||||||
return !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get());
|
return !Algorithms.isEmpty(settings.OSM_USER_NAME.get()) && !Algorithms.isEmpty(settings.OSM_USER_PASSWORD.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyAndRemoveListeners() {
|
public void notifyAndRemoveListeners() {
|
||||||
|
|
|
@ -663,17 +663,19 @@ public class PoiFiltersHelper {
|
||||||
|
|
||||||
private SQLiteConnection openConnection(boolean readonly) {
|
private SQLiteConnection openConnection(boolean readonly) {
|
||||||
conn = context.getSQLiteAPI().getOrCreateDatabase(DATABASE_NAME, readonly);
|
conn = context.getSQLiteAPI().getOrCreateDatabase(DATABASE_NAME, readonly);
|
||||||
if (conn.getVersion() < DATABASE_VERSION) {
|
if (conn != null && conn.getVersion() < DATABASE_VERSION) {
|
||||||
if (readonly) {
|
if (readonly) {
|
||||||
conn.close();
|
conn.close();
|
||||||
conn = context.getSQLiteAPI().getOrCreateDatabase(DATABASE_NAME, false);
|
conn = context.getSQLiteAPI().getOrCreateDatabase(DATABASE_NAME, false);
|
||||||
}
|
}
|
||||||
int version = conn.getVersion();
|
if (conn != null) {
|
||||||
conn.setVersion(DATABASE_VERSION);
|
int version = conn.getVersion();
|
||||||
if (version == 0) {
|
conn.setVersion(DATABASE_VERSION);
|
||||||
onCreate(conn);
|
if (version == 0) {
|
||||||
} else {
|
onCreate(conn);
|
||||||
onUpgrade(conn, version, DATABASE_VERSION);
|
} else {
|
||||||
|
onUpgrade(conn, version, DATABASE_VERSION);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return conn;
|
return conn;
|
||||||
|
|
|
@ -48,6 +48,7 @@ import net.osmand.plus.helpers.enums.TracksSortByMode;
|
||||||
import net.osmand.plus.mapillary.MapillaryPlugin;
|
import net.osmand.plus.mapillary.MapillaryPlugin;
|
||||||
import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format;
|
import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format;
|
||||||
import net.osmand.plus.mapmarkers.MapMarkersMode;
|
import net.osmand.plus.mapmarkers.MapMarkersMode;
|
||||||
|
import net.osmand.plus.openplacereviews.OpenPlaceReviewsPlugin;
|
||||||
import net.osmand.plus.profiles.LocationIcon;
|
import net.osmand.plus.profiles.LocationIcon;
|
||||||
import net.osmand.plus.profiles.NavigationIcon;
|
import net.osmand.plus.profiles.NavigationIcon;
|
||||||
import net.osmand.plus.profiles.ProfileIconColors;
|
import net.osmand.plus.profiles.ProfileIconColors;
|
||||||
|
@ -653,7 +654,7 @@ public class OsmandSettings {
|
||||||
public static final String NUMBER_OF_FREE_DOWNLOADS_ID = "free_downloads_v3";
|
public static final String NUMBER_OF_FREE_DOWNLOADS_ID = "free_downloads_v3";
|
||||||
|
|
||||||
// this value string is synchronized with settings_pref.xml preference name
|
// this value string is synchronized with settings_pref.xml preference name
|
||||||
private final OsmandPreference<String> PLUGINS = new StringPreference(this, "enabled_plugins", MapillaryPlugin.ID).makeGlobal().makeShared();
|
private final OsmandPreference<String> PLUGINS = new StringPreference(this, "enabled_plugins", "").makeGlobal().makeShared();
|
||||||
|
|
||||||
public Set<String> getEnabledPlugins() {
|
public Set<String> getEnabledPlugins() {
|
||||||
String plugs = PLUGINS.get();
|
String plugs = PLUGINS.get();
|
||||||
|
@ -1121,8 +1122,8 @@ public class OsmandSettings {
|
||||||
}
|
}
|
||||||
|
|
||||||
// this value string is synchronized with settings_pref.xml preference name
|
// this value string is synchronized with settings_pref.xml preference name
|
||||||
public final OsmandPreference<String> USER_NAME = new StringPreference(this, "user_name", "").makeGlobal().makeShared();
|
public final OsmandPreference<String> OSM_USER_NAME = new StringPreference(this, "user_name", "").makeGlobal().makeShared();
|
||||||
public final OsmandPreference<String> USER_DISPLAY_NAME = new StringPreference(this, "user_display_name", "").makeGlobal().makeShared();
|
public final OsmandPreference<String> OSM_USER_DISPLAY_NAME = new StringPreference(this, "user_display_name", "").makeGlobal().makeShared();
|
||||||
|
|
||||||
public static final String BILLING_USER_DONATION_WORLD_PARAMETER = "";
|
public static final String BILLING_USER_DONATION_WORLD_PARAMETER = "";
|
||||||
public static final String BILLING_USER_DONATION_NONE_PARAMETER = "none";
|
public static final String BILLING_USER_DONATION_NONE_PARAMETER = "none";
|
||||||
|
@ -1156,13 +1157,13 @@ public class OsmandSettings {
|
||||||
new StringPreference(this, "user_osm_bug_name", "NoName/OsmAnd").makeGlobal().makeShared();
|
new StringPreference(this, "user_osm_bug_name", "NoName/OsmAnd").makeGlobal().makeShared();
|
||||||
|
|
||||||
// this value string is synchronized with settings_pref.xml preference name
|
// this value string is synchronized with settings_pref.xml preference name
|
||||||
public final OsmandPreference<String> USER_PASSWORD =
|
public final OsmandPreference<String> OSM_USER_PASSWORD =
|
||||||
new StringPreference(this, "user_password", "").makeGlobal().makeShared();
|
new StringPreference(this, "user_password", "").makeGlobal().makeShared();
|
||||||
|
|
||||||
public final OsmandPreference<String> USER_ACCESS_TOKEN =
|
public final OsmandPreference<String> OSM_USER_ACCESS_TOKEN =
|
||||||
new StringPreference(this, "user_access_token", "").makeGlobal();
|
new StringPreference(this, "user_access_token", "").makeGlobal();
|
||||||
|
|
||||||
public final OsmandPreference<String> USER_ACCESS_TOKEN_SECRET =
|
public final OsmandPreference<String> OSM_USER_ACCESS_TOKEN_SECRET =
|
||||||
new StringPreference(this, "user_access_token_secret", "").makeGlobal();
|
new StringPreference(this, "user_access_token_secret", "").makeGlobal();
|
||||||
|
|
||||||
public final OsmandPreference<String> OPR_ACCESS_TOKEN =
|
public final OsmandPreference<String> OPR_ACCESS_TOKEN =
|
||||||
|
@ -1174,13 +1175,15 @@ public class OsmandSettings {
|
||||||
public final OsmandPreference<String> OPR_BLOCKCHAIN_NAME =
|
public final OsmandPreference<String> OPR_BLOCKCHAIN_NAME =
|
||||||
new StringPreference(this, "opr_blockchain_name", "").makeGlobal();
|
new StringPreference(this, "opr_blockchain_name", "").makeGlobal();
|
||||||
|
|
||||||
|
public final OsmandPreference<Boolean> OPR_USE_DEV_URL = new BooleanPreference(this, "opr_use_dev_url", false).makeGlobal().makeShared();
|
||||||
|
|
||||||
// this value boolean is synchronized with settings_pref.xml preference offline POI/Bugs edition
|
// this value boolean is synchronized with settings_pref.xml preference offline POI/Bugs edition
|
||||||
public final OsmandPreference<Boolean> OFFLINE_EDITION = new BooleanPreference(this, "offline_osm_editing", true).makeGlobal().makeShared();
|
public final OsmandPreference<Boolean> OFFLINE_EDITION = new BooleanPreference(this, "offline_osm_editing", true).makeGlobal().makeShared();
|
||||||
public final OsmandPreference<Boolean> USE_DEV_URL = new BooleanPreference(this, "use_dev_url", false).makeGlobal().makeShared();
|
public final OsmandPreference<Boolean> OSM_USE_DEV_URL = new BooleanPreference(this, "use_dev_url", false).makeGlobal().makeShared();
|
||||||
|
|
||||||
public String getOsmUrl() {
|
public String getOsmUrl() {
|
||||||
String osmUrl;
|
String osmUrl;
|
||||||
if (USE_DEV_URL.get()) {
|
if (OSM_USE_DEV_URL.get()) {
|
||||||
osmUrl = "https://master.apis.dev.openstreetmap.org/";
|
osmUrl = "https://master.apis.dev.openstreetmap.org/";
|
||||||
} else {
|
} else {
|
||||||
osmUrl = "https://api.openstreetmap.org/";
|
osmUrl = "https://api.openstreetmap.org/";
|
||||||
|
@ -1188,6 +1191,10 @@ public class OsmandSettings {
|
||||||
return osmUrl;
|
return osmUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getOprUrl() {
|
||||||
|
return ctx.getString(OPR_USE_DEV_URL.get() ? R.string.dev_opr_base_url : R.string.opr_base_url);
|
||||||
|
}
|
||||||
|
|
||||||
// this value string is synchronized with settings_pref.xml preference name
|
// this value string is synchronized with settings_pref.xml preference name
|
||||||
public final CommonPreference<DayNightMode> DAYNIGHT_MODE =
|
public final CommonPreference<DayNightMode> DAYNIGHT_MODE =
|
||||||
new EnumStringPreference<DayNightMode>(this, "daynight_mode", DayNightMode.DAY, DayNightMode.values());
|
new EnumStringPreference<DayNightMode>(this, "daynight_mode", DayNightMode.DAY, DayNightMode.values());
|
||||||
|
|
|
@ -6,7 +6,6 @@ import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.ScrollView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
@ -49,8 +48,8 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
|
||||||
userNameEditText = view.findViewById(R.id.name_edit_text);
|
userNameEditText = view.findViewById(R.id.name_edit_text);
|
||||||
passwordEditText = view.findViewById(R.id.password_edit_text);
|
passwordEditText = view.findViewById(R.id.password_edit_text);
|
||||||
|
|
||||||
String name = app.getSettings().USER_NAME.get();
|
String name = app.getSettings().OSM_USER_NAME.get();
|
||||||
String password = app.getSettings().USER_PASSWORD.get();
|
String password = app.getSettings().OSM_USER_PASSWORD.get();
|
||||||
|
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
name = savedInstanceState.getString(USER_NAME_KEY, null);
|
name = savedInstanceState.getString(USER_NAME_KEY, null);
|
||||||
|
@ -96,8 +95,8 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
|
||||||
protected void onRightBottomButtonClick() {
|
protected void onRightBottomButtonClick() {
|
||||||
OsmandApplication app = requiredMyApplication();
|
OsmandApplication app = requiredMyApplication();
|
||||||
|
|
||||||
app.getSettings().USER_NAME.set(userNameEditText.getText().toString());
|
app.getSettings().OSM_USER_NAME.set(userNameEditText.getText().toString());
|
||||||
app.getSettings().USER_PASSWORD.set(passwordEditText.getText().toString());
|
app.getSettings().OSM_USER_PASSWORD.set(passwordEditText.getText().toString());
|
||||||
|
|
||||||
Fragment targetFragment = getTargetFragment();
|
Fragment targetFragment = getTargetFragment();
|
||||||
if (targetFragment instanceof ValidateOsmLoginListener) {
|
if (targetFragment instanceof ValidateOsmLoginListener) {
|
||||||
|
|
|
@ -61,6 +61,7 @@ import net.osmand.plus.activities.OsmandInAppPurchaseActivity;
|
||||||
import net.osmand.plus.audionotes.MultimediaNotesFragment;
|
import net.osmand.plus.audionotes.MultimediaNotesFragment;
|
||||||
import net.osmand.plus.development.DevelopmentSettingsFragment;
|
import net.osmand.plus.development.DevelopmentSettingsFragment;
|
||||||
import net.osmand.plus.monitoring.MonitoringSettingsFragment;
|
import net.osmand.plus.monitoring.MonitoringSettingsFragment;
|
||||||
|
import net.osmand.plus.openplacereviews.OprSettingsFragment;
|
||||||
import net.osmand.plus.osmedit.OsmEditingFragment;
|
import net.osmand.plus.osmedit.OsmEditingFragment;
|
||||||
import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment;
|
import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment;
|
||||||
import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment.AppModeChangedListener;
|
import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment.AppModeChangedListener;
|
||||||
|
@ -133,6 +134,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl
|
||||||
MONITORING_SETTINGS(MonitoringSettingsFragment.class.getName(), true, ApplyQueryType.SNACK_BAR, R.xml.monitoring_settings, R.layout.profile_preference_toolbar),
|
MONITORING_SETTINGS(MonitoringSettingsFragment.class.getName(), true, ApplyQueryType.SNACK_BAR, R.xml.monitoring_settings, R.layout.profile_preference_toolbar),
|
||||||
LIVE_MONITORING(LiveMonitoringFragment.class.getName(), false, ApplyQueryType.SNACK_BAR, R.xml.live_monitoring, R.layout.global_preferences_toolbar_with_switch),
|
LIVE_MONITORING(LiveMonitoringFragment.class.getName(), false, ApplyQueryType.SNACK_BAR, R.xml.live_monitoring, R.layout.global_preferences_toolbar_with_switch),
|
||||||
ACCESSIBILITY_SETTINGS(AccessibilitySettingsFragment.class.getName(), true, ApplyQueryType.SNACK_BAR, R.xml.accessibility_settings, R.layout.profile_preference_toolbar),
|
ACCESSIBILITY_SETTINGS(AccessibilitySettingsFragment.class.getName(), true, ApplyQueryType.SNACK_BAR, R.xml.accessibility_settings, R.layout.profile_preference_toolbar),
|
||||||
|
OPEN_PLACE_REVIEWS(OprSettingsFragment.class.getName(), false, null, R.xml.open_place_reviews, R.layout.global_preference_toolbar),
|
||||||
DEVELOPMENT_SETTINGS(DevelopmentSettingsFragment.class.getName(), false, null, R.xml.development_settings, R.layout.global_preference_toolbar);
|
DEVELOPMENT_SETTINGS(DevelopmentSettingsFragment.class.getName(), false, null, R.xml.development_settings, R.layout.global_preference_toolbar);
|
||||||
|
|
||||||
public final String fragmentName;
|
public final String fragmentName;
|
||||||
|
|
|
@ -890,8 +890,6 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
||||||
private void updateMenuState() {
|
private void updateMenuState() {
|
||||||
if (menuType == TrackMenuType.OPTIONS) {
|
if (menuType == TrackMenuType.OPTIONS) {
|
||||||
openMenuFullScreen();
|
openMenuFullScreen();
|
||||||
} else if (menuType == TrackMenuType.OVERVIEW) {
|
|
||||||
openMenuHeaderOnly();
|
|
||||||
} else {
|
} else {
|
||||||
openMenuHalfScreen();
|
openMenuHalfScreen();
|
||||||
}
|
}
|
||||||
|
@ -1130,7 +1128,9 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
||||||
if (mapActivity != null) {
|
if (mapActivity != null) {
|
||||||
OsmandApplication app = mapActivity.getMyApplication();
|
OsmandApplication app = mapActivity.getMyApplication();
|
||||||
SelectedGpxFile selectedGpxFile = app.getSelectedGpxHelper().selectGpxFile(result, true, false);
|
SelectedGpxFile selectedGpxFile = app.getSelectedGpxHelper().selectGpxFile(result, true, false);
|
||||||
showInstance(mapActivity, selectedGpxFile, null);
|
if (selectedGpxFile != null) {
|
||||||
|
showInstance(mapActivity, selectedGpxFile, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (progress != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) {
|
if (progress != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) {
|
||||||
progress.dismiss();
|
progress.dismiss();
|
||||||
|
@ -1142,7 +1142,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean showInstance(@NonNull MapActivity mapActivity, SelectedGpxFile selectedGpxFile, @Nullable LatLon latLon) {
|
public static boolean showInstance(@NonNull MapActivity mapActivity, @NonNull SelectedGpxFile selectedGpxFile, @Nullable LatLon latLon) {
|
||||||
try {
|
try {
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY);
|
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY);
|
||||||
|
|
|
@ -17,26 +17,28 @@ import net.osmand.data.QuadTree;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
import net.osmand.plus.FavouritesDbHelper;
|
import net.osmand.plus.FavouritesDbHelper;
|
||||||
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
|
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
|
||||||
import net.osmand.plus.mapmarkers.MapMarkersHelper;
|
|
||||||
import net.osmand.plus.mapmarkers.MapMarker;
|
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.base.PointImageDrawable;
|
import net.osmand.plus.base.PointImageDrawable;
|
||||||
|
import net.osmand.plus.mapmarkers.MapMarker;
|
||||||
|
import net.osmand.plus.mapmarkers.MapMarkersHelper;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.views.OsmandMapLayer;
|
import net.osmand.plus.views.OsmandMapLayer;
|
||||||
import net.osmand.plus.views.OsmandMapTileView;
|
import net.osmand.plus.views.OsmandMapTileView;
|
||||||
import net.osmand.plus.views.layers.ContextMenuLayer.ApplyMovedObjectCallback;
|
import net.osmand.plus.views.layers.ContextMenuLayer.ApplyMovedObjectCallback;
|
||||||
|
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
|
||||||
|
import net.osmand.plus.views.layers.ContextMenuLayer.IMoveObjectProvider;
|
||||||
import net.osmand.plus.views.layers.MapTextLayer.MapTextProvider;
|
import net.osmand.plus.views.layers.MapTextLayer.MapTextProvider;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider,
|
public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider,
|
||||||
ContextMenuLayer.IMoveObjectProvider, MapTextProvider<FavouritePoint> {
|
MapTextProvider<FavouritePoint> {
|
||||||
|
|
||||||
protected int startZoom = 6;
|
protected int startZoom = 6;
|
||||||
|
|
||||||
protected OsmandMapTileView view;
|
protected OsmandMapTileView view;
|
||||||
private FavouritesDbHelper favorites;
|
private FavouritesDbHelper favouritesDbHelper;
|
||||||
private MapMarkersHelper mapMarkersHelper;
|
private MapMarkersHelper mapMarkersHelper;
|
||||||
protected List<FavouritePoint> cache = new ArrayList<>();
|
protected List<FavouritePoint> cache = new ArrayList<>();
|
||||||
private MapTextLayer textLayer;
|
private MapTextLayer textLayer;
|
||||||
|
@ -54,7 +56,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
public void initLayer(OsmandMapTileView view) {
|
public void initLayer(OsmandMapTileView view) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
settings = view.getApplication().getSettings();
|
settings = view.getApplication().getSettings();
|
||||||
favorites = view.getApplication().getFavorites();
|
favouritesDbHelper = view.getApplication().getFavorites();
|
||||||
mapMarkersHelper = view.getApplication().getMapMarkersHelper();
|
mapMarkersHelper = view.getApplication().getMapMarkersHelper();
|
||||||
textLayer = view.getLayerByClass(MapTextLayer.class);
|
textLayer = view.getLayerByClass(MapTextLayer.class);
|
||||||
defaultColor = ContextCompat.getColor(view.getContext(), R.color.color_favorite);
|
defaultColor = ContextCompat.getColor(view.getContext(), R.color.color_favorite);
|
||||||
|
@ -92,7 +94,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
@Override
|
@Override
|
||||||
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||||
cache.clear();
|
cache.clear();
|
||||||
if (this.settings.SHOW_FAVORITES.get() && favorites.isFavoritesLoaded()) {
|
if (this.settings.SHOW_FAVORITES.get() && favouritesDbHelper.isFavoritesLoaded()) {
|
||||||
if (tileBox.getZoom() >= startZoom) {
|
if (tileBox.getZoom() >= startZoom) {
|
||||||
float textScale = this.settings.TEXT_SCALE.get();
|
float textScale = this.settings.TEXT_SCALE.get();
|
||||||
float iconSize = getIconSize(view.getApplication());
|
float iconSize = getIconSize(view.getApplication());
|
||||||
|
@ -102,7 +104,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
||||||
List<LatLon> fullObjectsLatLon = new ArrayList<>();
|
List<LatLon> fullObjectsLatLon = new ArrayList<>();
|
||||||
List<LatLon> smallObjectsLatLon = new ArrayList<>();
|
List<LatLon> smallObjectsLatLon = new ArrayList<>();
|
||||||
for (FavoriteGroup group : favorites.getFavoriteGroups()) {
|
for (FavoriteGroup group : favouritesDbHelper.getFavoriteGroups()) {
|
||||||
List<Pair<FavouritePoint, MapMarker>> fullObjects = new ArrayList<>();
|
List<Pair<FavouritePoint, MapMarker>> fullObjects = new ArrayList<>();
|
||||||
boolean synced = mapMarkersHelper.getMarkersGroup(group) != null;
|
boolean synced = mapMarkersHelper.getMarkersGroup(group) != null;
|
||||||
for (FavouritePoint favoritePoint : group.getPoints()) {
|
for (FavouritePoint favoritePoint : group.getPoints()) {
|
||||||
|
@ -127,7 +129,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
if (marker != null && marker.history) {
|
if (marker != null && marker.history) {
|
||||||
color = grayColor;
|
color = grayColor;
|
||||||
} else {
|
} else {
|
||||||
color = favorites.getColorWithCategory(favoritePoint,defaultColor);
|
color = favouritesDbHelper.getColorWithCategory(favoritePoint,defaultColor);
|
||||||
}
|
}
|
||||||
PointImageDrawable pointImageDrawable = PointImageDrawable.getFromFavorite(
|
PointImageDrawable pointImageDrawable = PointImageDrawable.getFromFavorite(
|
||||||
view.getContext(), color,true, favoritePoint);
|
view.getContext(), color,true, favoritePoint);
|
||||||
|
@ -162,11 +164,11 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
boolean history = false;
|
boolean history = false;
|
||||||
if (marker != null) {
|
if (marker != null) {
|
||||||
pointImageDrawable = PointImageDrawable.getOrCreateSyncedIcon(view.getContext(),
|
pointImageDrawable = PointImageDrawable.getOrCreateSyncedIcon(view.getContext(),
|
||||||
favorites.getColorWithCategory(favoritePoint,defaultColor), favoritePoint);
|
favouritesDbHelper.getColorWithCategory(favoritePoint,defaultColor), favoritePoint);
|
||||||
history = marker.history;
|
history = marker.history;
|
||||||
} else {
|
} else {
|
||||||
pointImageDrawable = PointImageDrawable.getFromFavorite(view.getContext(),
|
pointImageDrawable = PointImageDrawable.getFromFavorite(view.getContext(),
|
||||||
favorites.getColorWithCategory(favoritePoint, defaultColor),true, favoritePoint);
|
favouritesDbHelper.getColorWithCategory(favoritePoint, defaultColor),true, favoritePoint);
|
||||||
}
|
}
|
||||||
pointImageDrawable.drawPoint(canvas, x, y, textScale, history);
|
pointImageDrawable.drawPoint(canvas, x, y, textScale, history);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +182,8 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
int r = getScaledTouchRadius(view.getApplication(), getDefaultRadiusPoi(tb));
|
int r = getScaledTouchRadius(view.getApplication(), getDefaultRadiusPoi(tb));
|
||||||
int ex = (int) point.x;
|
int ex = (int) point.x;
|
||||||
int ey = (int) point.y;
|
int ey = (int) point.y;
|
||||||
for (FavouritePoint n : favorites.getFavouritePoints()) {
|
List<FavouritePoint> favouritePoints = new ArrayList<>(favouritesDbHelper.getFavouritePoints());
|
||||||
|
for (FavouritePoint n : favouritePoints) {
|
||||||
getFavFromPoint(tb, res, r, ex, ey, n);
|
getFavFromPoint(tb, res, r, ex, ey, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,8 +278,8 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
|
||||||
@Nullable ApplyMovedObjectCallback callback) {
|
@Nullable ApplyMovedObjectCallback callback) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
if (o instanceof FavouritePoint) {
|
if (o instanceof FavouritePoint) {
|
||||||
favorites.editFavourite((FavouritePoint) o, position.getLatitude(), position.getLongitude());
|
favouritesDbHelper.editFavourite((FavouritePoint) o, position.getLatitude(), position.getLongitude());
|
||||||
favorites.lookupAddress((FavouritePoint) o);
|
favouritesDbHelper.lookupAddress((FavouritePoint) o);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
|
|
|
@ -90,9 +90,12 @@ public class JSMediaCommandPlayerImpl extends MediaCommandPlayerImpl {
|
||||||
if (voiceDir.getName().contains("tts")) {
|
if (voiceDir.getName().contains("tts")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (File f : voiceDir.listFiles()) {
|
File[] files = voiceDir.listFiles();
|
||||||
if (f.getName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_JS)) {
|
if (files != null) {
|
||||||
return true;
|
for (File f : files) {
|
||||||
|
if (f.getName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_JS)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package net.osmand.plus.wikipedia;
|
package net.osmand.plus.wikipedia;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
@ -24,6 +26,8 @@ import net.osmand.plus.download.DownloadActivity;
|
||||||
import net.osmand.plus.download.DownloadActivityType;
|
import net.osmand.plus.download.DownloadActivityType;
|
||||||
import net.osmand.plus.download.DownloadIndexesThread;
|
import net.osmand.plus.download.DownloadIndexesThread;
|
||||||
import net.osmand.plus.download.DownloadResources;
|
import net.osmand.plus.download.DownloadResources;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
|
||||||
|
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener;
|
||||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||||
import net.osmand.plus.poi.PoiUIFilter;
|
import net.osmand.plus.poi.PoiUIFilter;
|
||||||
import net.osmand.plus.search.QuickSearchDialogFragment;
|
import net.osmand.plus.search.QuickSearchDialogFragment;
|
||||||
|
@ -32,8 +36,9 @@ import net.osmand.plus.search.listitems.QuickSearchBannerListItem;
|
||||||
import net.osmand.plus.search.listitems.QuickSearchFreeBannerListItem;
|
import net.osmand.plus.search.listitems.QuickSearchFreeBannerListItem;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.views.layers.DownloadedRegionsLayer;
|
|
||||||
import net.osmand.plus.views.OsmandMapTileView;
|
import net.osmand.plus.views.OsmandMapTileView;
|
||||||
|
import net.osmand.plus.views.layers.DownloadedRegionsLayer;
|
||||||
|
import net.osmand.plus.wikimedia.WikiImageHelper;
|
||||||
import net.osmand.search.core.ObjectType;
|
import net.osmand.search.core.ObjectType;
|
||||||
import net.osmand.search.core.SearchPhrase;
|
import net.osmand.search.core.SearchPhrase;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
@ -42,6 +47,7 @@ import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.WIKIPEDIA_ID;
|
import static net.osmand.aidlapi.OsmAndCustomizationConstants.WIKIPEDIA_ID;
|
||||||
|
@ -91,11 +97,24 @@ public class WikipediaPlugin extends OsmandPlugin {
|
||||||
this.mapActivity = activity;
|
this.mapActivity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mapActivityResumeOnTop(MapActivity activity) {
|
||||||
|
this.mapActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mapActivityPause(MapActivity activity) {
|
public void mapActivityPause(MapActivity activity) {
|
||||||
this.mapActivity = null;
|
this.mapActivity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean init(@NonNull OsmandApplication app, Activity activity) {
|
||||||
|
if (activity instanceof MapActivity) {
|
||||||
|
mapActivity = (MapActivity) activity;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerLayerContextMenuActions(OsmandMapTileView mapView,
|
protected void registerLayerContextMenuActions(OsmandMapTileView mapView,
|
||||||
ContextMenuAdapter adapter,
|
ContextMenuAdapter adapter,
|
||||||
|
@ -435,4 +454,25 @@ public class WikipediaPlugin extends OsmandPlugin {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<ImageCard> getContextMenuImageCards(@NonNull Map<String, String> params, @Nullable Map<String, String> additionalParams, @Nullable GetImageCardsListener listener) {
|
||||||
|
List<ImageCard> imageCards = new ArrayList<>();
|
||||||
|
if (mapActivity != null) {
|
||||||
|
if (additionalParams != null) {
|
||||||
|
String wikidataId = additionalParams.get(Amenity.WIKIDATA);
|
||||||
|
if (wikidataId != null) {
|
||||||
|
additionalParams.remove(Amenity.WIKIDATA);
|
||||||
|
WikiImageHelper.addWikidataImageCards(mapActivity, wikidataId, imageCards);
|
||||||
|
}
|
||||||
|
String wikimediaContent = additionalParams.get(Amenity.WIKIMEDIA_COMMONS);
|
||||||
|
if (wikimediaContent != null) {
|
||||||
|
additionalParams.remove(Amenity.WIKIMEDIA_COMMONS);
|
||||||
|
WikiImageHelper.addWikimediaImageCards(mapActivity, wikimediaContent, imageCards);
|
||||||
|
}
|
||||||
|
params.putAll(additionalParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return imageCards;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue