[android][sdk] Fix StackedButtonDialogFragment usage in sdk

Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
Andrei Shkrob
2025-08-08 17:47:02 +02:00
committed by Konstantin Pastbin
parent c6cd23fb24
commit 886d569895
4 changed files with 86 additions and 57 deletions

View File

@@ -11,14 +11,17 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentManager;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment; import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.sdk.editor.OsmOAuth; 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.ThreadPool;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.util.UiUtils; import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils; import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.StackedButtonDialogFragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView; import com.google.android.material.textview.MaterialTextView;
@@ -26,6 +29,24 @@ import java.text.NumberFormat;
public class ProfileFragment extends BaseMwmToolbarFragment 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 View mUserInfoBlock;
private MaterialTextView mEditsSent; private MaterialTextView mEditsSent;
private MaterialTextView mProfileName; private MaterialTextView mProfileName;
@@ -84,7 +105,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment
UiUtils.show(mProfileInfoLoading); UiUtils.show(mProfileInfoLoading);
UiUtils.hide(mUserInfoBlock); UiUtils.hide(mUserInfoBlock);
} }
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager()); final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager());
final String profileUsername = OsmOAuth.getUsername(); final String profileUsername = OsmOAuth.getUsername();
final Bitmap profilePicture = OsmOAuth.getProfilePicture(); final Bitmap profilePicture = OsmOAuth.getProfilePicture();

View File

@@ -130,10 +130,11 @@ public final class OsmOAuth
private static native int nativeGetOsmChangesetsCount(String oauthToken); private static native int nativeGetOsmChangesetsCount(String oauthToken);
@WorkerThread @WorkerThread
public static int getOsmChangesetsCount(@NonNull FragmentManager fm) public static int getOsmChangesetsCount(@NonNull NetworkPolicy.DialogPresenter dialogPresenter,
@NonNull FragmentManager fm)
{ {
final int[] editsCount = {-1}; final int[] editsCount = {-1};
NetworkPolicy.checkNetworkPolicy(fm, policy -> { NetworkPolicy.checkNetworkPolicy(dialogPresenter, fm, policy -> {
if (!policy.canUseNetwork()) if (!policy.canUseNetwork())
return; return;

View File

@@ -3,7 +3,6 @@ package app.organicmaps.sdk.util;
import androidx.annotation.Keep; import androidx.annotation.Keep;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import app.organicmaps.widget.StackedButtonDialogFragment;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Keep @Keep
@@ -15,14 +14,14 @@ public final class NetworkPolicy
ALWAYS() { ALWAYS() {
@Override @Override
public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager,
boolean isDialogAllowed) @NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming(); boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming();
boolean acceptedInRoaming = Config.getMobileDataRoaming(); boolean acceptedInRoaming = Config.getMobileDataRoaming();
if (nowInRoaming && !acceptedInRoaming) if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener); dialogPresenter.showDialog(fragmentManager, listener);
else else
listener.onResult(new NetworkPolicy(true)); listener.onResult(new NetworkPolicy(true));
} }
@@ -30,11 +29,11 @@ public final class NetworkPolicy
NEVER() { NEVER() {
@Override @Override
public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager,
boolean isDialogAllowed) @NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
if (isDialogAllowed) if (isDialogAllowed)
showDialog(fragmentManager, listener); dialogPresenter.showDialog(fragmentManager, listener);
else else
listener.onResult(new NetworkPolicy(false)); listener.onResult(new NetworkPolicy(false));
} }
@@ -42,43 +41,42 @@ public final class NetworkPolicy
NOT_TODAY() { NOT_TODAY() {
@Override @Override
public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager,
boolean isDialogAllowed) @NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
if (isDialogAllowed) if (isDialogAllowed)
showDialog(fragmentManager, listener); dialogPresenter.showDialog(fragmentManager, listener);
else else
showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false)); dialogPresenter.showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false), isToday());
} }
}, },
TODAY() { TODAY() {
@Override @Override
public void check(@NonNull FragmentManager fragmentManager, @NonNull NetworkPolicyListener listener, public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager,
boolean isDialogAllowed) @NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming(); boolean nowInRoaming = ConnectionState.INSTANCE.isInRoaming();
boolean acceptedInRoaming = Config.getMobileDataRoaming(); boolean acceptedInRoaming = Config.getMobileDataRoaming();
if (nowInRoaming && !acceptedInRoaming) if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener); dialogPresenter.showDialog(fragmentManager, listener);
else 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, public void check(@NonNull DialogPresenter dialogPresenter, @NonNull FragmentManager fragmentManager,
boolean isDialogAllowed) @NonNull final NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
showDialog(fragmentManager, listener); dialogPresenter.showDialog(fragmentManager, listener);
} }
} }
public static final int NONE = -1; public static final int NONE = -1;
private static final String TAG_NETWORK_POLICY = "network_policy"; public static void checkNetworkPolicy(@NonNull DialogPresenter dialogPresenter,
@NonNull FragmentManager fragmentManager,
public static void checkNetworkPolicy(@NonNull FragmentManager fragmentManager,
@NonNull final NetworkPolicyListener listener, boolean isDialogAllowed) @NonNull final NetworkPolicyListener listener, boolean isDialogAllowed)
{ {
if (ConnectionState.INSTANCE.isWifiConnected()) if (ConnectionState.INSTANCE.isWifiConnected())
@@ -94,13 +92,14 @@ public final class NetworkPolicy
} }
Type type = Config.getUseMobileDataSettings(); 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) @NonNull final NetworkPolicyListener listener)
{ {
checkNetworkPolicy(fragmentManager, listener, false); checkNetworkPolicy(dialogPresenter, fragmentManager, listener, false);
} }
// Called from JNI. // Called from JNI.
@@ -129,37 +128,9 @@ public final class NetworkPolicy
return TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() - timestamp) < 1; 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 final boolean mCanUseNetwork;
private NetworkPolicy(boolean canUse) public NetworkPolicy(boolean canUse)
{ {
mCanUseNetwork = canUse; mCanUseNetwork = canUse;
} }
@@ -176,4 +147,13 @@ public final class NetworkPolicy
{ {
void onResult(@NonNull NetworkPolicy policy); 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);
}
} }

View File

@@ -13,6 +13,8 @@ import app.organicmaps.sdk.util.NetworkPolicy;
public class StackedButtonDialogFragment extends DialogFragment public class StackedButtonDialogFragment extends DialogFragment
{ {
private static final String TAG_NETWORK_POLICY = "network_policy";
@Nullable @Nullable
private NetworkPolicy.NetworkPolicyListener mListener; private NetworkPolicy.NetworkPolicyListener mListener;
@@ -43,7 +45,7 @@ public class StackedButtonDialogFragment extends DialogFragment
{ {
Config.setUseMobileDataSettings(type); Config.setUseMobileDataSettings(type);
if (mListener != null) if (mListener != null)
mListener.onResult(NetworkPolicy.newInstance(canUse)); mListener.onResult(new NetworkPolicy(canUse));
} }
@Override @Override
@@ -58,4 +60,29 @@ public class StackedButtonDialogFragment extends DialogFragment
{ {
mListener = listener; 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);
}
} }