fix: added a timeout for the callbacks to dismiss dialog and notify the user

This commit is contained in:
eddyizm 2026-01-04 10:05:16 -08:00
parent 993374e56c
commit 6110a9c8e7
No known key found for this signature in database
GPG key ID: CF5F671829E8158A
4 changed files with 60 additions and 2 deletions

View file

@ -11,7 +11,7 @@ android {
targetSdk 35 targetSdk 35
versionCode 11 versionCode 11
versionName '4.6.2.BETA' versionName '4.6.2'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions { javaCompileOptions {

View file

@ -125,10 +125,29 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
playbackStarted = false; playbackStarted = false;
dismissalScheduled = false; dismissalScheduled = false;
Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show();
final Runnable failsafeTimeout = () -> {
if (!playbackStarted && !dismissalScheduled) {
Log.w(TAG, "No response received within 3 seconds");
if (isAdded() && getActivity() != null) {
Toast.makeText(getContext(),
R.string.bottom_sheet_problem_generating_instant_mix,
Toast.LENGTH_SHORT).show();
dismissBottomSheet();
}
}
};
view.postDelayed(failsafeTimeout, 3000);
new AlbumRepository().getInstantMix(album, 20, new MediaCallback() { new AlbumRepository().getInstantMix(album, 20, new MediaCallback() {
@Override @Override
public void onError(Exception exception) { public void onError(Exception exception) {
view.removeCallbacks(failsafeTimeout);
Log.e(TAG, "Error: " + exception.getMessage()); Log.e(TAG, "Error: " + exception.getMessage());
if (isAdded() && getActivity() != null) {
String message = isOffline(exception) ?
"You're offline" : "Network error";
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
}
if (!playbackStarted && !dismissalScheduled) { if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
@ -136,6 +155,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
view.removeCallbacks(failsafeTimeout);
if (!isAdded() || getActivity() == null) { if (!isAdded() || getActivity() == null) {
return; return;
} }
@ -154,6 +174,9 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
} else { } else {
Toast.makeText(getContext(),
R.string.bottom_sheet_problem_generating_instant_mix,
Toast.LENGTH_SHORT).show();
if (!playbackStarted && !dismissalScheduled) { if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
@ -331,4 +354,11 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
view.postDelayed(() -> dismissBottomSheet(), 200); view.postDelayed(() -> dismissBottomSheet(), 200);
}, 300); }, 300);
} }
private boolean isOffline(Exception exception) {
return exception != null && exception.getMessage() != null &&
(exception.getMessage().contains("Network") ||
exception.getMessage().contains("timeout") ||
exception.getMessage().contains("offline"));
}
} }

View file

@ -99,12 +99,29 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show();
playbackStarted = false; playbackStarted = false;
dismissalScheduled = false; dismissalScheduled = false;
final Runnable failsafeTimeout = () -> {
if (!playbackStarted && !dismissalScheduled) {
Log.w(TAG, "No response received within 3 seconds");
if (isAdded() && getActivity() != null) {
Toast.makeText(getContext(),
R.string.bottom_sheet_problem_generating_instant_mix,
Toast.LENGTH_SHORT).show();
dismissBottomSheet();
}
}
};
view.postDelayed(failsafeTimeout, 3000);
new ArtistRepository().getInstantMix(artist, 20, new MediaCallback() { new ArtistRepository().getInstantMix(artist, 20, new MediaCallback() {
@Override @Override
public void onError(Exception exception) { public void onError(Exception exception) {
view.removeCallbacks(failsafeTimeout);
Log.e(TAG, "Error: " + exception.getMessage()); Log.e(TAG, "Error: " + exception.getMessage());
if (isAdded() && getActivity() != null) {
String message = isOffline(exception) ?
"You're offline" : "Network error";
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
}
if (!playbackStarted && !dismissalScheduled) { if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
@ -112,6 +129,7 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
view.removeCallbacks(failsafeTimeout);
if (!isAdded() || getActivity() == null) { if (!isAdded() || getActivity() == null) {
return; return;
} }
@ -132,6 +150,9 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
} else { } else {
Toast.makeText(getContext(),
R.string.bottom_sheet_problem_generating_instant_mix,
Toast.LENGTH_SHORT).show();
if (!playbackStarted && !dismissalScheduled) { if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v); scheduleDelayedDismissal(v);
} }
@ -191,4 +212,10 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
}, 300); }, 300);
} }
private boolean isOffline(Exception exception) {
return exception != null && exception.getMessage() != null &&
(exception.getMessage().contains("Network") ||
exception.getMessage().contains("timeout") ||
exception.getMessage().contains("offline"));
}
} }

View file

@ -52,6 +52,7 @@
<string name="battery_optimization_neutral_button">Don\'t ask again</string> <string name="battery_optimization_neutral_button">Don\'t ask again</string>
<string name="battery_optimization_positive_button">Disable</string> <string name="battery_optimization_positive_button">Disable</string>
<string name="bottom_sheet_generating_instant_mix">Generating instant mix...</string> <string name="bottom_sheet_generating_instant_mix">Generating instant mix...</string>
<string name="bottom_sheet_problem_generating_instant_mix">Could not retrieve tracks from subsonic server.</string>
<string name="connection_alert_dialog_negative_button">Cancel</string> <string name="connection_alert_dialog_negative_button">Cancel</string>
<string name="connection_alert_dialog_neutral_button">Enable data saver</string> <string name="connection_alert_dialog_neutral_button">Enable data saver</string>
<string name="connection_alert_dialog_positive_button">OK</string> <string name="connection_alert_dialog_positive_button">OK</string>