diff --git a/OsmAnd/res/layout/subscribe_email_header.xml b/OsmAnd/res/layout/subscribe_email_header.xml
new file mode 100644
index 0000000000..9452caf4ac
--- /dev/null
+++ b/OsmAnd/res/layout/subscribe_email_header.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index c9cbb7f252..1b4a3e70e0 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -9,6 +9,8 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
+ Error
+ Subscribe to our email list about app discounts and get 3 more map downloads!
Set of maps allows you to see sea depth contour lines.
Thank you for purchasing sea depth contours!
Depth contours
diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
index 432820c3d9..5e708e71f5 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
@@ -920,6 +920,7 @@ public class OsmandSettings {
public final OsmandPreference LIVE_UPDATES_PURCHASED = new BooleanPreference("billing_live_updates_purchased", false).makeGlobal();
public final OsmandPreference FULL_VERSION_PURCHASED = new BooleanPreference("billing_full_version_purchased", false).makeGlobal();
public final OsmandPreference DEPTH_CONTOURS_PURCHASED = new BooleanPreference("billing_sea_depth_purchased", false).makeGlobal();
+ public final OsmandPreference EMAIL_SUBSCRIBED = new BooleanPreference("email_subscribed", false).makeGlobal();
public final OsmandPreference DISCOUNT_ID = new IntPreference("discount_id", 0).makeGlobal();
public final OsmandPreference DISCOUNT_SHOW_NUMBER_OF_STARTS = new IntPreference("number_of_starts_on_discount_show", 0).makeGlobal();
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
index 6852cb3c32..7c0ee7e85e 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
@@ -413,6 +413,10 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo
downloadHasFinished();
}
+ public void updateBanner() {
+ visibleBanner.updateBannerInProgress();
+ }
+
private int getCurrentTab() {
return viewPager.getCurrentItem();
}
@@ -427,7 +431,7 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo
return Math.max(downloadsLeft, 0) > 0;
}
- private static boolean shouldShowFreeVersionBanner(OsmandApplication application) {
+ public static boolean shouldShowFreeVersionBanner(OsmandApplication application) {
return (Version.isFreeVersion(application) && !application.getSettings().LIVE_UPDATES_PURCHASED.get()
&& !application.getSettings().FULL_VERSION_PURCHASED.get())
|| application.getSettings().SHOULD_SHOW_FREE_VERSION_BANNER.get();
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java
index 854422c5c1..c4e88a3749 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java
@@ -1,10 +1,15 @@
package net.osmand.plus.download.ui;
+import android.app.ProgressDialog;
+import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
import android.os.Bundle;
+import android.provider.Settings;
import android.support.v4.app.DialogFragment;
import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.LayoutInflater;
@@ -14,11 +19,14 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.TextView;
+import net.osmand.AndroidNetworkUtils;
+import net.osmand.AndroidUtils;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
@@ -31,13 +39,20 @@ import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
import net.osmand.plus.download.DownloadResourceGroup;
import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
import net.osmand.plus.download.DownloadResources;
+import net.osmand.plus.download.DownloadValidationManager;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.inapp.InAppHelper;
import net.osmand.plus.inapp.InAppHelper.InAppListener;
import net.osmand.util.Algorithms;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.text.MessageFormat;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class DownloadResourceGroupFragment extends DialogFragment implements DownloadEvents,
InAppListener, OnChildClickListener {
@@ -55,6 +70,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
private Toolbar toolbar;
private View searchView;
private View restorePurchasesView;
+ private View subscribeEmailView;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -105,8 +121,8 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
banner = null;
view.findViewById(R.id.freeVersionBanner).setVisibility(View.GONE);
}
-
listView = (ExpandableListView) view.findViewById(android.R.id.list);
+ addSubscribeEmailRow();
addSearchRow();
addRestorePurchasesRow();
listView.setOnChildClickListener(this);
@@ -116,6 +132,25 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
return view;
}
+ private void addSubscribeEmailRow() {
+ if (DownloadActivity.shouldShowFreeVersionBanner(activity.getMyApplication())
+ && !getMyApplication().getSettings().EMAIL_SUBSCRIBED.get()) {
+ subscribeEmailView = activity.getLayoutInflater().inflate(R.layout.subscribe_email_header, null, false);
+ subscribeEmailView.findViewById(R.id.subscribe_btn).setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ subscribe();
+ }
+ });
+ listView.addHeaderView(subscribeEmailView);
+ IndexItem worldBaseMapItem = activity.getDownloadThread().getIndexes().getWorldBaseMapItem();
+ if (worldBaseMapItem == null || !worldBaseMapItem.isDownloaded()
+ || DownloadActivity.isDownlodingPermitted(activity.getMyApplication().getSettings())) {
+ subscribeEmailView.findViewById(R.id.container).setVisibility(View.GONE);
+ }
+ }
+ }
+
private void addRestorePurchasesRow() {
if (!openAsDialog() && !InAppHelper.isInAppIntentoryRead()) {
restorePurchasesView = activity.getLayoutInflater().inflate(R.layout.restore_purchases_list_footer, null);
@@ -177,6 +212,116 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
}
}
+ private void updateSubscribeEmailView() {
+ if (subscribeEmailView != null && subscribeEmailView.findViewById(R.id.container).getVisibility() == View.GONE
+ && !DownloadActivity.isDownlodingPermitted(getMyApplication().getSettings())
+ && !getMyApplication().getSettings().EMAIL_SUBSCRIBED.get()) {
+ IndexItem worldBaseMapItem = activity.getDownloadThread().getIndexes().getWorldBaseMapItem();
+ if (worldBaseMapItem != null && worldBaseMapItem.isDownloaded()) {
+ subscribeEmailView.findViewById(R.id.container).setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
+ private void hideSubscribeEmailView() {
+ if (subscribeEmailView != null && subscribeEmailView.findViewById(R.id.container).getVisibility() == View.VISIBLE) {
+ subscribeEmailView.findViewById(R.id.container).setVisibility(View.GONE);
+ }
+ }
+
+ private void subscribe() {
+ AlertDialog.Builder b = new AlertDialog.Builder(activity);
+ b.setTitle(R.string.shared_string_email_address);
+ final EditText editText = new EditText(activity);
+ int leftPadding = AndroidUtils.dpToPx(activity, 24f);
+ int topPadding = AndroidUtils.dpToPx(activity, 4f);
+ b.setView(editText, leftPadding, topPadding, leftPadding, topPadding);
+ b.setPositiveButton(R.string.shared_string_ok, null);
+ b.setNegativeButton(R.string.shared_string_cancel, null);
+ final AlertDialog alertDialog = b.create();
+ alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialog) {
+ alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String email = editText.getText().toString();
+ if (Algorithms.isEmpty(email) || !AndroidUtils.isValidEmail(email)) {
+ getMyApplication().showToastMessage(getString(R.string.osm_live_enter_email));
+ return;
+ }
+ doSubscribe(email);
+ alertDialog.dismiss();
+ }
+ });
+ }
+ });
+ alertDialog.show();
+ }
+
+ private void doSubscribe(final String email) {
+ new AsyncTask() {
+
+ ProgressDialog dlg;
+
+ @Override
+ protected void onPreExecute() {
+ dlg = new ProgressDialog(getActivity());
+ dlg.setTitle("");
+ dlg.setMessage(getString(R.string.wait_current_task_finished));
+ dlg.setCancelable(false);
+ dlg.show();
+ }
+
+ @Override
+ protected String doInBackground(Void... params) {
+ try {
+ Map parameters = new HashMap<>();
+ parameters.put("aid", Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID));
+ parameters.put("email", email);
+
+ return AndroidNetworkUtils.sendRequest(getMyApplication(),
+ "http://download.osmand.net/subscription/register_email.php",
+ parameters, "Subscribing email...", true, true);
+
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(String response) {
+ if (dlg != null) {
+ dlg.dismiss();
+ dlg = null;
+ }
+ OsmandApplication app = getMyApplication();
+ if (response == null) {
+ app.showShortToastMessage(activity.getString(R.string.shared_string_unexpected_error));
+ } else {
+ try {
+ JSONObject obj = new JSONObject(response);
+ String responseEmail = obj.getString("email");
+ if (!email.equalsIgnoreCase(responseEmail)) {
+ app.showShortToastMessage(activity.getString(R.string.shared_string_unexpected_error));
+ } else {
+ app.getSettings().NUMBER_OF_FREE_DOWNLOADS.set(DownloadValidationManager.MAXIMUM_AVAILABLE_FREE_DOWNLOADS - 3);
+ app.getSettings().EMAIL_SUBSCRIBED.set(true);
+ hideSubscribeEmailView();
+ activity.updateBanner();
+ }
+ } catch (JSONException e) {
+ String message = "JSON parsing error: "
+ + (e.getMessage() == null ? "unknown" : e.getMessage());
+ app.showShortToastMessage(MessageFormat.format(
+ activity.getString(R.string.error_message_pattern), message));
+ }
+ }
+ }
+ }.execute((Void) null);
+ }
+
@Override
public void onError(String error) {
}
@@ -233,6 +378,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
if (!openAsDialog()) {
updateSearchView();
}
+ updateSubscribeEmailView();
DownloadResources indexes = activity.getDownloadThread().getIndexes();
group = indexes.getGroupById(groupId);
if (group != null) {
@@ -258,7 +404,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
@Override
public void newDownloadIndexes() {
- if(banner != null) {
+ if (banner != null) {
banner.updateBannerInProgress();
}
reloadData();
@@ -266,15 +412,20 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
@Override
public void downloadHasFinished() {
- if(banner != null) {
+ if (banner != null) {
banner.updateBannerInProgress();
}
+ if (subscribeEmailView != null
+ && !DownloadActivity.isDownlodingPermitted(activity.getMyApplication().getSettings())
+ && !getMyApplication().getSettings().EMAIL_SUBSCRIBED.get()) {
+ subscribeEmailView.findViewById(R.id.container).setVisibility(View.VISIBLE);
+ }
listAdapter.notifyDataSetChanged();
}
@Override
public void downloadInProgress() {
- if(banner != null) {
+ if (banner != null) {
banner.updateBannerInProgress();
}
listAdapter.notifyDataSetChanged();