mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-09 22:04:43 +00:00
[android][sdk] Fix MapManager
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
committed by
Konstantin Pastbin
parent
431e305a48
commit
d4863643f7
@@ -27,6 +27,7 @@ import androidx.annotation.StringRes;
|
||||
import androidx.annotation.StyleRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.intent.Factory;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
@@ -155,7 +156,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
showMap();
|
||||
return;
|
||||
|
||||
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
||||
case CountryItem.STATUS_FAILED:
|
||||
MapManagerHelper.showError(DownloadResourcesLegacyActivity.this, item, null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -373,7 +376,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
mProgress.setProgressCompat((int) (item.totalSize/100), true);
|
||||
|
||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||
MapManager.startDownload(mCurrentCountry);
|
||||
MapManagerHelper.startDownload(mCurrentCountry);
|
||||
setAction(PROCEED_TO_MAP);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -12,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.screens.ErrorScreen;
|
||||
import app.organicmaps.car.screens.base.BaseScreen;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
@@ -169,7 +170,7 @@ class DownloaderScreen extends BaseScreen
|
||||
mIsDownloadFailed = true;
|
||||
final ErrorScreen.Builder builder = new ErrorScreen.Builder(getCarContext())
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setErrorMessage(MapManager.getErrorCodeStrRes(data.errorCode))
|
||||
.setErrorMessage(MapManagerHelper.getErrorCodeStrRes(data.errorCode))
|
||||
.setPositiveButton(R.string.downloader_retry, null);
|
||||
if (!mIsCancelActionDisabled)
|
||||
builder.setNegativeButton(R.string.cancel, this::finish);
|
||||
|
||||
@@ -29,7 +29,7 @@ class BottomPanel
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManager.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManagerHelper.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -38,7 +38,10 @@ class BottomPanel
|
||||
public void onClick(View v)
|
||||
{
|
||||
final String country = mFragment.getCurrentRoot();
|
||||
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
|
||||
MapManagerHelper.warnOn3gUpdate(mFragment.requireActivity(), country, () -> {
|
||||
DownloaderService.startForegroundService();
|
||||
MapManagerHelper.startUpdate(country);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -55,7 +58,7 @@ class BottomPanel
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManagerHelper.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -198,7 +198,8 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
final int id = v.getId();
|
||||
if (id == R.id.btn__download_map)
|
||||
{
|
||||
MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, () -> mDownloadingCountry = mCurrentCountry);
|
||||
MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id,
|
||||
() -> mDownloadingCountry = mCurrentCountry);
|
||||
}
|
||||
else if (id == R.id.btn__select_map)
|
||||
{
|
||||
|
||||
@@ -93,7 +93,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
|
||||
private void onDownloadActionSelected(final CountryItem item, DownloaderAdapter adapter)
|
||||
{
|
||||
MapManager.warn3gAndDownload(adapter.mActivity, item.id, null);
|
||||
MapManagerHelper.warn3gAndDownload(adapter.mActivity, item.id, null);
|
||||
}
|
||||
|
||||
private void onUpdateActionSelected(final CountryItem item, DownloaderAdapter adapter)
|
||||
@@ -101,7 +101,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
item.update();
|
||||
if (item.status != CountryItem.STATUS_UPDATABLE)
|
||||
return;
|
||||
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
|
||||
MapManagerHelper.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManagerHelper.startUpdate(item.id));
|
||||
}
|
||||
|
||||
private void onExploreActionSelected(CountryItem item, DownloaderAdapter adapter)
|
||||
@@ -206,7 +206,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
{
|
||||
if (item.isLeafNode && item.newStatus == CountryItem.STATUS_FAILED)
|
||||
{
|
||||
MapManager.showError(mActivity, item, null);
|
||||
MapManagerHelper.showError(mActivity, item, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -382,9 +382,12 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
else
|
||||
processLongClick();
|
||||
}
|
||||
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
case CountryItem.STATUS_FAILED ->
|
||||
{
|
||||
MapManagerHelper.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
}
|
||||
case CountryItem.STATUS_UPDATABLE ->
|
||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
||||
MapManagerHelper.warnOn3gUpdate(mActivity, mItem.id, () -> MapManagerHelper.startUpdate(mItem.id));
|
||||
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
package app.organicmaps.downloader;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.text.TextUtils;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.util.Consumer;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.ExpandRetryConfirmationListener;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
public class MapManagerHelper
|
||||
{
|
||||
private static WeakReference<AlertDialog> sCurrentErrorDialog;
|
||||
|
||||
@StringRes
|
||||
public static int getErrorCodeStrRes(final int errorCode)
|
||||
{
|
||||
return switch (errorCode)
|
||||
{
|
||||
case CountryItem.ERROR_NO_INTERNET -> R.string.common_check_internet_connection_dialog;
|
||||
case CountryItem.ERROR_OOM -> R.string.downloader_no_space_title;
|
||||
default -> throw new IllegalArgumentException("Given error can not be displayed: " + errorCode);
|
||||
};
|
||||
}
|
||||
|
||||
public static void showError(final Activity activity, final MapManager.StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (!MapManager.nativeIsAutoretryFailed())
|
||||
return;
|
||||
|
||||
showErrorDialog(activity, errorData, dialogClickListener);
|
||||
}
|
||||
|
||||
public static void showErrorDialog(final Activity activity, final MapManager.StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (sCurrentErrorDialog != null)
|
||||
{
|
||||
AlertDialog dlg = sCurrentErrorDialog.get();
|
||||
if (dlg != null && dlg.isShowing())
|
||||
return;
|
||||
}
|
||||
|
||||
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setMessage(getErrorCodeStrRes(errorData.errorCode))
|
||||
.setNegativeButton(R.string.cancel,
|
||||
(dialog, which) -> {
|
||||
sCurrentErrorDialog = null;
|
||||
if (dialogClickListener != null)
|
||||
dialogClickListener.accept(false);
|
||||
})
|
||||
.setPositiveButton(R.string.downloader_retry,
|
||||
(dialog, which) -> {
|
||||
ExpandRetryConfirmationListener listener =
|
||||
new ExpandRetryConfirmationListener(dialogClickListener);
|
||||
warn3gAndRetry(activity, errorData.countryId, listener);
|
||||
})
|
||||
.create();
|
||||
dlg.setCanceledOnTouchOutside(false);
|
||||
dlg.show();
|
||||
sCurrentErrorDialog = new WeakReference<>(dlg);
|
||||
}
|
||||
|
||||
private static void notifyNoSpaceInternal(Activity activity)
|
||||
{
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.downloader_no_space_title)
|
||||
.setMessage(R.string.downloader_no_space_message)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to update the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpaceToUpdate(Activity activity, String root)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToUpdate(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, String root)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToDownloadCountry(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download {@code size} bytes, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, long size)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToDownloadAmount(size))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean warnOn3gInternal(Activity activity, @NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
if (MapManager.nativeIsDownloadOn3gEnabled() || !ConnectionState.INSTANCE.isMobileConnected())
|
||||
{
|
||||
onAcceptListener.run();
|
||||
return false;
|
||||
}
|
||||
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.download_over_mobile_header)
|
||||
.setMessage(R.string.download_over_mobile_message)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.ok,
|
||||
(dlg, which) -> {
|
||||
MapManager.nativeEnableDownloadOn3g();
|
||||
onAcceptListener.run();
|
||||
})
|
||||
.show();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3gUpdate(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpaceToUpdate(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpace(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, long size, @NonNull Runnable onAcceptListener)
|
||||
{
|
||||
return !notifyNoSpace(activity, size) && warnOn3gInternal(activity, onAcceptListener);
|
||||
}
|
||||
|
||||
public static boolean warn3gAndDownload(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
startDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean warn3gAndRetry(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
retryDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues failed items under given {@code root} node in downloader.
|
||||
*/
|
||||
public static void retryDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.retryDownload(countryId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node with its children in downloader.
|
||||
*/
|
||||
public static void startUpdate(@NonNull String root)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.startUpdate(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues the given list of nodes and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(String... countries)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
for (var countryId : countries)
|
||||
{
|
||||
MapManager.startDownload(countryId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.startDownload(countryId);
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
continue;
|
||||
|
||||
if (item.newStatus == CountryItem.STATUS_FAILED)
|
||||
MapManager.showError(mActivity, item, null);
|
||||
MapManagerHelper.showError(mActivity, item, null);
|
||||
|
||||
if (mCurrentCountry.id.equals(item.countryId))
|
||||
{
|
||||
@@ -163,7 +163,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
if (TextUtils.equals(mCurrentCountry.id, country)
|
||||
&& MapManager.nativeHasSpaceToDownloadCountry(country))
|
||||
{
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,18 +199,18 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
setAutodownloadLocked(true);
|
||||
});
|
||||
mButton.setOnClickListener(
|
||||
v -> MapManager.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
v -> MapManagerHelper.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
if (mCurrentCountry == null)
|
||||
return;
|
||||
|
||||
boolean retry = (mCurrentCountry.status == CountryItem.STATUS_FAILED);
|
||||
if (retry)
|
||||
{
|
||||
MapManager.retryDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.retryDownload(mCurrentCountry.id);
|
||||
}
|
||||
else
|
||||
{
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
mActivity.requestPostNotificationsPermission();
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -14,6 +14,7 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
@@ -108,7 +109,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
}
|
||||
}
|
||||
|
||||
MapManager.warnOn3g(requireActivity(), size, () -> {
|
||||
MapManagerHelper.warnOn3g(requireActivity(), size, () -> {
|
||||
final FragmentManager manager = requireActivity().getSupportFragmentManager();
|
||||
RoutingMapsDownloadFragment downloader =
|
||||
RoutingMapsDownloadFragment.create(manager.getFragmentFactory(), getAppContextOrThrow(), mMapsArray);
|
||||
|
||||
@@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
@@ -40,7 +41,7 @@ public class RoutingMapsDownloadFragment extends BaseRoutingErrorDialogFragment
|
||||
mMapsArray[i] = item.id;
|
||||
}
|
||||
|
||||
MapManager.startDownload(mMapsArray);
|
||||
MapManagerHelper.startDownload(mMapsArray);
|
||||
}
|
||||
|
||||
private View setupFrame(View frame)
|
||||
|
||||
@@ -1,443 +0,0 @@
|
||||
package app.organicmaps.sdk.downloader;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.text.TextUtils;
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.util.Consumer;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.DownloaderService;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
@UiThread
|
||||
public final class MapManager
|
||||
{
|
||||
// Used by JNI.
|
||||
@Keep
|
||||
public static class StorageCallbackData
|
||||
{
|
||||
public final String countryId;
|
||||
public final int newStatus;
|
||||
public final int errorCode;
|
||||
public final boolean isLeafNode;
|
||||
|
||||
public StorageCallbackData(String countryId, int newStatus, int errorCode, boolean isLeafNode)
|
||||
{
|
||||
this.countryId = countryId;
|
||||
this.newStatus = newStatus;
|
||||
this.errorCode = errorCode;
|
||||
this.isLeafNode = isLeafNode;
|
||||
}
|
||||
}
|
||||
|
||||
public interface StorageCallback
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
void onStatusChanged(List<StorageCallbackData> data);
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
void onProgress(String countryId, long localSize, long remoteSize);
|
||||
}
|
||||
|
||||
public interface CurrentCountryChangedListener
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onCurrentCountryChanged(String countryId);
|
||||
}
|
||||
|
||||
private static WeakReference<AlertDialog> sCurrentErrorDialog;
|
||||
|
||||
private MapManager() {}
|
||||
|
||||
@StringRes
|
||||
public static int getErrorCodeStrRes(final int errorCode)
|
||||
{
|
||||
return switch (errorCode)
|
||||
{
|
||||
case CountryItem.ERROR_NO_INTERNET -> R.string.common_check_internet_connection_dialog;
|
||||
case CountryItem.ERROR_OOM -> R.string.downloader_no_space_title;
|
||||
default -> throw new IllegalArgumentException("Given error can not be displayed: " + errorCode);
|
||||
};
|
||||
}
|
||||
|
||||
public static void showError(final Activity activity, final StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (!nativeIsAutoretryFailed())
|
||||
return;
|
||||
|
||||
showErrorDialog(activity, errorData, dialogClickListener);
|
||||
}
|
||||
|
||||
public static void showErrorDialog(final Activity activity, final StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (sCurrentErrorDialog != null)
|
||||
{
|
||||
AlertDialog dlg = sCurrentErrorDialog.get();
|
||||
if (dlg != null && dlg.isShowing())
|
||||
return;
|
||||
}
|
||||
|
||||
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setMessage(getErrorCodeStrRes(errorData.errorCode))
|
||||
.setNegativeButton(R.string.cancel,
|
||||
(dialog, which) -> {
|
||||
sCurrentErrorDialog = null;
|
||||
if (dialogClickListener != null)
|
||||
dialogClickListener.accept(false);
|
||||
})
|
||||
.setPositiveButton(R.string.downloader_retry,
|
||||
(dialog, which) -> {
|
||||
ExpandRetryConfirmationListener listener =
|
||||
new ExpandRetryConfirmationListener(dialogClickListener);
|
||||
warn3gAndRetry(activity, errorData.countryId, listener);
|
||||
})
|
||||
.create();
|
||||
dlg.setCanceledOnTouchOutside(false);
|
||||
dlg.show();
|
||||
sCurrentErrorDialog = new WeakReference<>(dlg);
|
||||
}
|
||||
|
||||
private static void notifyNoSpaceInternal(Activity activity)
|
||||
{
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.downloader_no_space_title)
|
||||
.setMessage(R.string.downloader_no_space_message)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to update the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpaceToUpdate(Activity activity, String root)
|
||||
{
|
||||
if (nativeHasSpaceToUpdate(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, String root)
|
||||
{
|
||||
if (nativeHasSpaceToDownloadCountry(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download {@code size} bytes, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, long size)
|
||||
{
|
||||
if (nativeHasSpaceToDownloadAmount(size))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean warnOn3gInternal(Activity activity, @NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
if (nativeIsDownloadOn3gEnabled() || !ConnectionState.INSTANCE.isMobileConnected())
|
||||
{
|
||||
onAcceptListener.run();
|
||||
return false;
|
||||
}
|
||||
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.download_over_mobile_header)
|
||||
.setMessage(R.string.download_over_mobile_message)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.ok,
|
||||
(dlg, which) -> {
|
||||
nativeEnableDownloadOn3g();
|
||||
onAcceptListener.run();
|
||||
})
|
||||
.show();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3gUpdate(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpaceToUpdate(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpace(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, long size, @NonNull Runnable onAcceptListener)
|
||||
{
|
||||
return !notifyNoSpace(activity, size) && warnOn3gInternal(activity, onAcceptListener);
|
||||
}
|
||||
|
||||
public static boolean warn3gAndDownload(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
startDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean warn3gAndRetry(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
retryDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues failed items under given {@code root} node in downloader.
|
||||
*/
|
||||
public static void retryDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
nativeRetry(countryId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node with its children in downloader.
|
||||
*/
|
||||
public static void startUpdate(@NonNull String root)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
nativeUpdate(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues the given list of nodes and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(String... countries)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
for (var countryId : countries)
|
||||
{
|
||||
nativeDownload(countryId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
nativeDownload(countryId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves ID of root node.
|
||||
*/
|
||||
public static native String nativeGetRoot();
|
||||
|
||||
/**
|
||||
* Moves a file from one place to another.
|
||||
*/
|
||||
public static native boolean nativeMoveFile(String oldFile, String newFile);
|
||||
|
||||
/**
|
||||
* Returns {@code true} if there is enough storage space to download specified amount of data. Or {@code false}
|
||||
* otherwise.
|
||||
*/
|
||||
public static native boolean nativeHasSpaceToDownloadAmount(long bytes);
|
||||
|
||||
/**
|
||||
* Returns {@code true} if there is enough storage space to download maps with specified {@code root}. Or {@code
|
||||
* false} otherwise.
|
||||
*/
|
||||
public static native boolean nativeHasSpaceToDownloadCountry(String root);
|
||||
|
||||
/**
|
||||
* Returns {@code true} if there is enough storage space to update maps with specified {@code root}. Or {@code false}
|
||||
* otherwise.
|
||||
*/
|
||||
public static native boolean nativeHasSpaceToUpdate(String root);
|
||||
|
||||
/**
|
||||
* Return count of fully downloaded maps (excluding fake MWMs).
|
||||
*/
|
||||
public static native int nativeGetDownloadedCount();
|
||||
|
||||
/**
|
||||
* Returns info about updatable data under given {@code root} or null on error.
|
||||
*/
|
||||
public static native @Nullable UpdateInfo nativeGetUpdateInfo(@Nullable String root);
|
||||
|
||||
/**
|
||||
* Retrieves list of country items with its status info.
|
||||
* if {@code root} is {@code null}, list of downloaded countries is returned.
|
||||
*/
|
||||
public static native void nativeListItems(@Nullable String root, double lat, double lon, boolean hasLocation,
|
||||
boolean myMapsMode, List<CountryItem> result);
|
||||
|
||||
/**
|
||||
* Sets following attributes of the given {@code item}:
|
||||
* <pre>
|
||||
* <ul>
|
||||
* <li>name;</li>
|
||||
* <li>directParentId;</li>
|
||||
* <li>topmostParentId;</li>
|
||||
* <li>directParentName;</li>
|
||||
* <li>topmostParentName;</li>
|
||||
* <li>description;</li>
|
||||
* <li>size;</li>
|
||||
* <li>enqueuedSize;</li>
|
||||
* <li>totalSize;</li>
|
||||
* <li>childCount;</li>
|
||||
* <li>totalChildCount;</li>
|
||||
* <li>status;</li>
|
||||
* <li>errorCode;</li>
|
||||
* <li>present;</li>
|
||||
* <li>progress</li>
|
||||
* </ul>
|
||||
* </pre>
|
||||
*/
|
||||
public static native void nativeGetAttributes(CountryItem item);
|
||||
|
||||
/**
|
||||
* Returns status for given {@code root} node.
|
||||
*/
|
||||
public static native int nativeGetStatus(String root);
|
||||
|
||||
/**
|
||||
* Returns downloading error for given {@code root} node.
|
||||
*/
|
||||
public static native int nativeGetError(String root);
|
||||
|
||||
/**
|
||||
* Returns localized name for given {@code root} node.
|
||||
*/
|
||||
public static native String nativeGetName(String root);
|
||||
|
||||
/**
|
||||
* Returns country ID corresponding to given coordinates or {@code null} on error.
|
||||
*/
|
||||
public static native @Nullable String nativeFindCountry(double lat, double lon);
|
||||
|
||||
/**
|
||||
* Determines whether something is downloading now.
|
||||
*/
|
||||
public static native boolean nativeIsDownloading();
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node and its children in downloader.
|
||||
*/
|
||||
private static native void nativeDownload(String root);
|
||||
|
||||
/**
|
||||
* Enqueues failed items under given {@code root} node in downloader.
|
||||
*/
|
||||
private static native void nativeRetry(String root);
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node with its children in downloader.
|
||||
*/
|
||||
private static native void nativeUpdate(String root);
|
||||
|
||||
/**
|
||||
* Removes given currently downloading {@code root} node and its children from downloader.
|
||||
*/
|
||||
public static native void nativeCancel(String root);
|
||||
|
||||
/**
|
||||
* Deletes given installed {@code root} node with its children.
|
||||
*/
|
||||
public static native void nativeDelete(String root);
|
||||
|
||||
/**
|
||||
* Registers {@code callback} of storage status changed. Returns slot ID which should be used to unsubscribe in {@link
|
||||
* #nativeUnsubscribe(int)}.
|
||||
*/
|
||||
public static native int nativeSubscribe(StorageCallback callback);
|
||||
|
||||
/**
|
||||
* Unregisters storage status changed callback.
|
||||
* @param slot Slot ID returned from {@link #nativeSubscribe(StorageCallback)} while registering.
|
||||
*/
|
||||
public static native void nativeUnsubscribe(int slot);
|
||||
|
||||
/**
|
||||
* Sets callback about current country change. Single subscriber only.
|
||||
*/
|
||||
public static native void nativeSubscribeOnCountryChanged(CurrentCountryChangedListener listener);
|
||||
|
||||
/**
|
||||
* Removes callback about current country change.
|
||||
*/
|
||||
public static native void nativeUnsubscribeOnCountryChanged();
|
||||
|
||||
/**
|
||||
* Determines if there are unsaved editor changes present for given {@code root}.
|
||||
*/
|
||||
public static native boolean nativeHasUnsavedEditorChanges(String root);
|
||||
|
||||
/**
|
||||
* Fills given {@code result} list with intermediate nodes from the root node (including) to the given {@code root}
|
||||
* (excluding). For instance, for {@code root == "Florida"} the resulting list is filled with values: {@code { "United
|
||||
* States of America", "Countries" }}.
|
||||
*/
|
||||
public static native void nativeGetPathTo(String root, List<String> result);
|
||||
|
||||
/**
|
||||
* Calculates joint progress of downloading countries specified by {@code countries} array.
|
||||
* @return 0 to 100 percent.
|
||||
*/
|
||||
public static native int nativeGetOverallProgress(String[] countries);
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the core will NOT do attempts to download failed maps anymore.
|
||||
*/
|
||||
public static native boolean nativeIsAutoretryFailed();
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the core is allowed to download maps while on 3g network. {@code false} otherwise.
|
||||
*/
|
||||
public static native boolean nativeIsDownloadOn3gEnabled();
|
||||
|
||||
/**
|
||||
* Sets flag which allows to download maps on 3G.
|
||||
*/
|
||||
public static native void nativeEnableDownloadOn3g();
|
||||
|
||||
/**
|
||||
* Returns country ID which the current PP object points to, or {@code null}.
|
||||
*/
|
||||
public static native @Nullable String nativeGetSelectedCountry();
|
||||
}
|
||||
@@ -37,6 +37,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.BookmarksSharingHelper;
|
||||
import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.editor.OhState;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.Bookmark;
|
||||
@@ -974,7 +975,7 @@ public class PlacePageView extends Fragment
|
||||
mStorageCallbackSlot = MapManager.nativeSubscribe(mStorageCallback);
|
||||
|
||||
mDownloaderIcon
|
||||
.setOnIconClickListener((v) -> MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, null))
|
||||
.setOnIconClickListener((v) -> MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id, null))
|
||||
.setOnCancelClickListener((v) -> MapManager.nativeCancel(mCurrentCountry.id));
|
||||
mDownloaderIcon.show(true);
|
||||
UiUtils.show(mDownloaderInfo);
|
||||
|
||||
Reference in New Issue
Block a user