Commit e82748ba authored by Dark Zane's avatar Dark Zane Committed by GitHub

Merge branch 'fallenstardust:master' into master

parents ac5b34e8 a973468c
...@@ -158,7 +158,7 @@ public class CardLoader implements ICardSearcher { ...@@ -158,7 +158,7 @@ public class CardLoader implements ICardSearcher {
ArrayList<Card> noting = new ArrayList<Card>(); ArrayList<Card> noting = new ArrayList<Card>();
mCallBack.onSearchResult(noting, false); mCallBack.onSearchResult(noting, false);
} }
LogUtil.e("kk", "search", e); LogUtil.e("cc", "search", e);
//wait.dismiss(); //wait.dismiss();
}).done((tmp) -> { }).done((tmp) -> {
if (mCallBack != null) { if (mCallBack != null) {
......
package cn.garymb.ygomobile.ui.cards; package cn.garymb.ygomobile.ui.cards;
import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
import static cn.garymb.ygomobile.core.IrrlichtBridge.ACTION_SHARE_FILE; import static cn.garymb.ygomobile.core.IrrlichtBridge.ACTION_SHARE_FILE;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.graphics.Color;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.style.ForegroundColorSpan; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan; import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
...@@ -31,16 +33,14 @@ import com.bm.library.PhotoView; ...@@ -31,16 +33,14 @@ import com.bm.library.PhotoView;
import com.feihua.dialogutils.util.DialogUtils; import com.feihua.dialogutils.util.DialogUtils;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack; import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.garymb.ygomobile.AppsSettings; import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants; import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.core.IrrlichtBridge; import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lite.R; import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.CardKeyWord;
import cn.garymb.ygomobile.loader.CardSearchInfo;
import cn.garymb.ygomobile.loader.ImageLoader; import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.activities.BaseActivity; import cn.garymb.ygomobile.ui.activities.BaseActivity;
import cn.garymb.ygomobile.ui.adapters.BaseAdapterPlus; import cn.garymb.ygomobile.ui.adapters.BaseAdapterPlus;
...@@ -211,6 +211,15 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -211,6 +211,15 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
mListener.onOpenUrl(cardInfo); mListener.onOpenUrl(cardInfo);
} }
}); });
name.setOnClickListener((v) -> {
if (mListener != null) {
Card cardInfo = getCardInfo();
if (cardInfo == null) {
return;
}
mListener.onGetRelatedCardList(cardInfo);
}
});
findViewById(R.id.lastone).setOnClickListener((v) -> { findViewById(R.id.lastone).setOnClickListener((v) -> {
onPreCard(); onPreCard();
}); });
...@@ -231,7 +240,6 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -231,7 +240,6 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}); });
} }
public void toggleAnimation(ShimmerTextView target) { public void toggleAnimation(ShimmerTextView target) {
if (shimmer != null && shimmer.isAnimating()) { if (shimmer != null && shimmer.isAnimating()) {
shimmer.cancel(); shimmer.cancel();
...@@ -332,7 +340,9 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -332,7 +340,9 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
} else if (c == '」' && !stack.isEmpty()) { } else if (c == '」' && !stack.isEmpty()) {
stack.pop(); stack.pop();
if (stack.isEmpty()) { if (stack.isEmpty()) {
applySpan(spannableString, start, i, YGOUtil.c(R.color.holo_blue_bright)); String quotedText = text.substring(start, i).trim();
// 使用 queryable 方法判断是否高亮
applySpan(spannableString, start, i, queryable(quotedText)? YGOUtil.c(R.color.holo_blue_bright) : Color.WHITE);
currentQuoteType = QuoteType.NONE; currentQuoteType = QuoteType.NONE;
} }
} }
...@@ -342,7 +352,10 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -342,7 +352,10 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
if (c == '"' && !stack.isEmpty()) { if (c == '"' && !stack.isEmpty()) {
stack.pop(); stack.pop();
if (stack.isEmpty()) { if (stack.isEmpty()) {
applySpan(spannableString, start, i, YGOUtil.c(R.color.holo_blue_bright)); String quotedText = text.substring(start, i).trim();
if (queryable(quotedText)) { // 使用 queryable 方法判断是否高亮
applySpan(spannableString, start, i, queryable(quotedText)? YGOUtil.c(R.color.holo_blue_bright) : Color.WHITE);
}
currentQuoteType = QuoteType.NONE; currentQuoteType = QuoteType.NONE;
} else { } else {
stack.push(i); stack.push(i);
...@@ -357,7 +370,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -357,7 +370,7 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
// Handle unclosed quotes error, e.g., log a warning or throw an exception // Handle unclosed quotes error, e.g., log a warning or throw an exception
} }
desc.setText(spannableString); desc.setText(spannableString);
desc.setMovementMethod(android.text.method.LinkMovementMethod.getInstance()); desc.setMovementMethod(LinkMovementMethod.getInstance());
} }
private void applySpan(SpannableString spannableString, int start, int end, int color) { private void applySpan(SpannableString spannableString, int start, int end, int color) {
...@@ -367,25 +380,58 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -367,25 +380,58 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {
@Override @Override
public void onClick(View widget) { public void onClick(View widget) {
if (color != Color.WHITE) {
// 获取被点击的文本内容 // 获取被点击的文本内容
String clickedText = ((TextView) widget).getText().subSequence(start, end).toString(); String clickedText = ((TextView) widget).getText().subSequence(start, end).toString();
mListener.onSearchKeyWord(clickedText); mListener.onSearchKeyWord(clickedText);
} else {
YGOUtil.showTextToast(context.getString(R.string.searchresult) + context.getString(R.string.already_end));
}
} }
@Override @Override
public void updateDrawState(android.text.TextPaint ds) { public void updateDrawState(TextPaint ds) {
// 可以在这里自定义点击状态下的样式,如去掉下划线 // 可以在这里自定义点击状态下的样式,如去掉下划线
ds.setUnderlineText(true); ds.setUnderlineText(true);
} }
}, start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE); }, start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
private boolean queryable(String keyword) {
SparseArray<Card> cards = cardManager.getAllCards();
//创建一个新的列表来保存匹配的卡片
List<Card> matchingCards = new ArrayList<>();
for (int i = 0; i < cards.size(); i++) {
Card card = cards.valueAt(i);
if (card.Name.contains(keyword) || card.Desc.contains(keyword)) {
matchingCards.add(card);
}
}
// 检查匹配结果
if (matchingCards.isEmpty()) {
return false;
} else if (matchingCards.size() == 1) {
// 如果只有一个匹配项,检查是否是当前卡片
for (Card card : matchingCards) {
if (getCardInfo() != null && getCardInfo().equals(card)) {
return false;
}
}
return true;
} else {
return true;
}
}
private void setCardInfo(Card cardInfo, View view) { private void setCardInfo(Card cardInfo, View view) {
if (cardInfo == null) return; if (cardInfo == null) return;
mCardInfo = cardInfo; mCardInfo = cardInfo;
imageLoader.bindImage(cardImage, cardInfo, ImageLoader.Type.middle); imageLoader.bindImage(cardImage, cardInfo, ImageLoader.Type.middle);
dialog = DialogUtils.getdx(context); dialog = DialogUtils.getdx(context);
cardImage.setOnClickListener((v) -> {showCardImageDetail(cardInfo.Code);}); cardImage.setOnClickListener((v) -> {
showCardImageDetail(cardInfo.Code);
});
packName.setText(packManager.findPackNameById(cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code)); packName.setText(packManager.findPackNameById(cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code));
name.setText(cardInfo.Name); name.setText(cardInfo.Name);
setHighlightTextWithClickableSpans(cardInfo.Name.equals("Unknown") ? context.getString(R.string.tip_card_info_diff) : cardInfo.Desc); setHighlightTextWithClickableSpans(cardInfo.Name.equals("Unknown") ? context.getString(R.string.tip_card_info_diff) : cardInfo.Desc);
...@@ -658,6 +704,9 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -658,6 +704,9 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
} }
} }
// 定义引号类型
private enum QuoteType {NONE, DOUBLE_QUOTE, ANGLE_QUOTE}
public interface OnFavoriteChangedListener { public interface OnFavoriteChangedListener {
void onFavoriteChange(Card card, boolean favorite); void onFavoriteChange(Card card, boolean favorite);
} }
...@@ -675,6 +724,8 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -675,6 +724,8 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
void onSearchKeyWord(String keyword); void onSearchKeyWord(String keyword);
void onGetRelatedCardList(Card cardInfo);
void onClose(); void onClose();
} }
...@@ -706,6 +757,11 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -706,6 +757,11 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
} }
@Override
public void onGetRelatedCardList(Card cardInfo) {
}
@Override @Override
public void onAddSideCard(Card cardInfo) { public void onAddSideCard(Card cardInfo) {
...@@ -717,6 +773,4 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder { ...@@ -717,6 +773,4 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
} }
} }
// 定义引号类型
enum QuoteType { NONE, DOUBLE_QUOTE, ANGLE_QUOTE }
} }
...@@ -6,6 +6,7 @@ import android.graphics.Paint; ...@@ -6,6 +6,7 @@ import android.graphics.Paint;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
...@@ -29,6 +30,7 @@ import com.app.hubert.guide.model.HighLight; ...@@ -29,6 +30,7 @@ import com.app.hubert.guide.model.HighLight;
import com.app.hubert.guide.model.HighlightOptions; import com.app.hubert.guide.model.HighlightOptions;
import com.ourygo.lib.duelassistant.util.DuelAssistantManagement; import com.ourygo.lib.duelassistant.util.DuelAssistantManagement;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import cn.garymb.ygomobile.Constants; import cn.garymb.ygomobile.Constants;
...@@ -46,6 +48,7 @@ import cn.garymb.ygomobile.ui.plus.DialogPlus; ...@@ -46,6 +48,7 @@ import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit; import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.YGOUtil; import cn.garymb.ygomobile.utils.YGOUtil;
import cn.garymb.ygomobile.utils.glide.GlideCompat; import cn.garymb.ygomobile.utils.glide.GlideCompat;
import ocgcore.CardManager;
import ocgcore.DataManager; import ocgcore.DataManager;
import ocgcore.PackManager; import ocgcore.PackManager;
import ocgcore.data.Card; import ocgcore.data.Card;
...@@ -60,6 +63,7 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB ...@@ -60,6 +63,7 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
protected DrawerLayout mDrawerlayout; protected DrawerLayout mDrawerlayout;
protected CardSearcher mCardSearcher; protected CardSearcher mCardSearcher;
protected PackManager mPackManager; protected PackManager mPackManager;
protected CardManager mCardManager;
protected CardListAdapter mCardListAdapter; protected CardListAdapter mCardListAdapter;
protected boolean isLoad = false; protected boolean isLoad = false;
private RecyclerView mListView; private RecyclerView mListView;
...@@ -96,6 +100,7 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB ...@@ -96,6 +100,7 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
Button btn_search = layoutView.findViewById(R.id.btn_search); Button btn_search = layoutView.findViewById(R.id.btn_search);
btn_search.setOnClickListener((v) -> showSearch(true)); btn_search.setOnClickListener((v) -> showSearch(true));
mPackManager = DataManager.get().getPackManager(); mPackManager = DataManager.get().getPackManager();
mCardManager = DataManager.get().getCardManager();
mCardLoader = new CardLoader(getContext()); mCardLoader = new CardLoader(getContext());
mCardLoader.setCallBack(this); mCardLoader.setCallBack(this);
mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader); mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader);
...@@ -308,6 +313,11 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB ...@@ -308,6 +313,11 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
showSearchKeyWord(keyword); showSearchKeyWord(keyword);
} }
@Override
public void onGetRelatedCardList(Card cardInfo) {
getRelatedCardList(cardInfo);
}
@Override @Override
public void onImageUpdate(Card cardInfo) { public void onImageUpdate(Card cardInfo) {
mCardListAdapter.notifyItemChanged(cardInfo); mCardListAdapter.notifyItemChanged(cardInfo);
...@@ -350,6 +360,50 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB ...@@ -350,6 +360,50 @@ public class CardSearchFragment extends BaseFragemnt implements CardLoader.CallB
mCardLoader.search(searchInfo); 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) { private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code; Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
......
...@@ -104,6 +104,7 @@ import cn.garymb.ygomobile.utils.ShareUtil; ...@@ -104,6 +104,7 @@ import cn.garymb.ygomobile.utils.ShareUtil;
import cn.garymb.ygomobile.utils.YGODialogUtil; import cn.garymb.ygomobile.utils.YGODialogUtil;
import cn.garymb.ygomobile.utils.YGOUtil; import cn.garymb.ygomobile.utils.YGOUtil;
import cn.garymb.ygomobile.utils.glide.GlideCompat; import cn.garymb.ygomobile.utils.glide.GlideCompat;
import ocgcore.CardManager;
import ocgcore.DataManager; import ocgcore.DataManager;
import ocgcore.PackManager; import ocgcore.PackManager;
import ocgcore.data.Card; import ocgcore.data.Card;
...@@ -116,6 +117,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -116,6 +117,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
protected RecyclerView mListView; protected RecyclerView mListView;
protected CardLoader mCardLoader; protected CardLoader mCardLoader;
protected CardSearcher mCardSearcher; protected CardSearcher mCardSearcher;
protected CardManager mCardManager;
protected PackManager mPackManager; protected PackManager mPackManager;
protected CardListAdapter mCardListAdapter; protected CardListAdapter mCardListAdapter;
protected boolean isLoad = false; protected boolean isLoad = false;
...@@ -169,6 +171,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -169,6 +171,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
setListeners(); setListeners();
mPackManager = DataManager.get().getPackManager(); mPackManager = DataManager.get().getPackManager();
mCardManager = DataManager.get().getCardManager();
mCardLoader = new CardLoader(getContext()); mCardLoader = new CardLoader(getContext());
mCardLoader.setCallBack(this); mCardLoader.setCallBack(this);
mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader); mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader);
...@@ -568,6 +571,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -568,6 +571,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
showSearchKeyWord(keyword);//根据关键词搜索 showSearchKeyWord(keyword);//根据关键词搜索
} }
@Override
public void onGetRelatedCardList(Card cardInfo) {
getRelatedCardList(cardInfo);
}
@Override @Override
public void onClose() { public void onClose() {
mDialog.dismiss(); mDialog.dismiss();
...@@ -621,6 +629,50 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -621,6 +629,50 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
mCardLoader.search(searchInfo); 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) { private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code; Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
// 确保再次检查 PackManager 是否已经加载完成 // 确保再次检查 PackManager 是否已经加载完成
......
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