[android] Dismiss all alert dialogs when pausing MwmActivity

This patch fixes `Activity app.organicmaps.MwmActivity has leaked window`
when pausing MwmActivity during showing the following error dialogs:

- "Your location hasn't been determined yet"
- "No internet connection"
- "No object can be located here"
- "Update Maps"
- "Unable to calculate route"
- "When following the route, please keep in mind:"
- "Navigation is only available from your current location."
- Dialogs in DownloadResourcesLegacyActivity.

Fixes #5838
See also #4570 d4bf7a73 "Fix a crash on rotation"

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2023-08-27 11:46:19 +03:00
parent 8ee828f96f
commit 67079e48fb
2 changed files with 53 additions and 14 deletions

View file

@ -1,6 +1,7 @@
package app.organicmaps;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
@ -64,6 +65,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
@Nullable
private MapTask mMapTaskToForward;
@Nullable
private Dialog mAlertDialog;
@NonNull
private ActivityResultLauncher<Intent> mApiRequest;
@ -244,6 +248,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
{
super.onPause();
LocationHelper.INSTANCE.removeListener(mLocationListener);
if (mAlertDialog != null && mAlertDialog.isShowing())
mAlertDialog.dismiss();
mAlertDialog = null;
}
private void setDownloadMessage(int bytesToDownload)
@ -432,6 +439,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private void showErrorDialog(int result)
{
if (mAlertDialog != null && mAlertDialog.isShowing())
return;
@StringRes final int titleId;
@StringRes final int messageId;
@ -458,7 +468,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
throw new AssertionError("Unexpected result code = " + result);
}
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(titleId)
.setMessage(messageId)
.setCancelable(true)
@ -467,6 +477,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
setAction(TRY_AGAIN);
onTryAgainClicked();
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}

View file

@ -199,6 +199,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Nullable
private Dialog mLocationErrorDialog;
@Nullable
private Dialog mAlertDialog;
@SuppressWarnings("NotNullFieldNotInitialized")
@NonNull
private ActivityResultLauncher<String[]> mLocationPermissionRequest;
@ -330,10 +333,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
dismissLocationErrorDialog();
mLocationErrorDialog = new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
.setMessage(R.string.unknown_current_position)
.setCancelable(true)
.setPositiveButton(R.string.ok, null)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
.show();
}
@ -457,10 +462,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public void onNoConnectionError()
{
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.common_check_internet_connection_dialog_title)
.setMessage(R.string.common_check_internet_connection_dialog)
.setPositiveButton(R.string.ok, null)
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
@ -515,9 +522,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
else
{
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.message_invalid_feature_position)
.setPositiveButton(R.string.ok, null)
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
break;
@ -911,11 +920,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_update_maps)
.setMessage(R.string.isolines_activation_error_dialog)
.setPositiveButton(R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
.setNegativeButton(R.string.cancel, null)
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
@ -1031,6 +1042,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
mOnmapDownloader.onPause();
mNavigationController.onActivityPaused(this);
pauseLocationInBackground();
dismissLocationErrorDialog();
dismissAlertDialog();
super.onPause();
}
@ -1596,11 +1609,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public void onDrivingOptionsBuildError()
{
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.unable_to_calc_alert_title)
.setMessage(R.string.unable_to_calc_alert_subtitle)
.setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
.setNegativeButton(R.string.cancel, null)
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
@ -1608,12 +1623,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
public void onShowDisclaimer(@Nullable MapObject startPoint, @Nullable MapObject endPoint)
{
final StringBuilder builder = new StringBuilder();
for (int resId : new int[] { R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision,
for (int resId : new int[]{R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision,
R.string.dialog_routing_disclaimer_recommendations, R.string.dialog_routing_disclaimer_borders,
R.string.dialog_routing_disclaimer_beware })
builder.append(MwmApplication.from(this).getString(resId)).append("\n\n");
R.string.dialog_routing_disclaimer_beware})
builder.append(getString(resId)).append("\n\n");
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.dialog_routing_disclaimer_title)
.setMessage(builder.toString())
.setCancelable(false)
@ -1622,16 +1638,18 @@ public class MwmActivity extends BaseMwmFragmentActivity
Config.acceptRoutingDisclaimer();
RoutingController.get().prepare(startPoint, endPoint);
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
@Override
public void onSuggestRebuildRoute()
{
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setMessage(R.string.p2p_reroute_from_current)
.setCancelable(false)
.setNegativeButton(R.string.cancel, null);
.setNegativeButton(R.string.cancel, null)
.setOnDismissListener(dialog -> mAlertDialog = null);
final TextView titleView = (TextView)View.inflate(this, R.layout.dialog_suggest_reroute_title, null);
titleView.setText(R.string.p2p_only_from_current);
@ -1647,7 +1665,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
builder.setPositiveButton(R.string.ok, (dialog, which) -> RoutingController.get().setStartFromMyPosition());
}
builder.show();
dismissAlertDialog();
mAlertDialog = builder.show();
}
@Override
@ -1660,6 +1679,16 @@ public class MwmActivity extends BaseMwmFragmentActivity
showAddStartOrFinishFrame(controller, true);
}
/**
* Dismiss the active modal dialog from the screen, if any.
*/
private void dismissAlertDialog()
{
if (mAlertDialog != null && mAlertDialog.isShowing())
mAlertDialog.dismiss();
mAlertDialog = null;
}
/**
* Dismiss location error dialog from the screen, if any.
*/
@ -1780,7 +1809,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
*/
private void pauseLocationInBackground()
{
dismissLocationErrorDialog();
LocationState.nativeRemoveLocationPendingTimeoutListener();
if (!LocationHelper.INSTANCE.isActive())