Commit af90136a authored by feihuaduo's avatar feihuaduo

适配da协议的加房1.0协议

parent 05e41da5
......@@ -66,6 +66,17 @@
android:host="deck"
android:scheme="ygo" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="room"
android:scheme="ygo" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
......
......@@ -201,9 +201,10 @@ public interface Constants {
String PATH_DECK = "/deck";
String SCHEME_HTTP = "http";
String SCHEME_HTTPS = "https";
String SCHEME_APP = "ygo";
String URI_HOST = "deck";
String SCHEME_APP = "http";
String URI_HOST = "deck.ourygo.top";
String URI_DECK = "deck";
String URI_ROOM = "room";
String QUERY_YDK = "ydk";
String QUERY_NAME = "name";
......
package cn.garymb.ygomobile;
import static cn.garymb.ygomobile.Constants.ACTION_OPEN_DECK;
import static cn.garymb.ygomobile.Constants.ACTION_OPEN_GAME;
import static cn.garymb.ygomobile.Constants.CORE_REPLAY_PATH;
import static cn.garymb.ygomobile.Constants.CORE_SINGLE_PATH;
import static cn.garymb.ygomobile.Constants.QUERY_NAME;
import static cn.garymb.ygomobile.Constants.REQUEST_SETTINGS_CODE;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import androidx.documentfile.provider.DocumentFile;
import com.ourygo.assistant.base.listener.OnDeRoomListener;
import com.ourygo.assistant.util.YGODAUtil;
import java.io.File;
import java.io.FileInputStream;
......@@ -25,18 +29,13 @@ import cn.garymb.ygodata.YGOGameOptions;
import cn.garymb.ygomobile.bean.Deck;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.cards.DeckManagerActivity;
import cn.garymb.ygomobile.ui.home.MainActivity;
import cn.garymb.ygomobile.ui.preference.SettingsActivity;
import cn.garymb.ygomobile.utils.FileUtils;
import cn.garymb.ygomobile.utils.IOUtils;
import cn.garymb.ygomobile.utils.YGOUtil;
import ocgcore.DataManager;
import static cn.garymb.ygomobile.Constants.ACTION_OPEN_DECK;
import static cn.garymb.ygomobile.Constants.ACTION_OPEN_GAME;
import static cn.garymb.ygomobile.Constants.CORE_REPLAY_PATH;
import static cn.garymb.ygomobile.Constants.CORE_SINGLE_PATH;
import static cn.garymb.ygomobile.Constants.QUERY_NAME;
import static cn.garymb.ygomobile.Constants.REQUEST_SETTINGS_CODE;
public class GameUriManager {
private Activity activity;
......@@ -167,7 +166,7 @@ public class GameUriManager {
local = new File(AppsSettings.get().getResourcePath() + "/temp", name);
}
if (local.exists()) {
Log.w(Constants.TAG, "Overwrite file "+local.getAbsolutePath());
Log.w(Constants.TAG, "Overwrite file " + local.getAbsolutePath());
}
if (remoteFile != null && TextUtils.equals(remoteFile.getAbsolutePath(), local.getAbsolutePath())) {
//is same path
......@@ -248,6 +247,16 @@ public class GameUriManager {
File file = deckInfo.saveTemp(AppsSettings.get().getDeckDir());
DeckManagerActivity.start(activity, file.getAbsolutePath());
}
} else if (Constants.URI_ROOM.equals(host)) {
YGODAUtil.deRoomListener(uri, (host1, port, password, exception) -> {
if (TextUtils.isEmpty(exception))
if (activity instanceof MainActivity) {
MainActivity mainActivity = (MainActivity) activity;
mainActivity.quickjoinRoom(host1, port, password);
} else {
YGOUtil.show(exception);
}
});
}
// else if (PATH_ROOM.equals(path)) {
// try {
......
......@@ -39,8 +39,8 @@ public class Deck implements Parcelable {
return new Deck[size];
}
};
private static final int YGO_PROTOCOL_0 = 0;
private static final int YGO_PROTOCOL_1 = 1;
private static final int YGO_DECK_PROTOCOL_0 = 0;
private static final int YGO_DECK_PROTOCOL_1 = 1;
private static final String CARD_DIVIDE_ID = "_";
private static final String CARD_DIVIDE_NUM = "*";
......@@ -58,8 +58,7 @@ public class Deck implements Parcelable {
public Deck(String name, Uri uri) {
this(name);
Log.e("DeckUU", "Uri:" + uri);
int version = YGO_PROTOCOL_0;
int version = YGO_DECK_PROTOCOL_0;
try {
String ygoType = uri.getQueryParameter(QUERY_YGO_TYPE);
......@@ -67,7 +66,7 @@ public class Deck implements Parcelable {
version = Integer.parseInt(uri.getQueryParameter(QUERY_VERSION));
}
} catch (Exception exception) {
version = YGO_PROTOCOL_0;
version = YGO_DECK_PROTOCOL_0;
}
String main = null, extra = null, side = null;
......@@ -75,81 +74,53 @@ public class Deck implements Parcelable {
List<String> eList = new ArrayList<>();
List<String> sList = new ArrayList<>();
String[] mains, extras, sides;
switch (version) {
case YGO_PROTOCOL_0:
try {
case YGO_DECK_PROTOCOL_0:
main = uri.getQueryParameter(QUERY_MAIN_ALL);
String[] mains = main.split(CARD_DIVIDE_ID);
extra = uri.getQueryParameter(QUERY_EXTRA_ALL);
side = uri.getQueryParameter(QUERY_SIDE_ALL);
mains = main.split(CARD_DIVIDE_ID);
mList.addAll(Arrays.asList(mains));
} catch (Exception ignored) {
}
try {
extra = uri.getQueryParameter(QUERY_EXTRA_ALL);
String[] extras = extra.split(CARD_DIVIDE_ID);
extras = extra.split(CARD_DIVIDE_ID);
eList.addAll(Arrays.asList(extras));
} catch (Exception ignored) {
}
try {
side = uri.getQueryParameter(QUERY_SIDE_ALL);
String[] sides = side.split(CARD_DIVIDE_ID);
sides = side.split(CARD_DIVIDE_ID);
sList.addAll(Arrays.asList(sides));
} catch (Exception ignored) {
}
break;
case YGO_PROTOCOL_1:
try {
case YGO_DECK_PROTOCOL_1:
main = uri.getQueryParameter(QUERY_MAIN);
extra = uri.getQueryParameter(QUERY_EXTRA);
side = uri.getQueryParameter(QUERY_SIDE);
for (int i = 0; i < main.length() / 6; i++)
mList.add(main.substring(i * 6, i * 6 + 6));
} catch (Exception e) {
}
try {
extra = uri.getQueryParameter(QUERY_EXTRA);
for (int i = 0; i < extra.length() / 6; i++)
eList.add(extra.substring(i * 6, i * 6 + 6));
} catch (Exception e) {
}
try {
side = uri.getQueryParameter(QUERY_SIDE);
for (int i = 0; i < side.length() / 6; i++)
sList.add(side.substring(i * 6, i * 6 + 6));
} catch (Exception e) {
}
break;
default:
try {
main = uri.getQueryParameter(QUERY_MAIN_ALL);
String[] mains = main.split(CARD_DIVIDE_ID);
extra = uri.getQueryParameter(QUERY_EXTRA_ALL);
side = uri.getQueryParameter(QUERY_SIDE_ALL);
mains = main.split(CARD_DIVIDE_ID);
mList.addAll(Arrays.asList(mains));
} catch (Exception ignored) {
}
try {
extra = uri.getQueryParameter(QUERY_EXTRA_ALL);
String[] extras = extra.split(CARD_DIVIDE_ID);
extras = extra.split(CARD_DIVIDE_ID);
eList.addAll(Arrays.asList(extras));
} catch (Exception ignored) {
}
try {
side = uri.getQueryParameter(QUERY_SIDE_ALL);
String[] sides = side.split(CARD_DIVIDE_ID);
sides = side.split(CARD_DIVIDE_ID);
sList.addAll(Arrays.asList(sides));
} catch (Exception ignored) {
}
}
for (String m : mList) {
Log.e("DeckUU", "Main:" + m);
int[] idNum = toIdAndNum(m, version);
if (idNum[0] > 0) {
for (int i = 0; i < idNum[1]; i++) {
......@@ -206,10 +177,10 @@ public class Deck implements Parcelable {
int[] idNum;
switch (protocol) {
case YGO_PROTOCOL_0:
case YGO_DECK_PROTOCOL_0:
idNum = toIdAndNum0(m);
break;
case YGO_PROTOCOL_1:
case YGO_DECK_PROTOCOL_1:
idNum = toIdAndNum1(m);
break;
default:
......@@ -222,7 +193,7 @@ public class Deck implements Parcelable {
private int[] toIdAndNum1(String m) {
//元素0为卡密,元素1为卡片数量
int[] idNum = {0, 1};
idNum[0] = toId(m.substring(0, m.length() - 1),YGO_PROTOCOL_1);
idNum[0] = toId(m.substring(0, m.length() - 1), YGO_DECK_PROTOCOL_1);
idNum[1] = Integer.parseInt(m.substring(m.length() - 1));
return idNum;
}
......@@ -236,9 +207,9 @@ public class Deck implements Parcelable {
} catch (Exception e) {
}
idNum[0] = toId(m.substring(0, m.length() - 2),YGO_PROTOCOL_0);
idNum[0] = toId(m.substring(0, m.length() - 2), YGO_DECK_PROTOCOL_0);
} else {
idNum[0] = toId(m,YGO_PROTOCOL_0);
idNum[0] = toId(m, YGO_DECK_PROTOCOL_0);
}
return idNum;
}
......@@ -385,9 +356,9 @@ public class Deck implements Parcelable {
if (TextUtils.isEmpty(str)) return 0;
try {
switch (version) {
case YGO_PROTOCOL_0:
case YGO_DECK_PROTOCOL_0:
return Integer.parseInt(str);
case YGO_PROTOCOL_1:
case YGO_DECK_PROTOCOL_1:
//如果需要返回40进制码:
return unId(str);
default:
......
......@@ -195,7 +195,7 @@ public abstract class HomeActivity extends BaseActivity implements NavigationVie
@Override
public void onJoinRoom(String host,int port,String password, int id) {
if (id == ID_MAINACTIVITY) {
QuickjoinRoom(host,port,password);
quickjoinRoom(host,port,password);
}
}
......@@ -617,16 +617,16 @@ public abstract class HomeActivity extends BaseActivity implements NavigationVie
});
}
private void QuickjoinRoom(String host,int port,String password) {
public void quickjoinRoom(String host,int port,String password) {
String message;
if (!TextUtils.isEmpty(host))
message = getString(R.string.quick_join)
+ "IP:" + host
+ "端口:" + port
+ "密码:" + password;
+ "\nIP:" + host
+ "\n端口:" + port
+ "\n密码:" + password;
else
message = getString(R.string.quick_join) + "\"" + password + "\"";
message = getString(R.string.quick_join) + "\"" + password + "\"";
DialogPlus dialog = new DialogPlus(this);
dialog.setTitle(R.string.question);
......
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);
}
......@@ -248,9 +248,9 @@ public class DuelAssistantService extends Service implements OnDuelAssistantList
String message;
if (!TextUtils.isEmpty(host))
message = getString(R.string.quick_join)
+ "IP:" + host
+ "端口:" + port
+ "密码:" + password;
+ "\nIP:" + host
+ "\n端口:" + port
+ "\n密码:" + password;
else
message = getString(R.string.quick_join) + "\"" + password + "\"";
tv_message.setText(message);
......
......@@ -2,14 +2,13 @@ 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.OnDeRoomListener;
import com.ourygo.assistant.base.listener.OnDuelAssistantListener;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
......@@ -91,11 +90,12 @@ public class DuelAssistantManagement implements OnClipChangedListener {
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);
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;
}
......@@ -103,47 +103,20 @@ public class DuelAssistantManagement implements OnClipChangedListener {
}
public boolean roomCheck(String message, int id) {
int start = -1;
int end = -1;
start = message.indexOf(Record.ROOM_PREFIX);
if (start != -1) {
end = message.indexOf(Record.ROOM_END, start);
if (end != -1) {
message = message.substring(start, end);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(message);
onJoinRoom(jsonObject.getString(Record.ARG_HOST), jsonObject.getInt(Record.ARG_PORT), jsonObject.getString(Record.ARG_PASSWORD), id);
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
}
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);
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;
}
return false;
......@@ -172,6 +145,14 @@ public class DuelAssistantManagement implements OnClipChangedListener {
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()) {
......
......@@ -6,6 +6,9 @@ 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,",
......@@ -32,12 +35,18 @@ public class Record {
//卡组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 = "port";
public static final String ARG_HOST = "host";
public static final String ARG_PASSWORD = "password";
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="deck";
}
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 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);
}
}
......@@ -153,7 +153,7 @@
<string name="no_share_app">공유할 앱이 없습니다.</string>
<string name="intput_room_name">비밀번호를 입력하세요. (선택 사항)</string>
<string name="join">입장</string>
<string name="quick_join">게임 입장\"</string>
<string name="quick_join">게임 입장</string>
<string name="join_game">게임 입장</string>
<string name="settings_game_sensor_refresh">인터페이스 새로 고침</string>
<string name="label_pendulum">펜듈럼 스케일</string>
......
......@@ -159,7 +159,7 @@
<string name="no_share_app">没有找到分享应用</string>
<string name="intput_room_name">输入密码(可不填)</string>
<string name="join">加入</string>
<string name="quick_join">加入房间\"</string>
<string name="quick_join">加入房间</string>
<string name="join_game">进入游戏</string>
<string name="settings_game_sensor_refresh">摇一摇刷新界面</string>
<string name="label_pendulum">灵摆刻度</string>
......
......@@ -160,7 +160,7 @@
<string name="no_share_app">no find share app</string>
<string name="intput_room_name">Input room name</string>
<string name="join">join</string>
<string name="quick_join">join game\"</string>
<string name="quick_join">join game</string>
<string name="join_game">Join game</string>
<string name="settings_game_sensor_refresh">Sensor Refresh Game</string>
<string name="label_pendulum">Pendulum scale</string>
......
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