Commit 410f9721 authored by Dark Zane's avatar Dark Zane Committed by GitHub

Merge branch 'fallenstardust:master' into master

parents ea1d7611 1d534200
......@@ -42,6 +42,7 @@ import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.CardLoader;
import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.activities.BaseActivity;
import cn.garymb.ygomobile.ui.adapters.BaseAdapterPlus;
......@@ -70,8 +71,10 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
private static final String TAG = String.valueOf(CardDetail.class);
private final CardManager cardManager;
private final PackManager packManager;
private final CardLoader cardLoader;
private final ImageView cardImage;
private final TextView name;
private final TextView btn_related;
private final TextView desc;
private final TextView level;
private final TextView type;
......@@ -111,6 +114,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
private Button btn_redownload;
private Button btn_share;
private boolean isDownloadCardImage = true;
private List<String> spanStringList = new ArrayList<>();
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
......@@ -156,6 +160,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
packName = findViewById(R.id.pack_name);
toggleAnimation(packName);
name = findViewById(R.id.text_name);
btn_related = findViewById(R.id.btn_related);
desc = findViewById(R.id.text_desc);
close = findViewById(R.id.btn_close);
cardCode = findViewById(R.id.card_code);
......@@ -180,6 +185,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
lbSetCode = findViewById(R.id.label_setcode);
cardManager = DataManager.get().getCardManager();
packManager = DataManager.get().getPackManager();
cardLoader = new CardLoader(context);
close.setOnClickListener((v) -> {
if (mListener != null) {
mListener.onClose();
......@@ -212,13 +218,13 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
mListener.onOpenUrl(cardInfo);
}
});
name.setOnClickListener((v) -> {
btn_related.setOnClickListener((v) -> {
if (mListener != null) {
Card cardInfo = getCardInfo();
if (cardInfo == null) {
return;
}
mListener.onGetRelatedCardList(cardInfo);
mListener.onGetRelatedCardList(relatedCards(cardInfo));
}
});
findViewById(R.id.lastone).setOnClickListener((v) -> {
......@@ -236,7 +242,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
if (cardInfo == null) {
return;
}
mListener.onShowPackList(cardInfo);
showPackList(cardInfo);
}
});
}
......@@ -311,9 +317,14 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
return mCardInfo;
}
private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
mListener.onShowPackList(packManager.getCards(cardLoader, idToUse));
}
public void setHighlightTextWithClickableSpans(String text) {
SpannableString spannableString = new SpannableString(text);
spanStringList.clear(); // 清空之前的高亮文本列表
// 解析器状态
QuoteType currentQuoteType = QuoteType.NONE;
Stack<Integer> stack = new Stack<>();
......@@ -344,6 +355,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
String quotedText = text.substring(start, i).trim();
// 使用 queryable 方法判断是否高亮
applySpan(spannableString, start, i, queryable(quotedText)? YGOUtil.c(R.color.holo_blue_bright) : Color.WHITE);
spanStringList.add(quotedText);
currentQuoteType = QuoteType.NONE;
}
}
......@@ -355,6 +367,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
if (stack.isEmpty()) {
String quotedText = text.substring(start, i).trim();
applySpan(spannableString, start, i, queryable(quotedText)? YGOUtil.c(R.color.holo_blue_bright) : Color.WHITE);
spanStringList.add(quotedText);
currentQuoteType = QuoteType.NONE;
} else {
stack.push(i);
......@@ -364,10 +377,6 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
break;
}
}
// 处理未关闭的引号对
if (!stack.isEmpty()) {
// Handle unclosed quotes error, e.g., log a warning or throw an exception
}
desc.setText(spannableString);
desc.setMovementMethod(LinkMovementMethod.getInstance());
}
......@@ -415,17 +424,13 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
matchingCards.add(card);
}
}
// 获取当前卡片信息
Card currentCard = getCardInfo();
// 检查匹配结果
if (matchingCards.isEmpty()) {
return false; // 如果没有找到匹配的卡片,返回 false
} else if (matchingCards.size() == 1) {
// 如果只有一个匹配项,检查是否是当前卡片
Card matchedCard = matchingCards.get(0);
if (currentCard != null && currentCard.equals(matchedCard)) {
if (getCardInfo() != null && getCardInfo().equals(matchedCard)) {
return false; // 如果是当前卡片,返回 false
} else {
return true; // 否则返回 true
......@@ -435,6 +440,54 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}
}
private boolean relatable(Card cardInfo) {
List<Card> matchingCards = relatedCards(cardInfo);
if (!matchingCards.isEmpty())
return true;
return false;
}
private List<Card> relatedCards(Card cardInfo) {
SparseArray<Card> cards = cardManager.getAllCards();
// 新创建一个表避免外部修改原本的表
List<String> highlightedTexts = new ArrayList<>(spanStringList);
// 使用 ArrayList 来保存匹配的卡片
List<Card> matchingCards = new ArrayList<>();
// 将 cardInfo 的 setCode 转换为 List<Long>
List<Long> cardInfoSetCodes = new ArrayList<>();
for (long setCode : cardInfo.getSetCode()) {
if (setCode != 0) cardInfoSetCodes.add(setCode);
}
Log.w("cc cardInfoSetCodes", cardInfoSetCodes.toString());
for (int i = 0; i < cards.size(); i++) {
Card card = cards.valueAt(i);
// 检查卡片名或描述是否包含给定卡片的名字
if (!card.Name.equals(cardInfo.Name) && (card.Name.contains(cardInfo.Name) || card.Desc.contains(cardInfo.Name))) {
// 检查卡片是否已经存在于匹配列表中
if (!matchingCards.contains(card)) matchingCards.add(card);
}
// 获取卡片的字段并检查是否有相同的字段
for (long setCode : card.getSetCode()) {
if (cardInfoSetCodes.contains(setCode)) {
if (!matchingCards.contains(card) && !card.Name.equals(cardInfo.Name)) matchingCards.add(card);
}
}
for (String keyword : highlightedTexts) {
if ((card.Name != null && card.Name.equals(keyword)) //和关键词完全一致的视为关联卡
|| (card.Desc != null && (card.Desc.contains("「" + keyword + "」") || card.Desc.contains("\"" + keyword + "\"")))) {//描述中关键词指向的字段一致的视为关联卡
if (!matchingCards.contains(card) && !card.Name.equals(cardInfo.Name)) matchingCards.add(card);
}
}
}
return matchingCards;
}
private void setCardInfo(Card cardInfo, View view) {
if (cardInfo == null) return;
mCardInfo = cardInfo;
......@@ -443,9 +496,10 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
cardImage.setOnClickListener((v) -> {
showCardImageDetail(cardInfo.Code);
});
packName.setText(packManager.findPackNameById(cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code));
packName.setText(packManager.findPackNameById((cardInfo.Alias != 0 && Math.abs(cardInfo.Alias - cardInfo.Code) <= 20) ? cardInfo.Alias : cardInfo.Code));
name.setText(cardInfo.Name);
setHighlightTextWithClickableSpans(cardInfo.Name.equals("Unknown") ? context.getString(R.string.tip_card_info_diff) : cardInfo.Desc);
btn_related.setVisibility(relatable(cardInfo) ? View.VISIBLE : View.GONE);
cardCode.setText(String.format("%08d", cardInfo.getCode()));
if (cardInfo.isType(CardType.Token)) {
faq.setVisibility(View.INVISIBLE);
......@@ -731,11 +785,11 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
void onImageUpdate(Card cardInfo);
void onShowPackList(Card cardInfo);
void onShowPackList(List<Card> packList);
void onSearchKeyWord(String keyword);
void onGetRelatedCardList(Card cardInfo);
void onGetRelatedCardList(List<Card> cardList);
void onClose();
}
......@@ -759,7 +813,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}
@Override
public void onShowPackList(Card cardInfo) {
public void onShowPackList(List<Card> packList) {
}
......@@ -769,7 +823,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}
@Override
public void onGetRelatedCardList(Card cardInfo) {
public void onGetRelatedCardList(List<Card> cardList) {
}
......
......@@ -304,8 +304,8 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
}
@Override
public void onShowPackList(Card cardInfo) {
showPackList(cardInfo);
public void onShowPackList(List<Card> packList) {
showCardList(packList, false);//保持原收录顺序,不排序
}
@Override
......@@ -314,8 +314,8 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
}
@Override
public void onGetRelatedCardList(Card cardInfo) {
getRelatedCardList(cardInfo);
public void onGetRelatedCardList(List<Card> cardList) {
showCardList(cardList, true);//便于查看,排序
}
@Override
......@@ -360,59 +360,11 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
mCardLoader.search(searchInfo);
}
private void getRelatedCardList(Card cardInfo) {
SparseArray<Card> cards = mCardManager.getAllCards();
// 使用 ArrayList 来保存匹配的卡片
List<Card> matchingCards = new ArrayList<>();
// 将 cardInfo 的 setCode 转换为 List<Long>
List<Long> cardInfoSetCodes = new ArrayList<>();
for (long setCode : cardInfo.getSetCode()) {
if (setCode != 0) cardInfoSetCodes.add(setCode);
}
Log.w("cc cardInfoSetCodes", cardInfoSetCodes.toString());
for (int i = 0; i < cards.size(); i++) {
Card card = cards.valueAt(i);
// 检查卡片是否已经存在于匹配列表中
if (!matchingCards.contains(card)) {
// 检查卡片名或描述是否包含给定卡片的名字
if (!card.Name.equals(cardInfo.Name) && (card.Name.contains(cardInfo.Name) || card.Desc.contains(cardInfo.Name))) {
matchingCards.add(card);
continue; // 如果名称或描述匹配,则跳过系列代码检查
}
// 获取卡片的系列代码并检查是否有相同的系列代码
for (long setCode : card.getSetCode()) {
if (cardInfoSetCodes.contains(setCode)) {
matchingCards.add(card);
break; // 如果已经找到匹配,可以跳出内层循环
}
}
}
}
// 日志输出匹配的卡片数量
Log.w("cc related cards", "Found " + matchingCards.size() + " related cards.");
// 确保 matchingCards 不为空时调用 onSearchResult
if (!matchingCards.isEmpty()) {
onSearchResult(mCardLoader.sort(matchingCards), false);//为了整齐需要,调用CardLoader的sort方法排序List<Card>
} else {
Log.w("cc", "No related card found");
}
}
private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
List<Card> packList = mPackManager.getCards(mCardLoader, idToUse);
if (packList != null) {
onSearchResult(packList, false);//为了保持原packlist的收录顺序,不调用CardLoader的sort方法排序List<Card>
private void showCardList(List<Card> cardList, boolean sort) {
if (!cardList.isEmpty()) {
onSearchResult(sort ? mCardLoader.sort(cardList) : cardList, false);//根据情况不同,判断是否调用CardLoader的sort方法排序List<Card>
} else {
Log.w("cc", "No pack found for the given ID/Alias: " + idToUse);
Log.w("cc", "No card found");
}
}
......
......@@ -562,8 +562,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
@Override
public void onShowPackList(Card cardInfo) {
showPackList(cardInfo);
public void onShowPackList(List<Card> packList) {
showCardList(packList, false);//保持原收录顺序,不排序
}
@Override
......@@ -572,8 +572,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}
@Override
public void onGetRelatedCardList(Card cardInfo) {
getRelatedCardList(cardInfo);
public void onGetRelatedCardList(List<Card> cardList) {
showCardList(cardList, true);//便于查看,排序
}
@Override
......@@ -629,61 +629,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
mCardLoader.search(searchInfo);
}
private void getRelatedCardList(Card cardInfo) {
SparseArray<Card> cards = mCardManager.getAllCards();
// 使用 ArrayList 来保存匹配的卡片
List<Card> matchingCards = new ArrayList<>();
// 将 cardInfo 的 setCode 转换为 List<Long>
List<Long> cardInfoSetCodes = new ArrayList<>();
for (long setCode : cardInfo.getSetCode()) {
if (setCode != 0) cardInfoSetCodes.add(setCode);
}
Log.w("cc cardInfoSetCodes", cardInfoSetCodes.toString());
for (int i = 0; i < cards.size(); i++) {
Card card = cards.valueAt(i);
// 检查卡片是否已经存在于匹配列表中
if (!matchingCards.contains(card)) {
// 检查卡片名或描述是否包含给定卡片的名字
if (!card.Name.equals(cardInfo.Name) && (card.Name.contains(cardInfo.Name) || card.Desc.contains(cardInfo.Name))) {
matchingCards.add(card);
continue; // 如果名称或描述匹配,则跳过系列代码检查
}
// 获取卡片的系列代码并检查是否有相同的系列代码
for (long setCode : card.getSetCode()) {
if (cardInfoSetCodes.contains(setCode)) {
matchingCards.add(card);
break; // 如果已经找到匹配,可以跳出内层循环
}
}
}
}
// 日志输出匹配的卡片数量
Log.w("cc related cards", "Found " + matchingCards.size() + " related cards.");
// 确保 matchingCards 不为空时调用 onSearchResult
if (!matchingCards.isEmpty()) {
onSearchResult(matchingCards, false);
} else {
Log.w("cc", "No related card found");
}
}
private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
// 确保再次检查 PackManager 是否已经加载完成
if (mPackManager == null) {
return;
}
List<Card> packList = mPackManager.getCards(mCardLoader, idToUse);
if (packList != null) {
onSearchResult(packList, false);
private void showCardList(List<Card> cardList, boolean sort) {
if (!cardList.isEmpty()) {
onSearchResult(sort ? mCardLoader.sort(cardList) : cardList, false);//根据情况不同,判断是否调用CardLoader的sort方法排序List<Card>
} else {
Log.w("seesee", "No pack found for the given ID/Alias: " + idToUse);
Log.w("cc", "No card found");
}
}
......
......@@ -30,15 +30,15 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/title_height_small"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/btn_faq"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@drawable/addto"
android:background="@drawable/button2_bg"
android:gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
......@@ -46,20 +46,37 @@
android:text="@string/card_faq"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/colorAccentDark"
android:textSize="14sp"
android:textSize="10sp"
android:textStyle="bold" />
<TextView
android:id="@+id/btn_related"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@drawable/button2_bg"
android:gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:shadowColor="@color/black"
android:text="@string/card_related"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/holo_orange_bright"
android:textSize="10sp"
android:textStyle="bold" />
<TextView
android:id="@+id/btn_add_main"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:background="@drawable/addto"
android:background="@drawable/button2_bg"
android:gravity="center"
android:text="@string/card_add_main"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="@color/item_title"
android:textSize="14sp"
android:textSize="10sp"
android:textStyle="bold"
android:visibility="invisible"
tools:visibility="visible" />
......@@ -67,14 +84,14 @@
<TextView
android:id="@+id/btn_add_side"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:background="@drawable/addto"
android:background="@drawable/button2_bg"
android:gravity="center"
android:text="@string/card_add_side"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="@color/item_title"
android:textSize="14sp"
android:textSize="10sp"
android:textStyle="bold"
android:visibility="invisible"
tools:visibility="visible" />
......@@ -86,15 +103,18 @@
<ImageButton
android:id="@+id/btn_close"
android:layout_width="@dimen/button_width_small"
android:layout_height="@dimen/button_width_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@android:color/transparent"
app:srcCompat="@drawable/ic_close_black_24dp" />
</LinearLayout>
<cn.garymb.ygomobile.ui.widget.AlwaysMarqueeTextView
android:id="@+id/text_name"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
......@@ -206,7 +226,7 @@
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:src="@drawable/ic_search"/>
android:src="@drawable/ic_search" />
</LinearLayout>
</LinearLayout>
......
......@@ -142,6 +142,7 @@
<string name="label_category">Categoría</string>
<string name="searching">Buscar</string>
<string name="card_faq">FAQ</string>
<string name="card_related">Relacionadas</string>
<string name="no_webbrowser">Ningún navegador web instalado</string>
<string name="load_game">Cargando juego</string>
<string name="new_deck">Nuevo</string>
......
......@@ -133,7 +133,8 @@
<string name="label_category">効果分類</string>
<string name="linkmarker">◀リンクマーカー▶</string>>
<string name="searching">ロード中</string>
<string name="card_faq">オンラインで判定をチェック</string>
<string name="card_faq">Q&amp;A</string>
<string name="card_related">関連カード</string>
<string name="no_webbrowser">ブラウザはインストールしていません</string>
<string name="load_game">ゲーム起動中</string>
......
......@@ -133,6 +133,7 @@
<string name="linkmarker">◀링크 마커▶</string>>
<string name="searching">검색 중</string>
<string name="card_faq">FAQ</string>
<string name="card_related">관련 카드</string>
<string name="no_webbrowser">웹 브라우저가 설치되지 않았습니다</string>
<string name="load_game">게임 시작 중</string>
......
......@@ -134,6 +134,7 @@
<string name="linkmarker">◀连接标记▶</string>>
<string name="searching">读取中</string>
<string name="card_faq">裁定查询</string>
<string name="card_related">关联卡片</string>
<string name="no_webbrowser">没有安装浏览器</string>
<string name="load_game">启动游戏中</string>
......
......@@ -376,4 +376,5 @@
<string name="tip_download_failed">Save Failed!</string>
<string name="tip_download_OK">Saved to</string>
<string name="replay_list">Replay List</string>
<string name="card_related">Related</string>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment