prevent crash for missing card, fix crash Android 8-13 NoSuchMethodError

This commit is contained in:
Anthony Calosa
2025-09-13 08:57:29 +08:00
parent b131e4eb04
commit b61044abb5
2 changed files with 14 additions and 2 deletions

View File

@@ -809,6 +809,11 @@ public class CardUtil {
return generateBoosterPackAsDeck(edition); return generateBoosterPackAsDeck(edition);
} }
private static PaperCard getReplacement(String missingCard, String replacementCard) {
System.err.println(missingCard + " : Not found in the database.\nReplacement card: " + replacementCard);
return FModel.getMagicDb().getCommonCards().getCard(replacementCard);
}
public static PaperCard getCardByName(String cardName) { public static PaperCard getCardByName(String cardName) {
List<PaperCard> validCards; List<PaperCard> validCards;
//Faster to ask the CardDB for a card name than it is to search the pool. //Faster to ask the CardDB for a card name than it is to search the pool.
@@ -817,6 +822,10 @@ public class CardUtil {
else else
validCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(cardName); validCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(cardName);
if (validCards.isEmpty()) {
return getReplacement(cardName, "Wastes");
}
return validCards.get(Current.world().getRandom().nextInt(validCards.size())); return validCards.get(Current.world().getRandom().nextInt(validCards.size()));
} }
@@ -828,7 +837,7 @@ public class CardUtil {
.filter(input -> input.getEdition().equals(edition)).collect(Collectors.toList()); .filter(input -> input.getEdition().equals(edition)).collect(Collectors.toList());
if (validCards.isEmpty()) { if (validCards.isEmpty()) {
System.err.println("Unexpected behavior: tried to call getCardByNameAndEdition for card " + cardName + " from the edition " + edition + ", but didn't find it in the DB. A random existing instance will be returned."); System.err.println("Unexpected behavior: tried to call getCardByNameAndEdition for card " + cardName + " from the edition " + edition + ", but didn't find it in the DB. A random existing instance will be returned if found.");
return getCardByName(cardName); return getCardByName(cardName);
} }

View File

@@ -22,6 +22,7 @@ import org.apache.commons.lang3.tuple.Pair;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors;
public class DeckImportController { public class DeckImportController {
public enum ImportBehavior { public enum ImportBehavior {
@@ -516,7 +517,9 @@ public class DeckImportController {
PaperCard card = token.getCard(); PaperCard card = token.getCard();
String cardName = card.getName(); String cardName = card.getName();
CardPool substitutes = availableInventory.getFilteredPool(c -> c.getName().equals(cardName)); CardPool substitutes = availableInventory.getFilteredPool(c -> c.getName().equals(cardName));
List<Map.Entry<PaperCard, Integer>> sortedSubstitutes = StreamUtil.stream(substitutes).sorted(Comparator.comparingInt(Map.Entry::getValue)).toList(); // Stream.toList() is only supported on Android 14 and above ref: https://developer.android.com/reference/java/util/stream/Stream#toList()
// use Collectors.toList() to support Android 8 to 13....
List<Map.Entry<PaperCard, Integer>> sortedSubstitutes = StreamUtil.stream(substitutes).sorted(Comparator.comparingInt(Map.Entry::getValue)).collect(Collectors.toList());
int neededQuantity = token.getQuantity(); int neededQuantity = token.getQuantity();
for(Token found : replacementList) { for(Token found : replacementList) {
//If there's an item in the replacement list already it means we've already found some of the needed copies. //If there's an item in the replacement list already it means we've already found some of the needed copies.