diff --git a/app/build.gradle b/app/build.gradle
index d1418559..036ceed6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,7 +11,7 @@ android {
targetSdk 35
versionCode 11
- versionName '4.6.2.BETA'
+ versionName '4.6.2'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions {
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java
index 06db820b..ce4a8e08 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java
@@ -125,10 +125,29 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
playbackStarted = false;
dismissalScheduled = false;
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() {
@Override
public void onError(Exception exception) {
+ view.removeCallbacks(failsafeTimeout);
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) {
scheduleDelayedDismissal(v);
}
@@ -136,6 +155,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
@Override
public void onLoadMedia(List> media) {
+ view.removeCallbacks(failsafeTimeout);
if (!isAdded() || getActivity() == null) {
return;
}
@@ -154,6 +174,9 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
scheduleDelayedDismissal(v);
}
} else {
+ Toast.makeText(getContext(),
+ R.string.bottom_sheet_problem_generating_instant_mix,
+ Toast.LENGTH_SHORT).show();
if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v);
}
@@ -331,4 +354,11 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
view.postDelayed(() -> dismissBottomSheet(), 200);
}, 300);
}
+
+ private boolean isOffline(Exception exception) {
+ return exception != null && exception.getMessage() != null &&
+ (exception.getMessage().contains("Network") ||
+ exception.getMessage().contains("timeout") ||
+ exception.getMessage().contains("offline"));
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java
index 91b2cf90..3f6f1a5e 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java
@@ -99,12 +99,29 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show();
playbackStarted = 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() {
@Override
public void onError(Exception exception) {
+ view.removeCallbacks(failsafeTimeout);
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) {
scheduleDelayedDismissal(v);
}
@@ -112,6 +129,7 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
@Override
public void onLoadMedia(List> media) {
+ view.removeCallbacks(failsafeTimeout);
if (!isAdded() || getActivity() == null) {
return;
}
@@ -132,6 +150,9 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
scheduleDelayedDismissal(v);
}
} else {
+ Toast.makeText(getContext(),
+ R.string.bottom_sheet_problem_generating_instant_mix,
+ Toast.LENGTH_SHORT).show();
if (!playbackStarted && !dismissalScheduled) {
scheduleDelayedDismissal(v);
}
@@ -191,4 +212,10 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
}, 300);
}
+ private boolean isOffline(Exception exception) {
+ return exception != null && exception.getMessage() != null &&
+ (exception.getMessage().contains("Network") ||
+ exception.getMessage().contains("timeout") ||
+ exception.getMessage().contains("offline"));
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 75573707..0ae9be02 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -52,6 +52,7 @@
Don\'t ask again
Disable
Generating instant mix...
+ Could not retrieve tracks from subsonic server.
Cancel
Enable data saver
OK