[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.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();

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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);
}
}