Commit 649bce0a authored by feihuaduo's avatar feihuaduo

修复多行时卡组码识别的问题

修复主页识别卡组码无法识别卡组名的问题
决斗助手模块化
升级到gradle 7.3
parent fafaae57
......@@ -10,7 +10,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'com.android.tools.build:gradle-experimental:0.11.1'
//classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
......
......@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
......@@ -129,4 +129,6 @@ dependencies {
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.2.0'
//圆形头像
implementation 'de.hdodenhof:circleimageview:2.2.0'
//决斗助手
implementation 'com.github.feihuaduo:YGODuelAssistantLib:1.0'
}
......@@ -218,16 +218,6 @@ public interface Constants {
String QUERY_YDK = "ydk";
String QUERY_NAME = "name";
String QUERY_MAIN = "m";
String QUERY_DECK = "d";
String QUERY_EXTRA = "e";
String QUERY_SIDE = "s";
String QUERY_VERSION = "v";
String QUERY_MAIN_ALL = "main";
String QUERY_EXTRA_ALL = "extra";
String QUERY_SIDE_ALL = "side";
String QUERY_YGO_TYPE = "ygotype";
String ARG_DECK = "deck";
String PATH_ROOM = "/room";
String QUERY_HOST = "host";
String QUERY_PORT = "port";
......@@ -245,48 +235,7 @@ public interface Constants {
String DEF_ENCODING = "utf-8";
String[] NUM_40_LIST = {
"0"
, "1"
, "2"
, "3"
, "4"
, "5"
, "6"
, "7"
, "8"
, "9"
, "a"
, "b"
, "c"
, "d"
, "e"
, "f"
, "g"
, "h"
, "i"
, "j"
, "k"
, "l"
, "m"
, "n"
, "o"
, "p"
, "q"
, "r"
, "s"
, "t"
, "u"
, "v"
, "w"
, "x"
, "y"
, "z"
, "A"
, "B"
, "C"
, "D"
};
/*23333先行密码与正式密码对照数组
*来源网站:https://ygocdb.com/api/v0/idChangelogArray.jsonp
*/
......
......@@ -19,10 +19,11 @@ import android.util.Log;
import android.widget.Toast;
import com.ourygo.assistant.util.YGODAUtil;
import com.ourygo.lib.duelassistant.util.YGODAUtil;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import java.util.Locale;
import cn.garymb.ygodata.YGOGameOptions;
......@@ -246,13 +247,19 @@ public class GameUriManager {
if (!TextUtils.isEmpty(name)) {
doOpenPath(name);
} else {
Deck deckInfo = new Deck(uri);
YGODAUtil.deDeckListener(uri, (uri1, mainList, exList, sideList, isCompleteDeck, exception) -> {
if (!TextUtils.isEmpty(exception)){
YGOUtil.show("卡组解析失败,原因为:"+exception);
return;
}
Deck deckInfo = new Deck(uri,mainList,exList,sideList);
File file = deckInfo.saveTemp(AppsSettings.get().getDeckDir());
if (!deckInfo.isCompleteDeck()) {
YGOUtil.show("当前卡组缺少完整信息,将只显示已有卡片");
}
startSetting.putExtra(Intent.EXTRA_TEXT, file.getAbsolutePath());
activity.startActivity(startSetting);
});
}
} else if (Constants.URI_ROOM.equals(host)) {
YGODAUtil.deRoomListener(uri, (host1, port, password, exception) -> {
......
......@@ -28,7 +28,7 @@ import com.app.hubert.guide.NewbieGuide;
import com.app.hubert.guide.model.GuidePage;
import com.app.hubert.guide.model.HighLight;
import com.app.hubert.guide.model.HighlightOptions;
import com.ourygo.assistant.util.DuelAssistantManagement;
import com.ourygo.lib.duelassistant.util.DuelAssistantManagement;
import java.util.List;
......
......@@ -55,7 +55,7 @@ import com.feihua.dialogutils.util.DialogUtils;
import com.nightonke.boommenu.BoomButtons.BoomButton;
import com.nightonke.boommenu.BoomButtons.TextOutsideCircleButton;
import com.nightonke.boommenu.BoomMenuButton;
import com.ourygo.assistant.util.DuelAssistantManagement;
import com.ourygo.lib.duelassistant.util.DuelAssistantManagement;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
......@@ -920,7 +920,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
Button bt_image_share = viewDialog.findViewById(R.id.bt_image_share);
Button bt_code_share = viewDialog.findViewById(R.id.bt_code_share);
TextView tv_code = viewDialog.findViewById(R.id.et_code);
tv_code.setText(deck.toAppUri().toString());
tv_code.setText(deck.toUri().toString());
ImageUtil.show(getContext(), savePath, iv_image, System.currentTimeMillis() + "");
bt_code_share.setOnClickListener(v -> {
......
......@@ -33,9 +33,10 @@ import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.ourygo.assistant.base.listener.OnDuelAssistantListener;
import com.ourygo.assistant.util.DuelAssistantManagement;
import com.ourygo.assistant.util.Util;
import com.ourygo.lib.duelassistant.listener.OnDuelAssistantListener;
import com.ourygo.lib.duelassistant.util.DuelAssistantManagement;
import com.ourygo.lib.duelassistant.util.Util;
import com.stx.xhb.androidx.XBanner;
import com.tubb.smrv.SwipeMenuRecyclerView;
......@@ -66,7 +67,6 @@ import cn.garymb.ygomobile.ui.activities.WebActivity;
import cn.garymb.ygomobile.ui.adapters.ServerListAdapter;
import cn.garymb.ygomobile.ui.adapters.SimpleListAdapter;
import cn.garymb.ygomobile.ui.cards.CardDetailRandom;
import cn.garymb.ygomobile.ui.cards.deck.DeckUtils;
import cn.garymb.ygomobile.ui.mycard.McNews;
import cn.garymb.ygomobile.ui.mycard.MyCard;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.ImageUtil;
......@@ -511,7 +511,7 @@ public class HomeFragment extends BaseFragemnt implements OnDuelAssistantListene
}
@Override
public void onCardSearch(String key, int id) {
public void onCardQuery(String key, int id) {
/*
if (id == ID_HOMEFRAGMENT) {
Intent intent = new Intent(this, CardSearchFragment.class);
......@@ -521,11 +521,15 @@ public class HomeFragment extends BaseFragemnt implements OnDuelAssistantListene
}
@Override
public void onSaveDeck(String message, boolean isUrl, int id) {
saveDeck(message, isUrl);
public void onSaveDeck(Uri uri, List<Integer> mainList, List<Integer> exList, List<Integer> sideList, boolean isCompleteDeck, String exception, int id) {
saveDeck(uri,mainList,exList,sideList,isCompleteDeck,exception);
}
public void saveDeck(String deckMessage, boolean isUrl) {
public void saveDeck(Uri uri, List<Integer> mainList, List<Integer> exList, List<Integer> sideList, boolean isCompleteDeck, String exception) {
if (!TextUtils.isEmpty(exception)){
YGOUtil.show("卡组解析失败,原因为:"+exception);
return;
}
DialogPlus dialog = new DialogPlus(getContext());
dialog.setTitle(R.string.question);
dialog.setMessage(R.string.find_deck_text);
......@@ -538,9 +542,14 @@ public class HomeFragment extends BaseFragemnt implements OnDuelAssistantListene
});
dialog.setRightButtonListener((dlg, s) -> {
dialog.dismiss();
Deck deckInfo;
//如果是卡组url
if (isUrl) {
Deck deckInfo = new Deck(getString(R.string.rename_deck) + System.currentTimeMillis(), Uri.parse(deckMessage));
if (uri != null) {
deckInfo = new Deck(uri, mainList, exList, sideList);
} else {
deckInfo = new Deck(getString(R.string.rename_deck) + System.currentTimeMillis(), mainList, exList, sideList);
}
deckInfo.setCompleteDeck(isCompleteDeck);
File file = deckInfo.saveTemp(AppsSettings.get().getDeckDir());
if (!deckInfo.isCompleteDeck()) {
YGOUtil.show("当前卡组缺少完整信息,将只显示已有卡片");
......@@ -550,21 +559,6 @@ public class HomeFragment extends BaseFragemnt implements OnDuelAssistantListene
activity.fragment_deck_cards.setArguments(mBundle);
}
activity.switchFragment(activity.fragment_deck_cards, 2, true);
} else {
//如果是卡组文本
try {
//以当前时间戳作为卡组名保存卡组
File file = DeckUtils.save(getString(R.string.rename_deck) + System.currentTimeMillis(), deckMessage);
if (!file.getAbsolutePath().isEmpty()) {
mBundle.putString("setDeck", file.getAbsolutePath());
activity.fragment_deck_cards.setArguments(mBundle);
}
activity.switchFragment(activity.fragment_deck_cards, 2, true);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getContext(), getString(R.string.save_failed_bcos) + e, Toast.LENGTH_SHORT).show();
}
}
});
}
......
......@@ -2,9 +2,6 @@ package cn.garymb.ygomobile.ui.mycard;
import static junit.framework.Assert.assertEquals;
import static cn.garymb.ygomobile.Constants.ARG_DECK;
import static cn.garymb.ygomobile.Constants.QUERY_YGO_TYPE;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
......
......@@ -26,7 +26,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.ourygo.assistant.util.Util;
import com.ourygo.lib.duelassistant.util.Util;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
......
......@@ -14,7 +14,8 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.ourygo.assistant.util.Util;
import com.ourygo.lib.duelassistant.util.Util;
import cn.garymb.ygomobile.base.BaseFragemnt;
import cn.garymb.ygomobile.lite.R;
......
......@@ -18,7 +18,7 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.signature.ObjectKey;
import com.ourygo.assistant.util.Util;
import com.ourygo.lib.duelassistant.util.Util;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.utils.PaletteUtil;
......
......@@ -96,7 +96,7 @@ public class YGODialogUtil {
public ViewHolder(Context context, String selectDeckPath, OnDeckMenuListener onDeckMenuListener) {
DialogUtils du = DialogUtils.getdx(context);
View viewDialog = du.dialogBottomSheet(R.layout.dialog_deck_select, false);
View viewDialog = du.dialogBottomSheet(R.layout.dialog_deck_select, true);
RecyclerView rv_type, rv_deck;
rv_deck = viewDialog.findViewById(R.id.rv_deck);
......@@ -380,7 +380,7 @@ public class YGODialogUtil {
deckAdp.notifyDataSetChanged();
}
}));
itemTouchHelper.attachToRecyclerView(rv_type);
// itemTouchHelper.attachToRecyclerView(rv_type);
}
private String[] getStringType(List<DeckType> deckTypeList) {
......
......@@ -15,8 +15,8 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.ourygo.assistant.util.PermissionUtil;
import com.ourygo.assistant.util.Util;
import com.ourygo.lib.duelassistant.util.PermissionUtil;
import com.ourygo.lib.duelassistant.util.Util;
import cn.garymb.ygomobile.App;
import cn.garymb.ygomobile.lite.R;
......@@ -37,51 +37,6 @@ public class YGOUtil {
return App.get().getResources().getString(stringId);
}
public static byte[] toBytes(String bits) {
int y = bits.length() % 8;
Log.e("Deck",bits.length()+"之前余数"+y);
if (y != 0)
bits = toNumLengthLast(bits, bits.length()+8 - y);
Log.e("Deck",bits.length()+"余数"+y);
byte[] bytes=new byte[bits.length()/8];
for (int i=0;i<bits.length()/8;i++) {
bytes[i] = (byte) Integer.valueOf(bits.substring(i * 8, i * 8 + 8), 2).intValue();
if (i<8){
Log.e("Deck",bits.substring(i*8,i*8+8)+" 字节 "+bytes[i] );
}
}
Log.e("Deck","二进制"+bits );
return bytes;
}
public static String toNumLength(String message, int num) {
while (message.length() < num) {
message = "0" + message;
}
return message;
}
public static String toNumLengthLast(String message, int num) {
while (message.length() < num) {
message +="0";
}
return message;
}
public static String[] toNumLength(String[] nums, int num) {
if (nums.length < num) {
String[] bms = nums;
nums = new String[num];
for (int i = 0; i < num - bms.length; i++)
nums[i] = "0";
for (int i = 0; i < bms.length; i++)
nums[i + num - bms.length] = bms[i];
}
return nums;
}
/**
* 根据卡密获取高清图下载地址
*
......@@ -92,15 +47,6 @@ public class YGOUtil {
return "https://cdn02.moecube.com:444/ygomobile-images/" + code + ".png";
}
public static String getArrayString(String[] bytes, int start, int end) {
String message = "";
for (int i = start; i < end; i++) {
message += bytes[i];
}
return message;
}
//关闭输入法
public static void closeKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
......
package com.ourygo.assistant.base.listener;
public interface OnClipChangedListener {
void onClipChanged(String clipMessge,boolean isCheck,int id);
}
package com.ourygo.assistant.base.listener;
/**
* Create By feihua On 2021/9/29
*/
public interface OnDeRoomListener {
void onDeRoom(String host,int port,String password,String exception);
}
package com.ourygo.assistant.base.listener;
public interface OnDuelAssistantListener {
void onJoinRoom(String host,int port,String password,int id);
void onCardSearch(String key,int id);
void onSaveDeck(String message,boolean isUrl,int id);
boolean isListenerEffective();
}
\ No newline at end of file
package com.ourygo.assistant.util;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.text.TextUtils;
import com.ourygo.assistant.base.listener.OnClipChangedListener;
import java.io.IOException;
import cn.garymb.ygomobile.utils.FileLogUtil;
public class ClipManagement implements ClipboardManager.OnPrimaryClipChangedListener {
public static final int ID_CLIP_LISTENER = -1;
private static final ClipManagement ourInstance = new ClipManagement();
private ClipboardManager clipboardManager;
private OnClipChangedListener onClipChangedListener;
private ClipManagement() {
}
public static ClipManagement getInstance() {
return ourInstance;
}
public void setOnClipChangedListener(OnClipChangedListener onClipChangedListener) {
this.onClipChangedListener = onClipChangedListener;
}
public void startClipboardListener(Context context) {
if (clipboardManager == null)
clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboardManager == null)
return;
clipboardManager.addPrimaryClipChangedListener(this);
}
public void removeClipboardListener() {
if (clipboardManager == null)
return;
clipboardManager.removePrimaryClipChangedListener(this);
}
//获取剪贴板内容
public String getClipMessage() {
ClipData clipData = clipboardManager.getPrimaryClip();
if (clipData == null) {
try {
FileLogUtil.writeAndTime("剪贴板为空");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
CharSequence charSequence = clipData.getItemAt(0).getText();
if (charSequence != null)
return charSequence.toString();
return null;
}
public void clear() {
removeClipboardListener();
onClipChangedListener = null;
}
@Override
public void onPrimaryClipChanged() {
final String clipMessage = getClipMessage();
//如果复制的内容为空则不执行下面的代码
if (TextUtils.isEmpty(clipMessage)) {
return;
}
// if (onClipChangedListener != null)
// onClipChangedListener.onClipChanged(clipMessage, false, ID_CLIP_LISTENER);
}
public void onPrimaryClipChanged(boolean isCheck, int id) {
final String clipMessage = getClipMessage();
//如果复制的内容为空则不执行下面的代码
if (TextUtils.isEmpty(clipMessage)) {
return;
}
if (onClipChangedListener != null)
onClipChangedListener.onClipChanged(clipMessage, isCheck, id);
}
}
package com.ourygo.assistant.util;
import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
import com.ourygo.assistant.base.listener.OnClipChangedListener;
import com.ourygo.assistant.base.listener.OnDuelAssistantListener;
import java.util.ArrayList;
import java.util.List;
public class DuelAssistantManagement implements OnClipChangedListener {
private static final DuelAssistantManagement ourInstance = new DuelAssistantManagement();
private Context context;
private List<OnDuelAssistantListener> onDuelAssistantListenerList;
private ClipManagement clipManagement;
//卡查内容
private String cardSearchMessage = "";
private String lastMessage = "";
private DuelAssistantManagement() {
onDuelAssistantListenerList = new ArrayList<>();
}
public static DuelAssistantManagement getInstance() {
return ourInstance;
}
public void init(Context context) {
this.context = context;
//初始化剪贴板监听
initClipListener();
}
public void addDuelAssistantListener(OnDuelAssistantListener onDuelAssistantListener) {
if (!onDuelAssistantListenerList.contains(onDuelAssistantListener))
onDuelAssistantListenerList.add(onDuelAssistantListener);
}
public void removeDuelAssistantListener(OnDuelAssistantListener onDuelAssistantListener) {
onDuelAssistantListenerList.remove(onDuelAssistantListener);
}
public List<OnDuelAssistantListener> getOnDuelAssistantListenerList() {
return onDuelAssistantListenerList;
}
private void initClipListener() {
clipManagement = ClipManagement.getInstance();
clipManagement.startClipboardListener(context);
clipManagement.setOnClipChangedListener(this);
}
public void clear() {
context = null;
lastMessage = "";
cardSearchMessage = "";
onDuelAssistantListenerList.clear();
}
public String getCardSearchMessage() {
return cardSearchMessage;
}
public boolean deckCheck(String message, int id) {
//如果复制的内容是多行作为卡组去判断
if (message.contains("\n")) {
for (String s : Record.DeckTextKey) {
//只要包含其中一个关键字就视为卡组
if (message.contains(s)) {
onSaveDeck(message, false, id);
return true;
}
}
}
//如果是卡组url
int deckStart = message.indexOf(Record.DECK_URL_PREFIX);
if (deckStart != -1) {
onSaveDeck(message.substring(deckStart + Record.DECK_URL_PREFIX.length()), true, id);
return true;
} else if (message.contains("?" + Record.ARG_YGO_TYPE + "=" + Record.ARG_DECK) || message.contains("&" + Record.ARG_YGO_TYPE + "=" + Record.ARG_DECK)) {
String m1 = "?" + Record.ARG_YGO_TYPE + "=" + Record.ARG_DECK;
String m2 = "&" + Record.ARG_YGO_TYPE + "=" + Record.ARG_DECK;
int s1 = message.indexOf(m1);
if (s1 == -1)
s1 = message.indexOf(m2);
int start = message.lastIndexOf(Record.DECK_URL_PREFIX, s1);
if (start == -1)
start = message.lastIndexOf(Record.HTTP_URL_PREFIX, s1);
if (start == -1)
start = message.lastIndexOf(Record.HTTPS_URL_PREFIX, s1);
if (start != -1)
onSaveDeck(message.substring(start + Record.DECK_URL_PREFIX.length()), true, id);
return true;
}
return false;
}
public boolean roomCheck(String message, int id) {
if (message.contains("?" + Record.ARG_YGO_TYPE + "=" + Record.ARG_ROOM) || message.contains("&" + Record.ARG_YGO_TYPE + "=" + Record.ARG_ROOM)) {
String m1 = "?" + Record.ARG_YGO_TYPE + "=" + Record.ARG_ROOM;
String m2 = "&" + Record.ARG_YGO_TYPE + "=" + Record.ARG_ROOM;
int s1 = message.indexOf(m1);
if (s1 == -1)
s1 = message.indexOf(m2);
int start = message.lastIndexOf(Record.ROOM_URL_PREFIX, s1);
if (start == -1)
start = message.lastIndexOf(Record.HTTP_URL_PREFIX, s1);
if (start == -1)
start = message.lastIndexOf(Record.HTTPS_URL_PREFIX, s1);
onJoinRoom(message.substring(start + Record.DECK_URL_PREFIX.length()), id);
return true;
}
int start = -1;
int end = -1;
String passwordPrefixKey = null;
for (String s : Record.PASSWORD_PREFIX) {
start = message.indexOf(s);
passwordPrefixKey = s;
if (start != -1) {
break;
}
}
if (start != -1) {
//如果密码含有空格,则以空格结尾
end = message.indexOf(" ", start);
//如果不含有空格则取片尾所有
if (end == -1) {
end = message.length();
} else {
//如果只有密码前缀而没有密码内容则不跳转
if (end - start == passwordPrefixKey.length())
return false;
}
onJoinRoom(null, 0, message.substring(start, end), id);
return true;
}
return false;
}
public boolean cardSearchCheck(String message, int id) {
for (String s : Record.CARD_SEARCH_KEY) {
int cardSearchStart = message.indexOf(s);
if (cardSearchStart != -1) {
//卡查内容
cardSearchMessage = message.substring(cardSearchStart + s.length(), message.length());
//如果复制的文本里带?号后面没有内容则不跳转
if (TextUtils.isEmpty(cardSearchMessage)) {
return false;
}
//如果卡查内容包含“=”并且复制的内容包含“.”不卡查(链接判断)
if (cardSearchMessage.contains("=") || message.contains(".")) {
return false;
}
onCardSearch(cardSearchMessage, id);
return true;
}
}
return false;
}
private void onJoinRoom(String roomUrl, int id) {
YGODAUtil.deRoomListener(Uri.parse(roomUrl), (host, port, password, exception) -> {
if (TextUtils.isEmpty(exception)) {
onJoinRoom(host, port, password, id);
}
});
}
private void onJoinRoom(String host, int port, String password, int id) {
int i = 0;
while (i < onDuelAssistantListenerList.size()) {
OnDuelAssistantListener onDuelAssistantListener = onDuelAssistantListenerList.get(i);
if (onDuelAssistantListener.isListenerEffective()) {
onDuelAssistantListener.onJoinRoom(host, port, password, id);
i++;
} else {
onDuelAssistantListenerList.remove(i);
}
}
}
private void onCardSearch(String key, int id) {
int i = 0;
while (i < onDuelAssistantListenerList.size()) {
OnDuelAssistantListener onDuelAssistantListener = onDuelAssistantListenerList.get(i);
if (onDuelAssistantListener.isListenerEffective()) {
onDuelAssistantListener.onCardSearch(key, id);
i++;
} else {
onDuelAssistantListenerList.remove(i);
}
}
}
public void onSaveDeck(String message, boolean isUrl, int id) {
int i = 0;
while (i < onDuelAssistantListenerList.size()) {
OnDuelAssistantListener onDuelAssistantListener = onDuelAssistantListenerList.get(i);
if (onDuelAssistantListener.isListenerEffective()) {
onDuelAssistantListener.onSaveDeck(message, isUrl, id);
i++;
} else {
onDuelAssistantListenerList.remove(i);
}
}
}
@Override
public void onClipChanged(String clipMessage, boolean isCheck, int id) {
if (isCheck)
if (clipMessage.equals(lastMessage))
return;
if (deckCheck(clipMessage, id)) {
lastMessage = clipMessage;
} else if (roomCheck(clipMessage, id)) {
lastMessage = clipMessage;
}
// else if (cardSearchCheck(clipMessage, id))
// lastMessage = clipMessage;
}
public void setLastMessage(String lastMessage) {
this.lastMessage = lastMessage;
}
public void checkClip(int id) {
clipManagement.onPrimaryClipChanged(true, id);
}
}
package com.ourygo.assistant.util;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import androidx.core.app.NotificationManagerCompat;
public class PermissionUtil {
//判断应用是否开启了通知权限
public static boolean isNotificationListenerEnabled(Context context) {
return NotificationManagerCompat.from(context).areNotificationsEnabled();
}
//判断是否有悬浮窗权限
public static boolean isServicePermission(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(context))
return false;
}
return true;
}
}
package com.ourygo.assistant.util;
public class Record {
//卡查关键字
public static final String[] CARD_SEARCH_KEY = new String[]{"?", "?"};
public static final int YGO_ROOM_PROTOCOL_1=1;
//加房关键字
public static final String[] PASSWORD_PREFIX = {
"M,", "m,",
"T,","t,",
"PR,", "pr,",
"AI,", "ai,",
"LF2,", "lf2,",
"M#", "m#",
"T#", "t#",
"PR#", "pr#",
"NS#", "ns#",
"S#", "s#",
"AI#", "ai#",
"LF2#", "lf2#",
"R#", "r#"
};
public static final String ROOM_PREFIX="room:{";
public static final String ROOM_END="}";
//卡组复制
public static final String[] DeckTextKey = new String[]{"#main"};
//卡组url前缀
public static final String DECK_URL_PREFIX = "ygo://deck";
public static final String ROOM_URL_PREFIX = "room://deck";
public static final String HTTP_URL_PREFIX = "http://";
public static final String HTTPS_URL_PREFIX = "https://";
public static final String ARG_PORT = "po";
public static final String ARG_HOST = "h";
public static final String ARG_PASSWORD = "pw";
public static final String ARG_PORT_ALL = "port";
public static final String ARG_HOST_ALL = "host";
public static final String ARG_PASSWORD_ALL = "password";
public static final String ARG_YGO_TYPE="ygotype";
public static final String ARG_DECK="deck";
public static final String ARG_ROOM="room";
}
package com.ourygo.assistant.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* Create By feihua On 2021/9/29
*/
public class UrlUtil {
/**
* URLEncoder编码
*/
public static String enURL(String paramString) {
if (paramString == null || paramString.equals("")) {
return "";
}
try {
String str = new String(paramString.getBytes(), "UTF-8");
str = URLEncoder.encode(str, "UTF-8");
return str;
} catch (Exception localException) {
}
return "";
}
/**
* URLDecoder解码
*/
public static String deURL(String paramString) {
if (paramString == null || paramString.equals("")) {
return "";
}
try {
String url = new String(paramString.getBytes(), "UTF-8");
url = URLDecoder.decode(url, "UTF-8");
return url;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
}
package com.ourygo.assistant.util;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import com.ourygo.assistant.service.DuelAssistantService;
import java.util.List;
public class Util {
public static boolean startDuelService(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (PermissionUtil.isNotificationListenerEnabled(context))
context.startForegroundService(new Intent(context, DuelAssistantService.class));
else
return false;
} else {
context.startService(new Intent(context, DuelAssistantService.class));
}
}
return true;
}
public static Intent getNotificationPermissionInitent(Context context){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
return intent;
}
public static Intent getServicePermissionIntent(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+context.getPackageName()));
}
return null;
}
public static void duelIntent(Context context, String ip, int port, String name, String password) {
Intent intent1 = new Intent("ygomobile.intent.action.GAME");
intent1.putExtra("host", ip);
intent1.putExtra("port", port);
intent1.putExtra("user", name);
intent1.putExtra("room", password);
//intent1.setPackage("cn.garymb.ygomobile");
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
public static boolean isServiceExisted(Context context, String className) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> serviceList = activityManager
.getRunningServices(Integer.MAX_VALUE);
if (!(serviceList.size() > 0)) {
return false;
}
for (int i = 0; i < serviceList.size(); i++) {
ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
ComponentName serviceName = serviceInfo.service;
if (serviceName.getClassName().equals(className)) {
return true;
}
}
return false;
}
public static boolean isContextExisted(Context context) {
if (context != null) {
if (context instanceof Activity) {
if (!((Activity)context).isFinishing()) {
return true;
}
} else if (context instanceof Service) {
if (isServiceExisted(context, context.getClass().getName())) {
return true;
}
} else if (context instanceof Application) {
return true;
}
}
return false;
}
}
package com.ourygo.assistant.util;
import static cn.garymb.ygomobile.Constants.QUERY_VERSION;
import static cn.garymb.ygomobile.Constants.QUERY_YGO_TYPE;
import android.net.Uri;
import com.ourygo.assistant.base.listener.OnDeRoomListener;
/**
* Create By feihua On 2021/9/29
*/
public class YGODAUtil {
public static void deRoomListener(Uri uri, OnDeRoomListener onDeRoomListener){
String host = "", password = "";
int port = 0;
int version = Record.YGO_ROOM_PROTOCOL_1;
try {
String ygoType = uri.getQueryParameter(QUERY_YGO_TYPE);
if (ygoType.equals(Record.ARG_ROOM)) {
version = Integer.parseInt(uri.getQueryParameter(QUERY_VERSION));
}
} catch (Exception exception) {
onDeRoomListener.onDeRoom(null,-1,null,"非加房协议");
}
switch (version) {
case Record.YGO_ROOM_PROTOCOL_1:
try {
host = UrlUtil.deURL(uri.getQueryParameter(Record.ARG_HOST));
} catch (Exception ignored) {
}
try {
port = Integer.parseInt(UrlUtil.deURL(uri.getQueryParameter(Record.ARG_PORT)));
} catch (Exception ignored) {
}
try {
password = UrlUtil.deURL(uri.getQueryParameter(Record.ARG_PASSWORD));
} catch (Exception ignored) {
}
break;
}
onDeRoomListener.onDeRoom(host,port,password,null);
}
}
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