diff --git a/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java b/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java index 4ce820fe0..4a952124c 100644 --- a/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java +++ b/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java @@ -11,14 +11,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.fragment.app.FragmentManager; import app.organicmaps.R; import app.organicmaps.base.BaseMwmToolbarFragment; import app.organicmaps.sdk.editor.OsmOAuth; +import app.organicmaps.sdk.util.NetworkPolicy; import app.organicmaps.sdk.util.concurrency.ThreadPool; import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.util.UiUtils; import app.organicmaps.util.Utils; import app.organicmaps.util.WindowInsetUtils; +import app.organicmaps.widget.StackedButtonDialogFragment; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.textview.MaterialTextView; @@ -26,6 +29,24 @@ import java.text.NumberFormat; public class ProfileFragment extends BaseMwmToolbarFragment { + @NonNull + private static final NetworkPolicy.DialogPresenter mDialogPresenter = new NetworkPolicy.DialogPresenter() { + @Override + public void showDialogIfNeeded(@NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicy.NetworkPolicyListener listener, @NonNull NetworkPolicy policy, + boolean isToday) + { + StackedButtonDialogFragment.showDialogIfNeeded(fragmentManager, listener, policy, isToday); + } + + @Override + public void showDialog(@NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicy.NetworkPolicyListener listener) + { + StackedButtonDialogFragment.showDialog(fragmentManager, listener); + } + }; + private View mUserInfoBlock; private MaterialTextView mEditsSent; private MaterialTextView mProfileName; @@ -84,7 +105,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment UiUtils.show(mProfileInfoLoading); UiUtils.hide(mUserInfoBlock); } - final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager()); + final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager()); final String profileUsername = OsmOAuth.getUsername(); final Bitmap profilePicture = OsmOAuth.getProfilePicture(); diff --git a/android/app/src/main/java/app/organicmaps/sdk/editor/OsmOAuth.java b/android/app/src/main/java/app/organicmaps/sdk/editor/OsmOAuth.java index 88b9d8da8..da79f6b3e 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/editor/OsmOAuth.java +++ b/android/app/src/main/java/app/organicmaps/sdk/editor/OsmOAuth.java @@ -130,10 +130,11 @@ public final class OsmOAuth private static native int nativeGetOsmChangesetsCount(String oauthToken); @WorkerThread - public static int getOsmChangesetsCount(@NonNull FragmentManager fm) + public static int getOsmChangesetsCount(@NonNull NetworkPolicy.DialogPresenter dialogPresenter, + @NonNull FragmentManager fm) { final int[] editsCount = {-1}; - NetworkPolicy.checkNetworkPolicy(fm, policy -> { + NetworkPolicy.checkNetworkPolicy(dialogPresenter, fm, policy -> { if (!policy.canUseNetwork()) return; diff --git a/android/app/src/main/java/app/organicmaps/sdk/util/NetworkPolicy.java b/android/app/src/main/java/app/organicmaps/sdk/util/NetworkPolicy.java index fc0f4ac0c..7fc0a043d 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/util/NetworkPolicy.java +++ b/android/app/src/main/java/app/organicmaps/sdk/util/NetworkPolicy.java @@ -3,7 +3,6 @@ package app.organicmaps.sdk.util; import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; -import app.organicmaps.widget.StackedButtonDialogFragment; import java.util.concurrent.TimeUnit; @Keep @@ -15,14 +14,14 @@ public final class NetworkPolicy ALWAYS() { @Override - public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, - boolean isDialogAllowed) + public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicyListener listener, boolean isDialogAllowed) { boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming(); boolean acceptedInRoaming = Config.getMobileDataRoaming(); if (nowInRoaming && !acceptedInRoaming) - showDialog(fragmentManager, listener); + dialogPresenter.showDialog(fragmentManager, listener); else listener.onResult(new NetworkPolicy(true)); } @@ -30,11 +29,11 @@ public final class NetworkPolicy NEVER() { @Override - public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, - boolean isDialogAllowed) + public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicyListener listener, boolean isDialogAllowed) { if (isDialogAllowed) - showDialog(fragmentManager, listener); + dialogPresenter.showDialog(fragmentManager, listener); else listener.onResult(new NetworkPolicy(false)); } @@ -42,43 +41,42 @@ public final class NetworkPolicy NOT_TODAY() { @Override - public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, - boolean isDialogAllowed) + public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicyListener listener, boolean isDialogAllowed) { if (isDialogAllowed) - showDialog(fragmentManager, listener); + dialogPresenter.showDialog(fragmentManager, listener); else - showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false)); + dialogPresenter.showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false), isToday()); } }, TODAY() { @Override - public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, - boolean isDialogAllowed) + public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicyListener listener, boolean isDialogAllowed) { boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming(); boolean acceptedInRoaming = Config.getMobileDataRoaming(); if (nowInRoaming && !acceptedInRoaming) - showDialog(fragmentManager, listener); + dialogPresenter.showDialog(fragmentManager, listener); else - showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(true)); + dialogPresenter.showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(true), isToday()); } }; - public void check(@NonNull FragmentManager fragmentManager, @NonNull final NetworkPolicyListener listener, - boolean isDialogAllowed) + public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager, + @NonNull final NetworkPolicyListener listener, boolean isDialogAllowed) { - showDialog(fragmentManager, listener); + dialogPresenter.showDialog(fragmentManager, listener); } } public static final int NONE = -1; - private static final String TAG_NETWORK_POLICY = "network_policy"; - - public static void checkNetworkPolicy(@NonNull FragmentManager fragmentManager, + public static void checkNetworkPolicy(@NonNull DialogPresenter dialogPresenter, + @NonNull FragmentManager fragmentManager, @NonNull final NetworkPolicyListener listener, boolean isDialogAllowed) { if (ConnectionState.INSTANCE.isWifiConnected()) @@ -94,13 +92,14 @@ public final class NetworkPolicy } Type type = Config.getUseMobileDataSettings(); - type.check(fragmentManager, listener, isDialogAllowed); + type.check(dialogPresenter, fragmentManager, listener, isDialogAllowed); } - public static void checkNetworkPolicy(@NonNull FragmentManager fragmentManager, + public static void checkNetworkPolicy(@NonNull DialogPresenter dialogPresenter, + @NonNull FragmentManager fragmentManager, @NonNull final NetworkPolicyListener listener) { - checkNetworkPolicy(fragmentManager, listener, false); + checkNetworkPolicy(dialogPresenter, fragmentManager, listener, false); } // Called from JNI. @@ -129,37 +128,9 @@ public final class NetworkPolicy return TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() - timestamp) < 1; } - private static void showDialogIfNeeded(@NonNull FragmentManager fragmentManager, - @NonNull NetworkPolicyListener listener, @NonNull NetworkPolicy policy) - { - if (isToday()) - { - listener.onResult(policy); - return; - } - showDialog(fragmentManager, listener); - } - - private static void showDialog(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener) - { - StackedButtonDialogFragment dialog = - (StackedButtonDialogFragment) fragmentManager.findFragmentByTag(TAG_NETWORK_POLICY); - if (dialog != null) - dialog.dismiss(); - - dialog = new StackedButtonDialogFragment(); - dialog.setListener(listener); - dialog.show(fragmentManager, TAG_NETWORK_POLICY); - } - - public static NetworkPolicy newInstance(boolean canUse) - { - return new NetworkPolicy(canUse); - } - private final boolean mCanUseNetwork; - private NetworkPolicy(boolean canUse) + public NetworkPolicy(boolean canUse) { mCanUseNetwork = canUse; } @@ -176,4 +147,13 @@ public final class NetworkPolicy { void onResult(@NonNull NetworkPolicy policy); } + + public interface DialogPresenter + { + void showDialogIfNeeded(@NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicy.NetworkPolicyListener listener, @NonNull NetworkPolicy policy, + boolean isToday); + + void showDialog(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicy.NetworkPolicyListener listener); + } } diff --git a/android/app/src/main/java/app/organicmaps/widget/StackedButtonDialogFragment.java b/android/app/src/main/java/app/organicmaps/widget/StackedButtonDialogFragment.java index 544d154c4..0c8f46870 100644 --- a/android/app/src/main/java/app/organicmaps/widget/StackedButtonDialogFragment.java +++ b/android/app/src/main/java/app/organicmaps/widget/StackedButtonDialogFragment.java @@ -13,6 +13,8 @@ import app.organicmaps.sdk.util.NetworkPolicy; public class StackedButtonDialogFragment extends DialogFragment { + private static final String TAG_NETWORK_POLICY = "network_policy"; + @Nullable private NetworkPolicy.NetworkPolicyListener mListener; @@ -43,7 +45,7 @@ public class StackedButtonDialogFragment extends DialogFragment { Config.setUseMobileDataSettings(type); if (mListener != null) - mListener.onResult(NetworkPolicy.newInstance(canUse)); + mListener.onResult(new NetworkPolicy(canUse)); } @Override @@ -58,4 +60,29 @@ public class StackedButtonDialogFragment extends DialogFragment { mListener = listener; } + + public static void showDialogIfNeeded(@NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicy.NetworkPolicyListener listener, + @NonNull NetworkPolicy policy, boolean isToday) + { + if (isToday) + { + listener.onResult(policy); + return; + } + showDialog(fragmentManager, listener); + } + + public static void showDialog(@NonNull FragmentManager fragmentManager, + @NonNull NetworkPolicy.NetworkPolicyListener listener) + { + StackedButtonDialogFragment dialog = + (StackedButtonDialogFragment) fragmentManager.findFragmentByTag(TAG_NETWORK_POLICY); + if (dialog != null) + dialog.dismiss(); + + dialog = new StackedButtonDialogFragment(); + dialog.setListener(listener); + dialog.show(fragmentManager, TAG_NETWORK_POLICY); + } }