Commit 80eade80 authored by fallenstardust's avatar fallenstardust
parents af4262ba 8b05da86
......@@ -162,15 +162,16 @@ public interface Constants {
String ID1 = "[versionname]";
String ID2 = "[download_link]";
String ID3 = "#pre_release_code";
String URL_YGO233_DOWNLOAD_LINK = "https://ygo233.com/download/ygomobile";
String URL_YGO233_ADVANCE = "https://ygo233.com/pre#pre_release_cards";
String URL_YGO233_DATAVER = "https://ygo233.com/pre/dataver";
String URL_YGO233_FILE = "https://ygo233.com/pre/download-ygomobile";
String URL_YGO233_FILE_ALT = "https://ygo233.com/pre/download-ygomobile/alt";
//String URL_YGO233_DOWNLOAD_LINK = "https://ygo233.com/download/ygomobile";
String URL_YGO233_ADVANCE = "";//"https://ygo233.com/pre#pre_release_cards";//关闭233先行卡服务器,但不要删除该字段,许多未调用的遗留代码使用该contant
String URL_YGO233_DATAVER = "https://cdn02.moecube.com:444/ygopro-super-pre/data/version.txt";
String URL_PRE_CARD = "https://cdn02.moecube.com:444/ygopro-super-pre/data/test-release.json";
String URL_YGO233_FILE = "https://cdn02.moecube.com:444/ygopro-super-pre/archive/ygopro-super-pre.ypk";
String URL_YGO233_FILE_ALT = "https://cdn02.moecube.com:444/ygopro-super-pre/archive/ygopro-super-pre.ypk";
String URL_YGO233_BUG_REPORT = "https://ygo233.com/pre#faq";
int PORT_YGO233 = 23333;
String URL_YGO233_1 = "s1.ygo233.com";
String URL_YGO233_2 = "s2.ygo233.com";
int PORT_Mycard_Super_Pre_Server = 888;
String URL_Mycard_Super_Pre_Server = "mygo.superpre.pro";
//String URL_YGO233_2 = "s2.ygo233.com";
String SERVER_FILE = "server_list.xml";
String SHARE_FILE = ".share_deck.png";
......@@ -258,5 +259,5 @@ public interface Constants {
23923758, 69133798, 64583600, 13302026, 57511992, 90583279, 76352503, 77672444, 75311421, 12527118, 27657173, 50699850, 96084564, 86605515, 15464375, 15198996, 78077209, 64475743, 9627468, 62967433, 98462037, 5182107, 67853262, 8085950, 31464658, 8910240, 76823930, 97534104, 36629635, 33099732, 3121655, 39520293, 89974735, 65892310, 99742859, 47132793, 93347961, 30342076, 35026117, 62411811, 8505920, 34904525, 61398234, 97783338, 34771947, 60176682, 96661780, 33055499, 23446369, 50834074, 86239173, 22723778, 59712426, 85106525, 12501230, 58996839, 84384943, 11489642, 47873397, 84262395, 10666000, 47051709, 73046708, 19544412, 46939151, 72323266, 19322865, 45716579, 71101678, 8690387, 44094981, 71089030, 7473735, 33872334, 70366448, 6351147, 33750856, 25577965, 15635751, 42620460, 88124568, 86893702, 49858495, 5916510, 3103067, 38105306, 85758066, 33331231, 9726840, 36114945, 62219643, 9603252, 35098357, 89839552, 77590412, 88617904, 42228966, 86469231, 47077697, 84900597, 1683982, 64104037, 99370594, 61103515, 35705817, 20994205, 57499304, 83888009, 19272658, 56677752, 82661461, 19050066, 55554175, 70551291, 6556909, 43940008, 79339613, 5833312, 32828466, 78217065, 5611760, 31006879, 68490573, 4599182, 30983281, 67378935, 93777634, 30761649, 66156348, 92644052, 39049051, 65433790, 92428405, 28827503, 64211118, 91706817, 27104921, 54878729, 91262474, 26988374, 11020863, 58415502, 76076738, 84813516, 11808215, 47292920, 84797028, 10186633, 46570372, 83575471, 19963185, 46358784, 72843899, 18847598, 45236142, 71620241, 39396763, 75780818, 8025950, 44413654, 70508653, 7903368, 33391067, 70786111, 6180710, 32175429, 79663524, 5068132, 32453837, 68441986, 4836680, 31230289, 67725394, 94113093, 30118701, 62503746, 99991455, 25396150, 62480168, 98875863, 25273572, 61668670, 97053215, 24151924, 50546029, 37930737, 23099524, 59494222, 85888377, 59094601, 85182315, 11587414, 47961342, 73355951, 844056, 36848764, 72233469, 5829717, 31817415, 77202120, 4606229, 30095833, 77189532, 91479482, 34456146, 63013339, 32549749, 31600513, 53754104, 3574681, 39973386, 61322713, 66367984, 54594017, 2752099, 35756798, 61245403, 97639441, 34034150, 60023855, 97417863, 23812568, 60306277, 96795312, 22790910, 26050548, 52445243, 39943352, 65938950, 1259814, 91434602, 38529357, 64927055, 90312154, 37706769, 63101468, 90290572, 26684111, 41406613, 77895328, 3289027, 30284022, 76672730, 3167439, 39552584, 65956182, 66431519, 2526224, 38910263, 65305978, 91703676, 38798785, 64182380, 90681088, 19096726, 45484331, 82489470, 18973184, 44362883, 81767888, 17751597, 44146295, 70534340, 12877076, 58371671, 85766789, 11155484, 47149093, 84544192, 10938846, 49027020, 75416738, 12801833, 48805472, 75294187, 1688285, 48183890, 74577599, 98396890, 51779204, 98173209, 24662957, 50056656, 87451661, 62991792, 25784595, 13179234, 2347656, 48745395, 75730490, 1225009, 37629703, 74018812, 2511, 33407125, 69895264, 5380979, 32785578, 68779682, 5168381, 92107604, 29595202, 31562086, 68957034, 94445733, 66712905, 30430448, 67835547, 20618850, 93229151, 55990317, 92385016, 28373620, 49131917, 15130912, 41525660, 88919365, 14418464, 41802073, 87897777, 13291886, 40680521, 76075139, 49568943, 75952542, 38339996, 65734501, 91222209, 37617348, 64612053, 90000652, 37495766, 63899465, 99984170, 26372118, 62777823, 99162522, 25550531, 52645235, 98049934, 24434049, 51822687, 83827392, 20212491, 56700100, 82105704, 29599813, 55584558, 82983267, 18377261, 54862960, 81260679, 17255673, 44649322, 80044027, 16433136, 43527730, 79912449, 16310544, 42705243, 78199891, 5852388, 31241087, 67745632, 94130731, 30128445, 67523044, 93918159, 29302858, 66401502, 92895501, 29280200, 55688914, 91073013, 28168628, 54562327, 91951471, 27345070, 53330789, 80738884, 26223582, 53618197, 89016236, 15001940, 52495649, 88890658, 15388353, 41773061, 87778106, 14166715, 40551410, 87955518, 23288411, 55272555, 81677154, 18165869, 54550967, 81945676, 17943271, 43338320, 80722024, 16227633, 43215738, 79600447, 15005145, 42493140, 78888899, 15982593, 41371602, 77765207, 4160316, 40155014, 77543769, 3048768, 30432463, 76821171, 2815176, 39210885, 5605529, 42193638, 78598237, 4582942, 31971040, 61496006, 98881700, 34876719, 61374414, 97769122, 23153227, 60158866, 96546575, 23931679, 69436288, 95824983, 22819092, 58203736, 95602345, 21057444, 57541158, 84546257, 20934852, 57329501, 83723605, 19712214, 38082437, 1876841, 64487132, 37260946, 63265554, 90659259, 36148308, 63542003, 99937011, 25926710, 62320425, 98715423, 25209168, 51208877, 97692972, 24087580, 50486289, 97870394, 23965033, 59353647, 86758746, 11962031, 57357130, 84755744, 10140443, 57134592, 83533296, 19027895, 46412900, 22411609, 59805313, 85250352, 11654067, 58143766, 84138874, 11522479, 47921178, 83315222, 10300821, 46804536, 83293635, 19688343, 48784854, 67127799, 20001443, 56495147, 93490856, 29884951, 55273560, 82777208, 28762303, 55151012, 81555617, 53212882, 18940725, 54334420, 80433039, 17827173, 80611581, 16605586, 42090294, 89594399, 15983048, 42377643, 78362751, 14761450, 41255165, 73640163, 44818, 46033517, 72427512, 9822220, 35311929, 72305034, 8700633, 34198387, 71583486, 34072799, 6855503, 60461804, 33250142, 69248256, 96633955, 32138660, 69522668, 95911373, 21915012, 68300121, 94798725, 21293424, 67288539, 93672138, 56465981, 93850690, 29948294, 55343303, 82738008, 28126717, 55521751, 81615450, 17000165, 54408264, 80893872, 17888577, 53286626, 89771220, 16165939, 42560034, 89558743, 15943341, 41348446, 78836195, 14821890, 41215808, 77610503, 4008212, 40493210, 16598965, 43986064, 79371769, 20295753, 56790702, 82184400, 25573115, 51578214, 88962829, 14357527, 50855622, 87240371, 13234975, 40633084, 93612434, 7987191, 20071842, 46123974, 31699677, 77683371, 3078380, 30576089, 66961194, 3355732, 39354437, 66749546, 92133240, 38628859, 65626958, 91011603, 28406301, 64804316, 90299015, 27383719, 53782828, 90176467, 26561172, 52566270, 99054885, 25449584, 52843699, 88232397, 24226942, 51611041, 87116749, 14504454, 50599453, 86993168, 13382806, 49776811, 86271510, 12266229, 48654323, 85059922, 11443677, 48832775, 74936480, 11321089, 47710198, 73104892, 109401, 46593546, 73082255, 9486959, 35871958, 72860663, 8264361, 35659410, 71143015, 7142724, 34536828, 60921537, 7320132, 33814281, 69809989, 96203584, 32692693, 69087397, 95471006, 21570001, 64964750, 90359458, 27753563, 53742162, 99137266, 26631975, 52020510, 99414629, 25419323, 52807032, 28292031, 64797746, 91781484, 27170599, 54564198, 90969892, 26357901, 53442500, 84462118, 10851853, 57946551, 83340560, 19739265, 82128978, 19516687, 45001322, 71406430, 18890039, 44889144, 16312943, 21949879, 58938528, 84332527, 21727231, 57111330, 83610035, 10604644, 56099748, 83488497, 19882096, 46877100, 82361809, 18760514, 45154513, 71549257, 18548966, 44932065, 70427670, 17825378, 43210483, 70204022, 6609736, 42198835, 79582540, 5577149, 52253888, 32975247, 78360952, 4754691, 31259606, 67248304, 4632019, 30037118, 66425726, 3410461, 39915560, 66309175, 92798873, 38192988, 65187687, 91575236, 24070330, 60465049, 97453744, 23848752, 59242457, 96637156, 22125101, 59120809, 95515518, 21903613, 58308221, 84792926, 21887075, 57285770, 83670388, 10065487, 56063182, 83558891, 19942835, 45337544, 82735249, 18720257, 45115956, 81613061, 17008760, 44092304, 70491413, 17885118, 43270827, 79775821, 6763530, 42158279, 79552283, 5941982, 32335697, 78420796, 4825390, 31213049, 7608148, 54656181, 80040886, 26435595, 53923690, 89328238, 52707042, 88106656, 15590355, 41085464, 88083109, 14478717, 72309040, 13256226, 40740224, 76145933, 13533678, 49928686, 75922381, 2311090, 48806195, 75290703, 1295442, 37683547, 74078255, 37961969, 572850, 73956664, 9350312, 36745317, 62133026, 9238125, 35622739, 61011438, 98416533, 34800281, 1855886, 37343995, 63748694, 132308, 36521307, 63526052, 99910751, 35405755, 62803464, 98898163, 35283277, 61681816, 94076521, 20560620, 66569334, 93953933, 29348048, 56733747, 92731385, 28226490, 55610199, 81019803, 28403802, 54498517, 80993256, 27381364, 53776969, 80170678, 16169772, 89058026, 52553471, 15443125, 42431833, 88836438, 14220547, 41619242, 77103950, 14108995, 40597694, 76981308, 13386407, 49370016, 76869711, 2263869, 49658464, 75047173, 1041278, 38436986, 74920585, 1329620, 37313338, 63708033, 197042, 36591747, 63086455, 9070454, 35479109, 84366728, 11765832, 47759571, 73244186, 10632284, 46037983, 73421698, 9416697, 46815301, 8794055, 45792753, 3259760, 71187462, 8571567, 34976176, 70465810, 7459919, 33854624, 60242223, 6637331, 32731036, 69120785, 95515789, 32909498, 68304193, 94392192, 31887806, 67282505, 94670654, 20065259, 66069967, 93454062, 29942771, 56347375, 92332424, 28720123, 55125728, 81519836, 28004531, 54092240, 12061457, 81497285, 27882993, 53270092, 80275707, 16769305, 53154400, 89552119, 15947754, 42932862, 84330567, 11825276, 47219274, 73218989, 10602628, 46057733, 73542331, 9940036, 45935145, 72329844, 8728498, 45112597, 71607202, 7602800, 34090915, 70485614, 7889323, 33878367, 60362066, 6767771, 32152870, 69540484, 95545183, 32939238, 8428836, 34813545, 71817640, 7206349, 34690953, 60095092, 6589707, 33578406, 69973414, 96367119, 32756828, 68250822, 95245571, 21639276, 68038375, 94423983, 20417688, 67906797, 4472318, 40460013, 77855162, 30748475, 76133574, 3137279, 39522887, 65910922, 2405631, 38409239, 65898344, 73478096, 863795, 46261704, 72656408, 5141117, 31149212, 78534861, 4928565, 30327674, 77312273, 3806388, 30291086, 66699781, 3084730, 39078434, 65477143, 92962242, 38356857, 65351555, 91749600, 27134209, 64538914, 90027012, 27012717, 53416326, 99801464, 26259179, 52254878, 99748883, 25137581, 51522296, 88926295, 24915933, 51409648, 87804747, 13298352, 50687050, 86682165, 13076804, 49565413, 85969517, 12954226, 48348921, 85747929, 11132674, 48626373, 74615388, 10019086, 47404795, 73898890, 897409, 46382143, 72776252, 9175957, 35569555, 72554664, 8953369, 34447918, 71832012, 7236721, 34225426, 60619435, 6004133, 33503878, 9597987, 36982581, 72386290, 8775395, 35269904, 61264008, 8653757, 34047456, 60442460, 7436169, 33925864, 60329973, 92714517, 39103226, 65107325, 91592030, 61845881, 97240499, 24634594, 60623203, 96127902, 59900655, 96305350, 22390469, 58884063, 95283172, 21677871, 23512906, 20455229, 57940938, 83334932, 10333641, 56727340, 82112494, 19510093, 45005708, 82090807, 18494511, 45883110, 71277255, 17272964, 44760562, 70155677, 17550376, 43944080, 79933029, 6327734, 42822433, 79210531, 5205146, 31600845, 78098950, 4483598, 31987203, 67972302, 3361010, 30765615, 66150724, 3248469, 39643167, 65037172, 92422871, 38811586, 65815684, 91300233, 28798938, 64193046, 90587641, 27572350, 53971455, 90465153, 22850702, 58858807, 95243515, 21637210, 58036229, 84521924, 20515672, 57900671, 83308376, 10793085, 56787189, 82286798, 19671433, 45065541, 82460246, 18458255, 44843954, 21347668, 57736667, 84121302, 10125011, 56510115, 83008724, 19403423, 46497537, 82886276, 19271881, 45675980, 71164684, 18158393, 44553392, 71948047, 7336745, 43331750, 70825459, 6214163, 43618262, 66736715, 93125329, 29510428, 65914127, 91323605, 92003832, 28497830, 65892585, 91286284, 27275398, 54670997, 90164606, 15845914, 60283232, 97682931, 23076639, 55461744, 92565383, 28954097, 55349196, 81743801, 27132400, 54126514, 80621253, 27015862, 53404966, 89809665, 16893370, 52382379, 89776023, 15171722, 41165831, 88554436, 14959144, 41443249, 77832858, 13836592, 40221691, 76615300, 13014905, 49109013, 76593718, 2992467, 48386462, 75771170, 1769875, 38264974, 74659582, 43227, 821049, 36320744, 62714453, 9709452, 35103106, 62592805, 98986900, 34481518, 61470213, 97864322, 24269961, 63136489, 99531088, 36920182, 62314831, 98319530, 25807544, 61292243, 98696958, 24081957, 61070601, 97474300, 23969415, 50357013, 96352712, 23746827, 59131526, 22024279, 58019984, 85407683, 11802691, 57296396, 84281045, 10780049, 53174748, 89569453, 15967552, 42952160, 88346805, 24454387, 51849482, 87837090, 24232799, 50727844, 86111442, 13510157, 59504256, 86999951, 12397569, 58882608, 85277313, 37442336, 63436931, 653675, 36742774, 85520170, 14513273, 41908872, 77392987, 14391625, 40785230, 72270339, 9674034, 45663742, 12058741, 48452496, 84941194, 11335209, 47330808, 74725513, 10113611, 46518210, 73602965, 9091064, 46485778, 72880377, 9275482, 35263180, 71768839, 8152834, 34541543, 71545247, 7930346, 33325951, 60823690, 6218704, 33202303, 69601012, 95095116, 32480825, 68989420, 95973569, 21368273, 67752972, 94151981, 20145685, 67630394, 93039339, 29423048, 56818742, 92812851, 29301450, 55795155, 82190203, 28189908, 54573517, 81978611, 17462320, 54851325, 80845034, 16240772, 53639887, 89023486, 16528181, 42516299, 88901994, 15306543, 41790641, 78789356, 14283055, 40678060, 77066768, 3461403, 40456412, 76840111, 2339825, 39733924, 75728539, 2116237, 38511382, 74906081, 1490690, 33499794, 60883493, 6278008, 33676146
};
public final String officialExCardPackageName = "ygo233.com-pre-release.ypk";//官方扩展卡包ypk文件的名称
public final String officialExCardPackageName = "ygopro-super-pre.ypk";//官方扩展卡包ypk文件的名称
}
......@@ -4,6 +4,9 @@ import net.kk.xml.annotations.XmlElement;
import java.util.List;
/**
* 将服务器列表写入xml文件时利用的PO类
*/
@XmlElement("servers")
public class ServerList {
@XmlElement("version")
......@@ -20,7 +23,7 @@ public class ServerList {
}
public ServerList(int version, List<ServerInfo> serverInfoList) {
mServerInfoList = serverInfoList;
this.mServerInfoList = serverInfoList;
this.vercode = version;
}
......
package cn.garymb.ygomobile.bean.events;
/**
* 用于EventBus的事件类型。
*/
public class CardInfoEvent {
public int position;
public boolean toMain;
......
package cn.garymb.ygomobile.bean.events;
/**
* 用于EventBus发布的时间类型。
* 用于EventBus的事件类型。
*/
public class ExCardEvent {
public enum EventType {
......
package cn.garymb.ygomobile.bean.events;
import cn.garymb.ygomobile.bean.ServerInfo;
/**
* 用于EventBus的事件类型。
*/
public class ServerInfoEvent {
public int position;
public ServerInfo serverInfo;//为了让接受event的HomeFragment能获取到当前server的端口号等信息,加入该属性
......
......@@ -6,7 +6,7 @@ import android.os.Parcelable;
/*
This class contains two types of card information:ex-card information and updating log, which is marked
by "type 0" and "type 1", respectively.
本类包括两种卡牌信息,先行卡信息和更新日志(分别由·type 0和type 1表示)。
本类包括两种卡牌信息,先行卡信息和更新日志(分别由·type 0和type 1表示)。
*/
public class ExCard implements Parcelable {
private String name;
......
......@@ -9,6 +9,7 @@ import com.google.android.material.tabs.TabLayout;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.activities.BaseActivity;
import cn.garymb.ygomobile.utils.LogUtil;
import cn.garymb.ygomobile.utils.YGOUtil;
public class ExCardActivity extends BaseActivity {
private static final String TAG = String.valueOf(ExCardActivity.class);
......@@ -21,7 +22,7 @@ public class ExCardActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ex_card);
viewPager = findViewById(R.id.viewPager);
viewPager.setOffscreenPageLimit(2);
viewPager.setOffscreenPageLimit(1);
tabLayout = findViewById(R.id.packagetablayout);
createTabFragment();
......@@ -47,4 +48,20 @@ public class ExCardActivity extends BaseActivity {
return true;
}
private int backCounter = 0;
//todo 当未下载完先行卡就退出页面时,会导致软件错误退出。未来通过监听返回事件,判断下载状态,若正在下载则阻拦返回键。
//若发生错误或已完成,则不阻拦返回。
@Override
public void onBackPressed() {
if (ExCardListFragment.downloadState == ExCardListFragment.DownloadState.DOWNLOAD_ING) {
if (backCounter < 1) {
backCounter++;
YGOUtil.showTextToast("下载中,建议不要退出页面,再次按返回键可以退出页面");
return;
}
}
super.onBackPressed();
}
}
package cn.garymb.ygomobile.ex_card;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class ExCardData {
@SerializedName("id")
@Expose
private Long id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("desc")
@Expose
private String desc;
@SerializedName("overallString")
@Expose
private String overallString;
@SerializedName("picUrl")
@Expose
private String picUrl;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getOverallString() {
return overallString;
}
public void setOverallString(String overallString) {
this.overallString = overallString;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
}
\ No newline at end of file
package cn.garymb.ygomobile.ex_card;
import static cn.garymb.ygomobile.Constants.URL_PRE_CARD;
import static cn.garymb.ygomobile.utils.StringUtils.mergeListDelimeter;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.widget.ImageView;
import com.bumptech.glide.RequestBuilder;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.List;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.LogUtil;
import cn.garymb.ygomobile.utils.OkhttpUtil;
import cn.garymb.ygomobile.utils.glide.GlideCompat;
import okhttp3.Response;
public class ExCardListAdapter extends BaseQuickAdapter<ExCard, BaseViewHolder> {
public class ExCardListAdapter extends BaseQuickAdapter<ExCardData, BaseViewHolder> {
private static final String TAG = ExCardListAdapter.class.getSimpleName();
private ImageLoader imageLoader;
......@@ -34,34 +38,32 @@ public class ExCardListAdapter extends BaseQuickAdapter<ExCard, BaseViewHolder>
public void loadData() {
final DialogPlus dialog_read_ex = DialogPlus.show(getContext(), null, getContext().getString(R.string.fetch_ex_card));
VUiKit.defer().when(() -> {
//Connect to the website
Document document = Jsoup.connect(Constants.URL_YGO233_ADVANCE).get();
Element pre_card_content = document.getElementById("pre_release_cards");
Element tbody = pre_card_content.getElementsByTag("tbody").get(0);
Elements cards = tbody.getElementsByTag("tr");
if (cards.size() > 5000) {//Considering the efficiency of html parse, if the size of
// pre cards list is to large, return null directly.
return null;
}
ArrayList<ExCard> exCardList = new ArrayList<>();
for (Element card : cards) {
Elements card_attributes = card.getElementsByTag("td");
String imageUrl = card_attributes.get(0).getElementsByTag("a").attr("href") + "!half";
String name = card_attributes.get(1).text();
String description = card_attributes.get(2).text();
ExCard exCard = new ExCard(name, imageUrl, description, 0);
exCardList.add(exCard);
LogUtil.d(TAG, "start fetch");
List<ExCardData> exCardDataList = null;
try {
Response response = OkhttpUtil.synchronousGet(URL_PRE_CARD, null, null);
String responseBodyString = response.body().string();
Type listType = new TypeToken<List<ExCardData>>() {
}.getType();
Gson gson = new Gson();
// Convert JSON to Java object using Gson
exCardDataList = gson.fromJson(responseBodyString, listType);
}
} catch (IOException e) {
Log.e(TAG, "Error occured when fetching data from pre-card server");
return null;
}
if (exCardList.isEmpty()) {
if (exCardDataList.isEmpty()) {
return null;
} else {
return exCardList;
return exCardDataList;
}
}).fail((e) -> {
})
.fail((e) -> {
//关闭异常
if (dialog_read_ex.isShowing()) {
try {
......@@ -71,13 +73,14 @@ public class ExCardListAdapter extends BaseQuickAdapter<ExCard, BaseViewHolder>
}
LogUtil.i(TAG, "webCrawler fail");
}).done(exCardList -> {
})
.done((exCardDataList) -> {
if (exCardList != null) {
if (exCardDataList != null) {
LogUtil.i(TAG, "webCrawler done");
getData().clear();
addData(exCardList);
addData(exCardDataList);
notifyDataSetChanged();
}
if (dialog_read_ex.isShowing()) {
......@@ -87,25 +90,32 @@ public class ExCardListAdapter extends BaseQuickAdapter<ExCard, BaseViewHolder>
}
}
});
}
private static Boolean isMonster(List<String> list) {
for (String data : list) {
if (data.equals("怪兽")) {
return true;
}
}
return false;
}
@Override
protected void convert(BaseViewHolder helper, ExCard item) {
protected void convert(BaseViewHolder helper, ExCardData item) {
helper.setText(R.id.ex_card_name, item.getName());
helper.setText(R.id.ex_card_description, item.getDescription());
helper.setText(R.id.ex_card_description, item.getDesc());
helper.setText(R.id.ex_card_overall,item.getOverallString());
if (item.isUpdatingLog()) {
helper.setGone(R.id.ex_card_image, true);
} else {
helper.setGone(R.id.ex_card_image, false);
ImageView imageview = helper.getView(R.id.ex_card_image);
//the function cn.garymb.ygomobile.loader.ImageLoader.bindT(...)
//cn.garymb.ygomobile.loader.ImageLoader.setDefaults(...)
//is a private function,so I copied the content of it to here
RequestBuilder<Drawable> resource = GlideCompat.with(imageview.getContext()).load(item.getImageUrl());
RequestBuilder<Drawable> resource = GlideCompat.with(imageview.getContext()).load(item.getPicUrl());
resource.placeholder(R.drawable.unknown);
resource.error(R.drawable.unknown);
resource.into(imageview);
}
}
}
package cn.garymb.ygomobile.ex_card;
import static cn.garymb.ygomobile.Constants.URL_YGO233_ADVANCE;
import static cn.garymb.ygomobile.Constants.URL_YGO233_FILE;
import static cn.garymb.ygomobile.Constants.URL_YGO233_FILE_ALT;
import static cn.garymb.ygomobile.utils.DownloadUtil.TYPE_DOWNLOAD_EXCEPTION;
......@@ -17,7 +16,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
......@@ -31,27 +29,25 @@ import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.bean.events.ExCardEvent;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.activities.WebActivity;
import cn.garymb.ygomobile.ui.home.MainActivity;
import cn.garymb.ygomobile.utils.DownloadUtil;
import cn.garymb.ygomobile.utils.FileUtils;
import cn.garymb.ygomobile.utils.LogUtil;
import cn.garymb.ygomobile.utils.ServerUtil;
import cn.garymb.ygomobile.utils.SharedPreferenceUtil;
import cn.garymb.ygomobile.utils.UnzipUtils;
import cn.garymb.ygomobile.utils.YGOUtil;
import ocgcore.DataManager;
public class ExCardListFragment extends Fragment implements View.OnClickListener {
public class ExCardListFragment extends Fragment {
private static final String TAG = String.valueOf(ExCardListFragment.class);
private Context context;
private View layoutView;
private ExCardListAdapter mExCardListAdapter;
private RecyclerView mExCardListView;
private LinearLayout ll_Download;
private TextView textDownload;
private int FailedCount;
......@@ -65,7 +61,7 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
NO_DOWNLOAD
}
private DownloadState downloadState;
public static DownloadState downloadState;
@Override
......@@ -99,26 +95,24 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
mExCardListView.setLayoutManager(linearLayoutManager);
mExCardListView.setAdapter(mExCardListAdapter);
mExCardListAdapter.loadData();
textDownload = layoutView.findViewById(R.id.text_download_prerelease);
ll_Download = layoutView.findViewById(R.id.btn_download_prerelease);
ll_Download.setOnClickListener(this);
changeDownloadText();
}
textDownload = layoutView.findViewById(R.id.text_download_precard);
LinearLayout clickLayout = layoutView.findViewById(R.id.layout_download_precard);
clickLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_download_prerelease:
LogUtil.i(TAG, "start download");
if (downloadState != DownloadState.DOWNLOAD_ING) {
downloadState = DownloadState.DOWNLOAD_ING;
downloadfromWeb(URL_YGO233_FILE);
}
break;
}
});
changeDownloadText();
}
/**
* 根据先行卡包状态改变按钮样式
*/
......@@ -129,15 +123,16 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
} else if (ServerUtil.exCardState == ServerUtil.ExCardState.NEED_UPDATE) {
textDownload.setText(R.string.Download);
} else if (ServerUtil.exCardState == ServerUtil.ExCardState.ERROR) {
Toast.makeText(getActivity(), R.string.ex_card_check_toast_message_iii, Toast.LENGTH_LONG).show();
WebActivity.open(getActivity(), getString(R.string.ex_card_list_title), URL_YGO233_ADVANCE);
/* 查询不到版本号时,提示toast */
textDownload.setText(R.string.Download);
YGOUtil.showTextToast("error" + getString(R.string.ex_card_check_toast_message_iii));
//WebActivity.open(getActivity(), getString(R.string.ex_card_list_title), URL_YGO233_ADVANCE);
} else if (ServerUtil.exCardState == ServerUtil.ExCardState.UNCHECKED) {
//do nothing
//状态UNCHECKED仅在app启动后调用哦你Create()之前短暂存在,所以该情况进行处理
//the UNCHECKED state only exists temporarily before the check action, so we need not handle it.
}
}
//TODO eventbus receive event
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
......@@ -150,29 +145,31 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
textDownload.setText(msg.arg1 + "%");
break;
case DownloadUtil.TYPE_DOWNLOAD_EXCEPTION:
downloadState = DownloadState.NO_DOWNLOAD;
++FailedCount;
if (FailedCount <= 2) {
Toast.makeText(getActivity(), R.string.Ask_to_Change_Other_Way, Toast.LENGTH_SHORT).show();
YGOUtil.showTextToast(getString(R.string.Ask_to_Change_Other_Way));
downloadfromWeb(URL_YGO233_FILE_ALT);
}
YGOUtil.showTextToast("error" + msg.obj);
YGOUtil.showTextToast("error:" + getString(R.string.Download_Precard_Failed));
break;
case UnzipUtils.ZIP_READY:
textDownload.setText(R.string.title_use_ex);
break;
case UnzipUtils.ZIP_UNZIP_OK:
// case UnzipUtils.ZIP_READY:
// textDownload.setText(R.string.title_use_ex);
// break;
case DownloadUtil.TYPE_DOWNLOAD_OK:
downloadState = DownloadState.NO_DOWNLOAD;
/* 将先行服务器信息添加到服务器列表中 */
String servername = "";
//todo 改成用安卓的localization机制strings.xml
if (AppsSettings.get().getDataLanguage() == AppsSettings.languageEnum.Chinese.code)
servername = "23333先行服务器";
servername = "萌卡超先行服";
if (AppsSettings.get().getDataLanguage() == AppsSettings.languageEnum.Korean.code)
servername = "YGOPRO ?? ?? ????";
servername = "Mycard Super-pre Server";
if (AppsSettings.get().getDataLanguage() == AppsSettings.languageEnum.English.code)
servername = "Mercury23333 OCG/TCG Pre-release";
servername = "Mycard Super-pre Server";
if (AppsSettings.get().getDataLanguage() == AppsSettings.languageEnum.Spanish.code)
servername = "Mercury23333 OCG/TCG Pre-release";
AddServer(getActivity(), servername, "s1.ygo233.com", 23333, "Knight of Hanoi");
servername = "Mycard Super-pre Server";
AddServer(getActivity(), servername, Constants.URL_Mycard_Super_Pre_Server, Constants.PORT_Mycard_Super_Pre_Server, "Knight of Hanoi");
//changeDownloadButton();在下载完成后,通过EventBus通知下载完成(加入用户点击下载后临时切出本fragment,又在下载完成后切回,通过eventbus能保证按钮样式正确更新
/* 注意,要先更新版本号 */
......@@ -182,8 +179,7 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
DataManager.get().load(true);
Toast.makeText(context, R.string.ypk_installed, Toast.LENGTH_LONG).show();
YGOUtil.showTextToast(getString(R.string.ypk_installed));
LogUtil.i("webCrawler", "Ex-card package is installed");
/* 如果未开启先行卡设置,则跳转到设置页面 */
......@@ -192,26 +188,11 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
Intent startSetting = new Intent(context, MainActivity.class);
startSetting.putExtra("flag", 4);
startActivity(startSetting);
Toast.makeText(context, R.string.ypk_go_setting, Toast.LENGTH_LONG).show();
YGOUtil.showTextToast(getString(R.string.ypk_go_setting));
}
break;
case UnzipUtils.ZIP_UNZIP_EXCEPTION:
Toast.makeText(context, getString(R.string.install_failed_bcos) + msg.obj,
Toast.LENGTH_SHORT).show();
break;
// case HomeFragment.TYPE_GET_DATA_VER_OK:
// WebActivity.exCardVer = msg.obj.toString();
// String oldVer = SharedPreferenceUtil.getExpansionDataVer();
// if (!TextUtils.isEmpty(WebActivity.exCardVer)) {
// if (!WebActivity.exCardVer.equals(oldVer)) {
// //btn_download展示默认视图
// } else {
// btnDownload.setText(R.string.tip_redownload);
// }
// } else {
// showExNew();
// }
}
}
};
......@@ -228,29 +209,22 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
private void downloadfromWeb(String fileUrl) {
textDownload.setText("0%");//点击下载后,距离onDownloading触发要等几秒,这一延迟会造成软件响应慢的错觉,因此在下载函数开始就设置文本
File file = new File(AppsSettings.get().getResourcePath() + "-preRlease.zip");
String path = AppsSettings.get().getExpansionsPath().getAbsolutePath();
String fileName = Constants.officialExCardPackageName;
File file = new File(path + "/" + fileName);
if (file.exists()) {
/* 删除旧的先行卡包 */
FileUtils.deleteFile(file);
SharedPreferenceUtil.setExpansionDataVer(null);//删除先行卡后,更新版本状态
ServerUtil.exCardState = ServerUtil.ExCardState.NEED_UPDATE;
EventBus.getDefault().postSticky(new ExCardEvent(ExCardEvent.EventType.exCardPackageChange));//删除后,通知UI做更新
}
DownloadUtil.get().download(fileUrl, file.getParent(), file.getName(), new DownloadUtil.OnDownloadListener() {
DownloadUtil.get().download(fileUrl, path, fileName, new DownloadUtil.OnDownloadListener() {
@Override
public void onDownloadSuccess(File file) {
downloadState = DownloadState.NO_DOWNLOAD;
Message message = new Message();
message.what = UnzipUtils.ZIP_READY;
try {
File ydks = new File(AppsSettings.get().getDeckDir());
File[] subYdks = ydks.listFiles();
for (File files : subYdks) {
if (files.getName().contains("-") && files.getName().contains(" new cards"))
files.delete();
}
UnzipUtils.upZipSelectFile(file, AppsSettings.get().getResourcePath(), ".ypk");
} catch (Exception e) {
message.what = UnzipUtils.ZIP_UNZIP_EXCEPTION;
} finally {
message.what = UnzipUtils.ZIP_UNZIP_OK;//TODO 不对吧,finally是一定执行,这样即使有exception也会发unzip_ok啊
}
message.what = DownloadUtil.TYPE_DOWNLOAD_OK;
handler.sendMessage(message);
}
......@@ -265,11 +239,11 @@ public class ExCardListFragment extends Fragment implements View.OnClickListener
@Override
public void onDownloadFailed(Exception e) {
//下载失败后删除下载的文件
FileUtils.deleteFile(file);
Message message = new Message();
message.what = TYPE_DOWNLOAD_EXCEPTION;
message.obj = e.toString();
handler.sendMessage(message);
}
});
......
......@@ -12,6 +12,9 @@ import java.util.List;
import cn.garymb.ygomobile.lite.R;
/**
* 旧版本用于展示先行卡更新日志的页面,暂不使用。
*/
public class ExCardLogAdapter extends BaseExpandableListAdapter {
public ExCardLogAdapter(Context context) {
......
......@@ -26,6 +26,9 @@ import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.LogUtil;
/**
* 配合cn.garymb.ygomobile.ex_card.ExCardLogAdapter,实现展示先行卡更新日志的页面,暂不使用。
*/
public class ExCardLogFragment extends Fragment implements View.OnClickListener {
private static final String TAG = String.valueOf(ExCardLogFragment.class);
private Context mContext;
......@@ -92,7 +95,7 @@ public class ExCardLogFragment extends Fragment implements View.OnClickListener
}
}).fail((e) -> {
//ر쳣
//关闭异常
if (dialog_read_ex.isShowing()) {
try {
dialog_read_ex.dismiss();
......@@ -111,7 +114,7 @@ public class ExCardLogFragment extends Fragment implements View.OnClickListener
if (exCardLogList != null) {
LogUtil.i(TAG, "webCrawler parse html complete");
}
//ر쳣
//关闭异常
if (dialog_read_ex.isShowing()) {
try {
dialog_read_ex.dismiss();
......
......@@ -29,15 +29,17 @@ public class ExPackageTabAdapter extends FragmentStatePagerAdapter {
Fragment fragment = null;
if (position == 0) {
fragment = new ExCardListFragment();
} else if (position == 1) {
fragment = new ExCardLogFragment();
}
/* 目前只显示一个tab,未来可能添加其他tab */
// else if (position == 1) {
// fragment = new ExCardLogFragment();
// }
return fragment;
}
@Override
public int getCount() {
return 2;
return 1;
}
@Override
......@@ -46,9 +48,10 @@ public class ExPackageTabAdapter extends FragmentStatePagerAdapter {
if (position == 0) {
title = context.getString(R.string.ex_card_list_title);
} else if (position == 1) {
title = context.getString(R.string.ex_card_log_title);
}
// else if (position == 1) {
// title = context.getString(R.string.ex_card_log_title);
// }
return title;
}
}
......@@ -29,6 +29,7 @@ import ocgcore.enums.LimitType;
* 包括LimitManager、CardManager、LimitList
* LimitList负责判断禁止卡等
* field包括LimitManager、CardManager
* 未封装成单例,使用时要构造实例
*/
public class CardLoader implements ICardSearcher {
private final LimitManager mLimitManager;
......
......@@ -794,15 +794,10 @@ public class HomeFragment extends BaseFragemnt implements OnDuelAssistantListene
// break;
// }
if (ServerUtil.exCardState == ServerUtil.ExCardState.ERROR) {
WebActivity.open(getContext(), getString(R.string.action_download_expansions), Constants.URL_YGO233_ADVANCE);
LogUtil.i(TAG, "cannot connect to ex card server, open webactivity");
} else {
/* using Web crawler to extract the information of pre card */
LogUtil.i(TAG, "connect to ex card http server, open webactivity");
/* 查不到版本号也打开excard安卓原生activity */
Intent exCardIntent = new Intent(getActivity(), ExCardActivity.class);
startActivity(exCardIntent);
}
break;
case R.id.action_help: {
final DialogPlus dialog = new DialogPlus(getContext());
......
......@@ -22,6 +22,7 @@ public class DownloadUtil {
private final OkHttpClient okHttpClient;
public static final int TYPE_DOWNLOAD_EXCEPTION = 1;
public static final int TYPE_DOWNLOAD_ING = 2;
public static final int TYPE_DOWNLOAD_OK = 3;
//暂时关闭
private static final boolean ENABLE_CACHE = false;
private static final Map<String, Call> cache = new HashMap<>();
......@@ -83,8 +84,8 @@ public class DownloadUtil {
@Override
public void onResponse(Call call, Response response) throws IOException {
if(!response.isSuccessful()){
listener.onDownloadFailed(new Exception("error:"+response.code()));
if (!response.isSuccessful()) {
listener.onDownloadFailed(new Exception("error:" + response.code()));
return;
}
String contentLen = response.header("Content-Length");
......@@ -104,10 +105,11 @@ public class DownloadUtil {
try {
is = response.body().byteStream();
long total = response.body().contentLength();
if(contentLength > 0 && total != contentLength){
if (contentLength > 0 && total != contentLength) {
listener.onDownloadFailed(new Exception("file length[" + total + "] < " + contentLen));
} else {
out = new FileOutputStream(file);
/* 入参为false时,向file覆盖写入 */
out = new FileOutputStream(file, false);
long sum = 0;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
......
......@@ -4,6 +4,7 @@ import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
......@@ -197,6 +198,25 @@ public class OkhttpUtil {
client.newCall(request.build()).enqueue(callback);
}
public static Response synchronousGet(String address, Map<String, Object> map, String cookie) throws IOException {
OkHttpClient client = new OkHttpClient();
HttpUrl.Builder httpBuilder = HttpUrl.parse(address).newBuilder();
if (map != null) {
for (Map.Entry<String, Object> param : map.entrySet()) {
httpBuilder.addQueryParameter(param.getKey(), param.getValue().toString());
}
}
Request.Builder request = new Request.Builder()
.url(httpBuilder.build());
Log.e("OkhttpUtil", "为" + httpBuilder.build());
if (!TextUtils.isEmpty(cookie)) {
request.addHeader("cookie", cookie);
}
return client.newCall(request.build()).execute();
}
public static void del(String address, Map<String, Object> map, String cookie, Callback callback) {
OkHttpClient client = new OkHttpClient();
......@@ -292,10 +312,18 @@ public class OkhttpUtil {
if (!TextUtils.isEmpty(cookie)) {
request.addHeader("cookie", cookie);
}
Log.e("OkhttpUtil",json+" 状态 "+ request.build());
Log.e("OkhttpUtil", json + " 状态 " + request.build());
okHttpClient.newCall(request.build()).enqueue(callback);
}
/**
* 将byte[]类型的十六进制数据(不进行解码)转为字符串格式。如,byte[]中存储的值为0xab78,则转换后的字符串的内容为“ab78”,
* byte[]中存储的值为0xb78,则转换后的字符串的内容为“0b78”
* 可用于将byte中的数据不做改变地打印到log中。
*
* @param buf
* @return
*/
public static String parseByte2HexStr(byte[] buf) {
if (null == buf) {
return null;
......
......@@ -4,7 +4,7 @@ import static cn.garymb.ygomobile.Constants.ASSET_SERVER_LIST;
import static cn.garymb.ygomobile.Constants.URL_YGO233_DATAVER;
import static cn.garymb.ygomobile.utils.StringUtils.isHost;
import static cn.garymb.ygomobile.utils.StringUtils.isNumeric;
import static cn.garymb.ygomobile.utils.StringUtils.isValidIP;
import static cn.garymb.ygomobile.utils.WebParseUtil.isValidIP;
import android.content.Context;
import android.text.TextUtils;
......@@ -76,8 +76,13 @@ public class ServerUtil {
public void onResponse(Call call, Response response) throws IOException {
failCounter = 0;//充值计数器
String newVer = response.body().string();
/* 服务器有点怪,返回的版本号带个\n,要去掉 */
if (newVer.endsWith("\n")) {
newVer = newVer.substring(0, newVer.length() - 2);
}
serverExCardVersion = newVer;
LogUtil.i(TAG, "ServerUtil fetch pre-card version:" + newVer);
if (!TextUtils.isEmpty(newVer)) {
......@@ -164,6 +169,32 @@ public class ServerUtil {
}
}
/**
* 读取xmlFile指定的本地文件server_list.xml和apk资源文件(assets)下的serverlist.xml,返回其中版本最新的
*
* @param context
* @param xmlFile 指定的本地文件server_list.xml
* @return
* @throws IOException
*/
private static ServerList mergeServerList(Context context, File xmlFile) throws IOException {
/* 读取apk中assets文件夹下的serverlist.xml文件 */
ServerList assetList = ServerListManager.readList(context.getAssets().open(ASSET_SERVER_LIST));
ServerList fileList = xmlFile.exists() ? ServerListManager.readList(new FileInputStream(xmlFile)) : null;
if (fileList == null) {
return assetList;
}
/* 如果apk下assets中的版本号更大,则返回assets下的server列表 */
if (fileList.getVercode() < assetList.getVercode()) {
xmlFile.delete();
return assetList;
}
return fileList;
}
/**
* 从资源文件serverlist.xml(或本地文件server_list.xml)解析服务器列表,并将新添加的服务器信息(name,addr,port)合并到服务器列表中。
*
......@@ -173,26 +204,21 @@ public class ServerUtil {
* @param playerName
*/
public static void AddServer(Context context, String name, String Addr, int port, String playerName) {
/* 读取本地文件server_list.xml */
File xmlFile = new File(context.getFilesDir(), Constants.SERVER_FILE);//读取文件路径下的server_list.xml
VUiKit.defer().when(() -> {
return mergeServerList(context, xmlFile);
}).done((list) -> {
List<ServerInfo> serverInfos = new ArrayList<>();
ServerInfo mServerInfo = new ServerInfo();
mServerInfo.setName(name);
mServerInfo.setServerAddr(Addr);
mServerInfo.setPort(port);
mServerInfo.setPlayerName(playerName);
VUiKit.defer().when(() -> {
/* 读取本地文件server_list.xml和资源文件(assets)下的serverlist.xml,返回其中版本最新的 */
ServerList assetList = ServerListManager.readList(context.getAssets().open(ASSET_SERVER_LIST));//读取serverlist.xml文件
ServerList fileList = xmlFile.exists() ? ServerListManager.readList(new FileInputStream(xmlFile)) : null;
if (fileList == null) {
return assetList;
}
if (fileList.getVercode() < assetList.getVercode()) {
xmlFile.delete();
return assetList;
}
return fileList;
}).done((list) -> {
boolean hasServer = false;
if (list != null) {
serverInfos.clear();
......@@ -205,7 +231,7 @@ public class ServerUtil {
hasServer = false;
}
}
if (!hasServer && !serverInfos.contains(mServerInfo)) {
if (!hasServer && !serverInfos.contains(mServerInfo)) {//todo serverInfos.contains(mServerInfo)好像没必要
serverInfos.add(mServerInfo);
}
}
......@@ -229,9 +255,7 @@ public class ServerUtil {
}
public static boolean isPreServer(int port, String addr) {
return (port == Constants.PORT_YGO233 && addr.equals(Constants.URL_YGO233_1)) ||
(port == Constants.PORT_YGO233 && addr.equals(Constants.URL_YGO233_2));
return (port == Constants.PORT_Mycard_Super_Pre_Server && addr.equals(Constants.URL_Mycard_Super_Pre_Server));
}
}
......@@ -51,8 +51,8 @@ public class SharedPreferenceUtil {
return getShareRecord().getInt("StartTimes", 0);
}
public static void setExpansionDataVer(String json) {
getShareRecord().edit().putString("ExpansionsDataVer", json).commit();
public static void setExpansionDataVer(String dataVer) {
getShareRecord().edit().putString("ExpansionsDataVer", dataVer).commit();
}
public static String getExpansionDataVer() {
......
......@@ -3,6 +3,7 @@ package cn.garymb.ygomobile.utils;
import android.text.TextUtils;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -82,28 +83,24 @@ public class StringUtils {
return isurl;
}
/**
* 检查字符串是否是IPv4
* 使用分隔符,将List<String>合为一个String
*/
public static boolean isValidIP(String s) {
if (TextUtils.isEmpty(s)) {
return false;
}
String[] arr = s.split("\\.");
if (arr.length != 4) {
return false;
}
for (String value : arr) {
try {
int n = Integer.parseInt(value);
if (!(n >= 0 && n <= 255)) {
return false;
}
} catch (NumberFormatException e) {
return false;
public static String mergeListDelimeter(List<String> list) {
if (list == null || list.isEmpty()) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < list.size() - 1; i++) {
stringBuilder.append(list.get(i));
stringBuilder.append("|");
}
return true;
stringBuilder.append(list.get(list.size() - 1));
return stringBuilder.toString();
}
}
......@@ -16,6 +16,7 @@ public class UnzipUtils {
public static final int ZIP_READY = 600;
public static final int ZIP_UNZIP_OK = 601;
public static final int ZIP_UNZIP_EXCEPTION = 602;
/**
* 解压缩一个文件
*
......@@ -82,7 +83,7 @@ public class UnzipUtils {
if (entry.isDirectory()) {
continue;
}
if (entry.getName().contains(nameContains)) {
if (entry.getName().contains(nameContains)) {//如果zip中包含.ypk格式的文件,则将其放到/storage/emulated/0/Android/data/cn.garymb.ygomobile.CN/files/ygocore目录下
InputStream is = zf.getInputStream(entry);
String str = folderPath + File.separator + entry.getName();
str = new String(str.getBytes("8859_1"), StandardCharsets.UTF_8);
......
package cn.garymb.ygomobile.utils;
import android.text.TextUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.ex_card.ExCard;
/**
* 用于解析html网页内容的工具类
*/
public class WebParseUtil {
/**
* 检查字符串是否是IPv4
*/
public static boolean isValidIP(String s) {
if (TextUtils.isEmpty(s)) {
return false;
}
String[] arr = s.split("\\.");
if (arr.length != 4) {
return false;
}
for (String value : arr) {
try {
int n = Integer.parseInt(value);
if (!(n >= 0 && n <= 255)) {
return false;
}
} catch (NumberFormatException e) {
return false;
}
}
return true;
}
public static List<ExCard> loadData() throws IOException {
//Connect to the website
Document document = Jsoup.connect(Constants.URL_YGO233_ADVANCE).get();
Element pre_card_content = document.getElementById("pre_release_cards");
Element tbody = pre_card_content.getElementsByTag("tbody").get(0);
Elements cards = tbody.getElementsByTag("tr");
if (cards.size() > 5000) {//Considering the efficiency of html parse, if the size of
// pre cards list is to large, return null directly.
return null;
}
ArrayList<ExCard> exCardList = new ArrayList<>();
for (Element card : cards) {
Elements card_attributes = card.getElementsByTag("td");
String imageUrl = card_attributes.get(0).getElementsByTag("a").attr("href") + "!half";
String name = card_attributes.get(1).text();
String description = card_attributes.get(2).text();
ExCard exCard = new ExCard(name, imageUrl, description, 0);
exCardList.add(exCard);
}
if (exCardList.isEmpty()) {
return null;
} else {
return exCardList;
}
}
}
......@@ -14,18 +14,29 @@
android:padding="5dp"
android:scrollbars="vertical" />
<!-- 不知道为啥,android:focusableInTouchMode="true"就导致必须按两次linearylayout才触发点击事件
有帖子说:
一个View的点击事件在第一次点击时无效,第二次点击之后才会响应。
最后发现是因为焦点问题,第一次点击实际上是获取焦点,第二次点击才会响应点击事件。
只要在相关控件属性里面加了两个焦点相关的属性:
android:focusable="true"
android:focusableInTouchMode="false"
版权声明:本文为CSDN博主「qiqiname1989」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiqiname1989/article/details/82177869-->
<LinearLayout
android:id="@+id/btn_download_prerelease"
android:id="@+id/layout_download_precard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginRight="20dp"
android:layout_marginBottom="70dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="100dp"
android:clickable="true"
android:focusableInTouchMode="true"
android:focusableInTouchMode="false"
android:orientation="vertical"
android:padding="10dp">
<Button
android:id="@+id/btn_download_precard"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
......@@ -34,7 +45,7 @@
android:clickable="false" />
<TextView
android:id="@+id/text_download_prerelease"
android:id="@+id/text_download_precard"
android:layout_width="60dp"
android:layout_height="30dp"
android:background="@drawable/ic_radius_bg"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sml="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:background="@drawable/list_item_bg"
android:orientation="horizontal">
android:orientation="horizontal"
android:paddingBottom="10dp">
<!-- set the layout_height in the linear layout to “wrap_content”
so it doesn’t only show one TextView per page.-->
......@@ -14,16 +13,16 @@
android:id="@+id/ex_card_image"
android:layout_width="@dimen/card_width_middle"
android:layout_height="@dimen/card_height_middle"
android:padding="10dp"
android:layout_gravity="center_vertical"
android:paddingRight="2dp"
android:scaleType="fitXY"
tools:src="@drawable/unknown" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="vertical">
android:orientation="vertical"
android:padding="10dp">
<cn.garymb.ygomobile.ui.widget.AlwaysMarqueeTextView
android:id="@+id/ex_card_name"
......@@ -40,12 +39,19 @@
android:textSize="15sp"
tools:text="Card Name" />
<TextView
android:id="@+id/ex_card_overall"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ex_card_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="StringFormatInvalid">
<!--string name="app_name">YGOMobile</string-->
<string name="action_settings">Configuraciones</string>
<string name="action_game">Partida Individual</string>
<string name="action_settings">Configuración</string>
<string name="action_game">Partida individual</string>
<string name="action_about">Acerca de</string>
<string name="action_add_server">Añadir Servidor</string>
<string name="dont_start_game">no se puede iniciar el juego</string>
<string name="action_add_server">Añadir servidor</string>
<string name="dont_start_game">No se puede iniciar el juego</string>
<!-- check -->
<string name="check_res">Consultar recursos</string>
<string name="check_things">Consultar %s ...</string>
<string name="core_config">Configuración Principal</string>
<string name="tip_new_deck">Nuevos Decks</string>
<string name="cards_cdb">cards.cdb</string>
<string name="core_config">Configuración principal</string>
<string name="tip_new_deck">Nuevo deck</string>
<string name="cards_cdb">base de datos</string>
<string name="scripts">scripts</string>
<string name="images">imágenes</string>
<string name="single_lua">archivos individuales</string>
<string name="font_files">archivos de fuentes</string>
<string name="game_sound">archivos de audio</string>
<string name="game_skins">archivos de personalización</string>
<string name="coping_pendulum_image">Imagen del péndulo de afrontamiento</string>
<string name="coping_pendulum_image">Copiar imagen digital de péndulo</string>
<string name="dialog_select_file">Elegir archivo</string>
<string name="dialog_select_image">Elegir imágen</string>
<string name="dialog_select_database">Elegir archivo de base de datos</string>
<string name="copy_databse">copiando base de datos</string>
<string name="copy_databse">Copiar la base de datos</string>
<string name="card_cover">Cubierta de Carta</string>
<string name="game_bg">Fondo del Juego</string>
<string name="bg">Fondo del Duelo</string>
<string name="bg_menu">Fondo del Menú</string>
<string name="bg_deck">Fondo del Deck</string>
<string name="no_find_image_selector">no se encontró el selector de imagen</string>
<string name="no_find_file_selectotr">no se encontró el selector de archivo</string>
<string name="no_find_image_cutor">no se encontró el cortador de imagen</string>
<string name="no_find_image_selector">Selector de imágenes no encontrado</string>
<string name="no_find_file_selectotr">Selector de archivos no encontrado</string>
<string name="no_find_image_cutor">Herramienta de recorte no encontrada</string>
<string name="help">Ayuda</string>
<string name="settings">Configuraciones</string>
<string name="settings">Configuración</string>
<string name="quit">Salir</string>
<string name="quit_tip">¿Salir de la aplicación?</string>
<string name="last_path">Última Carpeta</string>
<string name="create_folder">Nueva Carpeta</string>
<string name="last_path">Última carpeta</string>
<string name="create_folder">Nueva carpeta</string>
<string name="intpu_name">Nombre de entrada</string>
<string name="tab_search">Buscar</string>
<string name="tab_result">Resultado</string>
<string name="tab_manager">Deck</string>
<string name="the_name_is_folder">el nombre de la carpeta</string>
<string name="the_name_is_folder">El nombre de la carpeta</string>
<string name="back_tip">Presione la tecla "Atrás" nuevamente para salir.</string>
<string name="string_help_text">La aplicación actual carece de los permisos necesarios. \n
Haga clic en Configuración - Permisos - Abra los permisos requeridos.</string>
<string name="fetch_ex_card">Obtención de cartas pre-lanzamiento a través de la web</string>
<string name="fetch_ex_card">Obtener cartas pre-lanzamiento a través de Internet</string>
<string name="ex_card_list_title">Lista de cartas</string>
<string name="ex_card_log_title">registro de actualización</string>
<string name="ex_card_log_title">Registro de actualización</string>
<string name="ex_card_report_title">Reporte</string>
<string name="ex_card_check_toast_message">Antes de unirse a este servidor, primero chequee "usar Expansiones" en la configuración</string>
<string name="ex_card_check_toast_message">Antes de unirse a este servidor, primero chequee "Usar Expansiones" en la configuración</string>
<string name="ex_card_check_toast_message_ii">Antes de unirse a este servidor, descargue las expansiones</string>
<string name="ex_card_check_toast_message_iii">Error al obtener la expansión de las cartas, abriendo el sitio web 233 para descargarlas ahora.</string>
<!-- settings -->
......@@ -65,21 +65,21 @@
<string name="donation">Donación</string>
<string name="settings_about_check_update">Comprobar actualizaciones</string>
<string name="settings_about_change_log">Historial de cambios</string>
<string name="settings_game_card_quality">Calidad de la textura de la carta</string>
<string name="settings_game_font_name">Fuente del Juego</string>
<string name="settings_game">Opciones del Juego</string>
<string name="settings_game_res_path">Ruta del Juego</string>
<string name="settings_game_core_version">Versión principal del juego</string>
<string name="settings_category_diy">DIY</string>
<string name="settings_game_diy_cover">Fondo del Juego</string>
<string name="settings_game_diy_card_back">Cubierta de Carta</string>
<string name="settings_game_diy_card_db">Utilice su propia base de datos de cartas</string>
<string name="settings_test_options">Laboratorio</string>
<string name="settings_test_replace_kernel">Cambiar el núcleo del juego (necesita root)</string>
<string name="settings_game_card_quality">Calidad de imagen de las cartas</string>
<string name="settings_game_font_name">Fuente del juego</string>
<string name="settings_game">Opciones del juego</string>
<string name="settings_game_res_path">Ruta del juego</string>
<string name="settings_game_core_version">Versión del núcleo del juego</string>
<string name="settings_category_diy">Personalizar</string>
<string name="settings_game_diy_cover">Fondo del juego</string>
<string name="settings_game_diy_card_back">Cubierta de carta</string>
<string name="settings_game_diy_card_db">Usar base de datos personalizada</string>
<string name="settings_test_options">Opciones Experimentales</string>
<string name="settings_test_replace_kernel">Reemplazar kernel (necesita root)</string>
<string name="settings_game_immersive_mode">Optimizar si su resolución no es 16:9</string>
<string name="settings_game_opengl">OpenGL</string>
<string name="settings_game_avatar">Avatar del Juego</string>
<string name="settings_author" translatable="false">菜菜、暗星</string>
<string name="settings_game_avatar">Ávatar del juego</string>
<string name="settings_author" translatable="false">菜菜、暗星\n浙ICP备2023031884号-2A</string>
<string name="restart_app">"¡Reinicie la aplicación!"</string>
<string-array name="opengl_version">
<item>OpenGL ES 1.X</item>
......@@ -92,7 +92,7 @@
</string-array>
<string-array name="data_language" translatable="false">
<item>Chino</item>
<item>Japonés</item>
<item>Koreano</item>
<item>Inglés</item>
<item>Español</item>
</string-array>
......@@ -109,18 +109,18 @@
<string name="server_name">Nombre:</string>
<string name="server_ip">Anfitrión:</string>
<string name="server_user">Usuario:</string>
<string name="server_room_name">Nombre de la Sala:</string>
<string name="server_room_name">Nombre de la sala:</string>
<string name="server_port">Puerto:</string>
<string name="server_room_pwd">Contraseña:</string>
<string name="server_user_pwd">Contraseña:</string>
<string name="server_info_edit">Editar información del servidor</string>
<string name="save">Guardar</string>
<string name="must_info">debe información</string>
<string name="server_is_exist">el servidor existe</string>
<string name="server_info_error">La información del servidor es incorrecta.</string>
<string name="must_info">Información requerida</string>
<string name="server_is_exist">¡La información del servidor ya existe!</string>
<string name="server_info_error">La información del servidor se completó incorrectamente</string>
<string name="card_search">Búsqueda de cartas</string>
<string name="deck_manager">Deck</string>
<string name="category_manager"> Selección de Deck categorizado</string>
<string name="category_manager">Selección de deck categorizado</string>
<string name="search">Buscar</string>
<string name="search_open">Seleccionar</string>
<string name="search_close">Cerrar</string>
......@@ -140,16 +140,16 @@
<string name="label_category">Categoría</string>
<string name="searching">Buscar Cartas</string>
<string name="card_faq">FAQ</string>
<string name="no_webbrowser">Sin navegador web</string>
<string name="load_game">cargando juego</string>
<string name="no_webbrowser">Ningún navegador web instalado</string>
<string name="load_game">Cargando juego</string>
<string name="new_deck">Nuevo</string>
<string name="move_deck">mover Deck</string>
<string name="copy_deck">copiar Deck</string>
<string name="rename_deck">Renombrar</string>
<string name="delete_deck">Eliminar</string>
<string name="save_deck">Salvar Deck</string>
<string name="save_as_deck">Salvar Deck como</string>
<string name="deck_list">Lista de Decks</string>
<string name="move_deck">Mover deck</string>
<string name="copy_deck">Copiar deck</string>
<string name="rename_deck">Renombrar deck</string>
<string name="delete_deck">Eliminar deck</string>
<string name="save_deck">Salvar deck</string>
<string name="save_as_deck">Salvar deck como</string>
<string name="deck_list">Lista de decks</string>
<string name="card_add_main">+Deck Principal</string>
<string name="card_add_side">+Side Deck</string>
<string name="deck_main" formatted="false">Principal:%d Monstruo:%d Mágica:%d Trampa:%d</string>
......@@ -158,187 +158,188 @@
<string name="card_result">Lista de Cartas</string>
<string name="unsort">Desordenar</string>
<string name="sort">Ordenar</string>
<string name="loading">cargando..."</string>
<string name="loading_failed">carga fallida"</string>
<string name="loading">Cargando...</string>
<string name="loading_failed">Carga fallida</string>
<string name="question">Pregunta</string>
<string name="question_delete_deck">¿eliminar este deck?</string>
<string name="noname">sin nombre</string>
<string name="question_delete_deck">¿Eliminar este deck?</string>
<string name="noname">Sin nombre</string>
<string name="menu">Opciones</string>
<string name="save_tip_ok">guardar deck ok</string>
<string name="save_tip_fail">fallo al guardar deck</string>
<string name="add_card_tip_ok">agregar carta ok</string>
<string name="add_card_tip_fail">fallo al agregar carta</string>
<string name="tip_card_max" formatted="false">recuento máximo de tarjetas:%d</string>
<string name="save_tip_ok">Deck guardado con éxito</string>
<string name="save_tip_fail">Fallo al guardar deck</string>
<string name="add_card_tip_ok">Carta agregada con éxito</string>
<string name="add_card_tip_fail">Fallo al agregar carta</string>
<string name="tip_card_max" formatted="false">Número máximo de cartas:%d</string>
<string name="file_exist">el archivo existe</string>
<string name="share_deck">Compartir Deck</string>
<string name="no_share_app">no se encontro app para compartir</string>
<string name="file_exist">El archivo ya existe</string>
<string name="share_deck">Compartir deck</string>
<string name="no_share_app">No se encontró ninguna app para compartir</string>
<string name="intput_room_name">Nombre de la sala de entrada</string>
<string name="join">unirse</string>
<string name="quick_join">únete al juego</string>
<string name="join">Unirse</string>
<string name="quick_join">Únete al juego</string>
<string name="join_game">Únete al juego</string>
<string name="settings_game_sensor_refresh">Sensor de Actualización del Juego</string>
<string name="label_pendulum">Escala de Péndulo</string>
<string name="all">Todo</string>
<string name="refresh">Actualizar</string>
<string name="select_deck">Haga clic aquí para seleccionar Deck</string>
<string name="select_deck">Tocar aquí para seleccionar Deck</string>
<string name="quit_deck_tip">El deck aún no se ha guardado, ¿desea salir de la aplicación?</string>
<string name="deck_delete_text">Arrastra aquí para eliminar</string>
<string name="question_keep_cur_deck">¿mantener las cartas actuales?</string>
<string name="check_choose_file" formatted="false">Determinar la elección %s \?</string>
<string name="settings_deck_delete_dialog">Eliminar cuadro de diálogo de uso de carta</string>
<string name="settings_deck_delete_dialog_desc">mostrar el cuadro de diálogo de eliminación de cartas en el editor de decks</string>
<string name="delete_card" formatted="false">Eliminar %s ?</string>
<string name="question_keep_cur_deck">¿Mantener las cartas actuales?</string>
<string name="check_choose_file" formatted="false">¿Estás seguro de que deseas seleccionar este %s?</string>
<string name="settings_deck_delete_dialog">Eliminar cuadro de diálogo de cartas</string>
<string name="settings_deck_delete_dialog_desc">Mostrar el cuadro de diálogo de eliminación de cartas en el editor de decks</string>
<string name="delete_card" formatted="false">¿Eliminar carta %s?</string>
<string name="clear_deck">Vaciar</string>
<string name="question_clear_deck">¿vaciar este deck?</string>
<string name="delete_server_info">¿eliminar la información de este servidor?</string>
<string name="question_clear_deck">¿Vaciar este deck?</string>
<string name="delete_server_info">¿Eliminar la información de este servidor?</string>
<string name="exit_edit_mode">Salir del Modo de Edición</string>
<string name="logo_text">Gracias por todo tu apoyo.</string>
<string name="logo_text">¡Gracias por apoyarnos!</string>
<string name="start_game_error">No se pudo unir al juego</string>
<string name="set_font_size">Tamaño de la fuente en el juego</string>
<string name="set_font_size">Tamaño de fuente en el juego</string>
<string name="copy_to_clipbroad">Copiar al portapapeles</string>
<string name="deck_share_head">compartir deck por ygomobile.</string>
<string name="deck_share_fail">falla al compartir deck</string>
<string name="choose_game_path">elige la carpeta del juego</string>
<string name="deck_share_head">Compartir deck por YGOMobile</string>
<string name="deck_share_fail">Fallo al compartir deck</string>
<string name="choose_game_path">Seleccionar directorio del juego</string>
<string name="download_home">Página de NetDisk</string>
<string name="reset_game_res">Restablecer recursos</string>
<string name="downloading_images">Descargando imágenes</string>
<string name="download_image_progress" formatted="false">Descargando imagen de carta %d/%d</string>
<string name="download_image_error" formatted="false">Descarga fallida. Mantenga presionado para volver a intentarlo.</string>
<string name="downloading_images_ok">Imagen descargada corectamente</string>
<string name="tip_istunning">YGOPro se está ejecutando</string>
<string name="download_image_error" formatted="false">Descarga fallida. Mantenga presionado para volver a intentarlo</string>
<string name="downloading_images_ok">Imagen descargada con éxito</string>
<string name="tip_istunning">YGOMobile se está ejecutando</string>
<string name="edit">Editar</string>
<string name="delete">Eliminar</string>
<string name="mycard">MyCard</string>
<string name="arena">Base de datos de duelista</string>
<string name="arena">Base de datos de duelo</string>
<string name="mc_home">Inicio</string>
<string name="mc_chat">Sala de chat</string>
<string name="noting_to_send">tomando nota para enviar</string>
<string name="sending_failed">envío fallido</string>
<string name="logining_in">Iniciando sesión</string>
<string name="noting_to_send">El contenido de envío no puede estar vacío.</string>
<string name="sending_failed">Fallo al enviar</string>
<string name="logining_in">Iniciando sesión...</string>
<string name="logining_failed">Error al iniciar sesión, inténtelo de nuevo</string>
<string name="failed_reason">El inicio de sesión falló debido a</string>
<string name="notice_verify_email">Sólo la cuenta de correo electrónico verificada puede iniciar sesión en la sala de chat.</string>
<string name="send">Enviar</string>
<string name="bbs">Comunidad</string>
<string name="McNews">Noticias</string>
<string name="settings_pref_settings_only_game">Solo empieza el juego</string>
<string name="only_game_tip">restablecer esta configuración, necesita datos limpios de la aplicación</string>
<string name="settings_pref_settings_only_game">Inicia el juego directamente</string>
<string name="only_game_tip">Verifique cuidadosamente y borre los datos de la aplicación o reinstálela para restaurarla</string>
<string name="title_use_ex">Usar Expansiones</string>
<string name="tip_network_image">El servidor de imágenes está cerrado.</string>
<string name="game_version">Versión del Juego</string>
<string name="tip">Información</string>
<string name="error_game_ver">Incorrecto! error de versión del juego "0x1342" (1.034.2)</string>
<string name="tip_no_netwrok">por favor confirmar redes</string>
<string name="message">Copiando datos...</string>
<string name="ex_pack">Extender cartas</string>
<string name="error_game_ver">¡Formato erróneo! Debe comenzar con 0x, como por ejemplo: 0x1342 (muestra 1.034.2)</string>
<string name="tip_no_netwrok">Por favor confirme que está conectado a Internet.</string>
<string name="message">"Copiando paquete de datos..."</string>
<string name="ex_pack">Paquete de cartas de expansión</string>
<string name="deck_manager_v2">Editor de Decks V2</string>
<string name="reset_game_ver_fail">fallo al intentar restablecer la versión del juego</string>
<string name="reset_game_ver_fail">Fallo al intentar restablecer la versión del juego</string>
<string name="deck_name">Deck</string>
<string name="category_name">Categoría del Deck</string>
<string name="category_name">Categoría del deck</string>
<string name="save_quit">Guardar y salir</string>
<string name="tip_reset_game_res">Restablecer recursos del juego completado</string>
<string name="join_helper_tip1">puedes mover tu servidor favorito hacia arriba
\n luego unirse al ayudante comenzará con aquiescencia en él</string>
<string name="join_helper_tip2">\n Por favor, haga clic en el permiso de la APLICACIÓN para encontrarme y abra las "Ventanas emergentes".
\n y mantener la ejecución en segundo plano</string>
<string name="EXPAND_STATUS_BAR">Aplicar expandir barra de estado \n entonces Asistente de Duelos funcionará normalmente</string>
<string name="SYSTEM_ALERT_WINDOW">Aplicar Display sobre otras aplicaciones \n entonces Asistente de Duelos funcionará normalmente</string>
<string name="OpenTIP">Acerca del ingreso rápido al juego</string>
<string name="Open_Alert_Window">Para abrir ventanas emergentes</string>
<string name="tip_reset_game_res">Verificación de datos del juego completada</string>
<string name="join_helper_tip1">Puedes mover tu servidor favorito hacia arriba,
\n luego el asistente de ayuda confirmará que inicies en él</string>
<string name="join_helper_tip2">\nPara utilizar esta función, debe abrir la ventana flotante del software
\ny asegurarse de que el software se esté ejecutando en segundo plano.</string>
<string name="EXPAND_STATUS_BAR">Debes activar el permiso de notificación\nActiva el permiso para usar la función Asistente de Duelo normalmente</string>
<string name="SYSTEM_ALERT_WINDOW">Debes habilitar el permiso de ventana flotante\nHabilitar el permiso para usar la función Asistente de duelo normalmente</string>
<string name="OpenTIP">Cómo utilizar la adición rápida de salas</string>
<string name="Open_Alert_Window">Ir a abrir la ventana flotante</string>
<string name="Function_Menu">MENÚ</string>
<string name="Join_QQ">Grupo QQ</string>
<string name="about_Join_QQ">Únase al grupo QQ para informar problemas</string>
<string name="donatefor">Su donación se utilizará para mantener actualizados los servidores, comprar tarjetas para obtener obras de arte y comprar un nuevo teléfono para adaptarse.</string>
<string name="coverSelect">haga clic en la cubierta para cambiar la imagen</string>
<string name="bgSelect">haga clic en el fondo para cambiar la imagen</string>
<string name="avatarSelect">haga clic en el ávatar para cambiar la imagen</string>
<string name="ClickLinkArrows">haga clic en las flechas del enlace</string>
<string name="Already_Lastest">¡Ya cuentas con la última versión del juego!</string>
<string name="tip_no_permission" formatted="false">el permiso %s es denegado.</string>
<string name="about_immersive_mode">ocultará la teclado virtual</string>
<string name="about_Join_QQ">Únete al grupo QQ para informar problemas</string>
<string name="donatefor">Su donación se utilizará para mantener las tarifas de actualización automática, recopilar datos de actualización, retocar imágenes posteriores y comprar modelos adaptados, etc.</string>
<string name="coverSelect">Tocar en la cubierta para cambiar la imagen</string>
<string name="bgSelect">Tocar en el fondo para cambiar la imagen</string>
<string name="avatarSelect">Tocar en el ávatar para cambiar la imagen</string>
<string name="ClickLinkArrows">Tocar en las flechas del enlace</string>
<string name="Already_Lastest">¡Ya posees la última versión del juego!</string>
<string name="tip_no_permission" formatted="false">Se ha denegado el permiso %s.</string>
<string name="about_immersive_mode">Se ocultará el teclado virtual</string>
<string name="Download">Descargar</string>
<string name="Downloading">Descargando ahora</string>
<string name="Downloading">Descargando, por favor espera</string>
<string name="Update_Found">Nueva versión encontrada</string>
<string name="OK">OK</string>
<string name="Cancel">Cancelar</string>
<string name="Checking_Update">Revizando actualización ahora</string>
<string name="Checking_Update">Buscando actualizaciones, por favor espere</string>
<string name="Found_Update">Se ha encontrado una nueva actualización, ¿desea descargarla?</string>
<string name="Checking_Update_Failed">Error al comprobar la actualización</string>
<string name="Ask_to_Change_Other_Way">intentando de otra manera...</string>
<string name="DuelAssistant">El Asistente de Duelo está encendido</string>
<string name="Download_precard_failed">Falló la descarga de las cartas pre-lanzamiento</string>
<string name="Ask_to_Change_Other_Way">No se pudo obtener la línea principal, probando la línea alternativa...</string>
<string name="DuelAssistant">El Asistente de Duelo está activado</string>
<string name="masterrule">Regla Maestra</string>
<string name="tutorial">Tutorial</string>
<string name="about_help">Haga clic en el botón que desea saber</string>
<string name="tutorial">Ver Tutoriales</string>
<string name="about_help">Puedes tocar en lo que quieras saber</string>
<string name="to_open">Abrir</string>
<string name="crashed">¡YGOMobile se ha detenido inesperadamente!</string>
<string name="invalid_shortcut">Acceso directo no válido</string>
<string name="return_to_duel">Regresar al duelo☞</string>
<string name="Start_ServiceDuelAssistant">Asistente de Duelo</string>
<string name="return_to_duel">Tocar aquí para volver al duelo☞</string>
<string name="Start_ServiceDuelAssistant">Activar Asistente de Duelo</string>
<string name="about_DuelAssistant">Copia el PWS para entrar al juego de forma rápida
\n copie el texto del Deck para guardarlo como YDK y abrirlo en el editor de Decks</string>
<string name="find_deck_text">Encuentre el texto de su deck copiado, ¿desea guardarlo o no?</string>
<string name="save_failed_bcos">guardar bcos fallido</string>
<string name="deck_text_copyed">Texto del Deck copiado</string>
\ncopie el texto del deck para guardarlo como YDK y abrirlo en el editor de decks</string>
<string name="find_deck_text">Texto del deck detectado, ¿quieres guardarlo?</string>
<string name="save_failed_bcos">Error al guardar debido a</string>
<string name="deck_text_copyed">Texto del Deck copiado al portapapeles</string>
<string name="save_n_open">Guardar y Abrir</string>
<string name="searchresult">Resultados</string>
<string name="Pre_share">Prepárese para compartir</string>
<string name="category_pack">Paquete</string>
<string name="searchresult">Resultados de la búsqueda</string>
<string name="Pre_share">Listo para compartir, por favor espera...</string>
<string name="category_pack">Exhibición del paquete de cartas</string>
<string name="category_windbot_deck">Decks I.A.</string>
<string name="category_Uncategorized">Sin Categoría</string>
<string name="please_input_category_name">por favor ingrese el nombre de la Categoría</string>
<string name="invalid_category_name">nombre de Categoría no válido</string>
<string name="please_select_target_category">por favor seleccione la Categoría objetivo</string>
<string name="delete_confirm">se eliminarán todos los decks de esta Categoría</string>
<string name="no_deck_is_selected">no se ha seleccionado ningún deck</string>
<string name="done">¡hecho\!</string>
<string name="donot_edit_Deck">No cambies los decks de esta Categoría.</string>
<string name="code_share">Compartir Código</string>
<string name="screenshoot">Compartir Arte</string>
<string name="ydk_share">Compartir Archivo</string>
<string name="unable_to_edit_empty_deck">no se puede editar el Deck vacío</string>
<string name="create_new_failed">Crear fallido</string>
<string name="category_Uncategorized">Sin categoría</string>
<string name="please_input_category_name">Por favor ingrese el nombre de la categoría</string>
<string name="invalid_category_name">Nombre inválido</string>
<string name="please_select_target_category">¿En qué categoría debería ponerlo?</string>
<string name="delete_confirm">¿Estás seguro de que deseas eliminar esta categoría? También se eliminarán todos los decks de la categoría.</string>
<string name="no_deck_is_selected">No se ha seleccionado ningún deck</string>
<string name="done">¡Hecho\!</string>
<string name="donot_edit_Deck">Por favor no cambies los decks en esta categoría.</string>
<string name="code_share">Compartir código</string>
<string name="screenshoot">Compartir captura de pantalla</string>
<string name="ydk_share">Compartir archivo ydk</string>
<string name="unable_to_edit_empty_deck">No se pueden editar el decks vacíos</string>
<string name="create_new_failed">La creación falló</string>
<string name="about_pref_settings_keep_scale">Visualización de escala de resolución original</string>
<string name="already_top">Primera carta ya está lista</string>
<string name="already_end">Última carta ya está lista</string>
<string name="already_top">Primera carta lista</string>
<string name="already_end">Última carta lista</string>
<string name="tip_redownload">Volver a descargar</string>
<string name="tip_expansions_image">no hay imagen para cartas de pre-lanzamiento</string>
<string name="tip_return_to_duel">El juego actual ha sido devuelto.</string>
<string name="tip_expansions_image">No hay imagen para cartas pre-lanzamiento</string>
<string name="tip_return_to_duel">Regresado al juego actual.</string>
<string name="my_favorites">myFav★</string>
<string name="ypk_installed">archivo de expansión instalado</string>
<string name="ypk_installed">Archivo de expansión instalado</string>
<string name="ypk_go_setting">Para usarlo, le recomendamos que consulte \"Usar Expansiones\" a menos que haya instalado los pre-lanzamientos de otra manera</string>
<string name="ypk_delete">Mantenga presionado el nombre para eliminar</string>
<string name="install_failed_bcos">La instalación del archivo falló, porque\:</string>
<string name="deck_back_up">Respaldo</string>
<string name="install_failed_bcos">La instalación falló debido a:</string>
<string name="deck_back_up">Respaldar</string>
<string name="deck_restore">Restaurar</string>
<string name="deck_backup_n_restore">Respaldo/Restaurar</string>
<string name="deck_explain">Respaldo\: hacer una copia de seguridad de todos los decks en Sdcard/ygocore
\n Restaurar\: restaurar decks respaldados</string>
<string name="restore_deck">se encontraron decks respaldados en su dispositivo\, ¿desea restaurarlos\?</string>
<string name="deck_backup_n_restore">Respaldar/Restaurar</string>
<string name="deck_explain">Respaldar: hacer una copia de seguridad de todos los decks en Sdcard/ygocore
\nRestaurar: restaurar decks respaldados</string>
<string name="restore_deck">Se encontraron decks respaldados en su dispositivo, ¿desea restaurarlos?</string>
<string name="explain_permission">
Se aplicarán permisos muy necesarios.\:
\n Acceso al almacenamiento\:respaldo\/restaurar deck\,establecer fondo personalizado\/avatares\/dorso de carta</string>
<string name="guide_menu">Menú\:\n incluyendo la mayoría de las funciones, por Ejemplo</string>
<string name="guide_mycard">Mycard\: clasificar récord de duelo, observar juegos, sala de chat, etc. </string>
<string name="guide_serverlist">Lista de Servidores\: haga clic en un servidor para unirse al juego en línea</string>
<string name="guide_server_edit">Editar servidor\: editar la información del servidor. Por ejemplo\: cambiar apodo</string>
<string name="guide_help">Ayuda\: guía específica Cómo usar YGOMobile y aprender las Reglas Maestras</string>
<string name="guide_settings">Configuraciones\: activar Expansiones y Asistente de Duelos. Establecer avatares del juego, fondo, dorso de carta.</string>
<string name="guide_reset">haga clic para restablecer cuando las imágenes o cualquier archivo se eliminen por error</string>
<string name="guide_abt_room_list">La contraseña ingresada será registrada. Presione solo para eliminar registros)</string>
<string name="guide_join_room">puedes unirte al juego sin contraseña para iniciar un duelo aleatorio con el modo predeterminado
\n use la contraseña especificada y comparta con otros jugadores para unirse al mismo juego
\n para más Modelos de Contraseñas de duelo puedes ver el tortuial.</string>
<string name="guide_button_search">haga clic en el botón de búsqueda para editar los criterios de búsqueda</string>
<string name="guide_search_result_count">aquí se muestra el recuento de resultados de búsqueda</string>
<string name="guide_button_search_result">haga clic para ver el resultado de la búsqueda \n también aquí se mostrarán las tarjetas favoritas.</string>
<string name="guide_view_deck_manager">haz clic para cambiar los Decks \n Puedes gestionar las categorías de los decks aquí.</string>
<string name="guide_view_move_card">presione una carta para moverla a otro lugar \n mantenga presionada esta carta para eliminarla.</string>
<string name="guide_view_banner">Noticias de Mycard, puedes hacer clic para ver \n Sólo en chino por ahora, lo siento.</string>
<string name="title_delete_ex">eliminar expansiones</string>
<string name="about_delete_ex">si necesita eliminar todas las cartas de expansión</string>
<string name="file_installed">archivo cargado</string>
<string name="ask_delete_ex">Haga clic en OK para confirmar la eliminación.</string>
El uso de dichas funciones de este software requerirá los siguientes permisos necesarios:
\nPermisos de almacenamiento: realizar copias de seguridad y restaurar decks, necesarios para personalizar fondos, avatares y cubiertas de cartas.</string>
<string name="guide_menu">Menú:\nFunciones principales como</string>
<string name="guide_mycard">Mycard: Clasificar récord de duelo, observar juegos, sala de chat, etc.</string>
<string name="guide_serverlist">Lista de Servidores: Toque un servidor para unirse al juego en línea</string>
<string name="guide_server_edit">Editar servidor: Editar la información del servidor. Por ejemplo: cambiar apodo</string>
<string name="guide_help">Ayuda: Guía específica Cómo usar YGOMobile y aprender las Reglas Maestras</string>
<string name="guide_settings">Configuraciones: Activar Expansiones y Asistente de Duelos. Establecer avatares del juego, fondo, cubierta de carta.</string>
<string name="guide_reset">Tocar para restablecer cuando las imágenes o cualquier archivo se eliminen por error</string>
<string name="guide_abt_room_list">La contraseña ingresada será registrada. Presione solo para eliminar registros</string>
<string name="guide_join_room">Puedes unirte al juego sin contraseña para iniciar un duelo aleatorio con el modo predeterminado
\nuse la contraseña especificada y comparta con otros jugadores para unirse al mismo juego
\npara más Modelos de Contraseñas de duelo puedes ver el tortuial.</string>
<string name="guide_button_search">Toca el botón de búsqueda para editar los criterios de búsqueda</string>
<string name="guide_search_result_count">Aquí se muestra el recuento de resultados de búsqueda</string>
<string name="guide_button_search_result">Tocar para ver el resultado de la búsqueda \ntambién aquí se mostrarán las cartas favoritas.</string>
<string name="guide_view_deck_manager">Tocar para cambiar los decks \nPuedes gestionar las categorías de los decks aquí.</string>
<string name="guide_view_move_card">Presione una carta para moverla a otro lugar \nmantenga presionada esta carta para eliminarla.</string>
<string name="guide_view_banner">Noticias de Mycard, puedes tocar para ver \nSólo en chino por ahora, lo siento.</string>
<string name="title_delete_ex">eEliminar expansiones</string>
<string name="about_delete_ex">Si necesita eliminar todas las cartas de expansión</string>
<string name="file_installed">Archivo cargado</string>
<string name="ask_delete_ex">Tocar OK para confirmar la eliminación.</string>
<string name="label_ot_TCG">TCG</string>
<string name="label_ot_OCG">OCG</string>
<string name="label_ot_All">Todo</string>
......@@ -347,19 +348,21 @@
<string name="label_ot_SC_OCG">OCG ChinoS.</string>
<string name="settings_screen_padding">Altura reservada de la pantalla curva.</string>
<string name="tip_load_cdb_error">Error al cargar la base de datos</string>
<string name="action_download_expansions">descargar \n expansiones</string>
<string name="action_download_expansions">Descargar \nexpansiones</string>
<string name="replay">Ver repetición</string>
<string name="bot_mode">vs Bot</string>
<string name="personal">My</string>
<string name="login_mycard">iniciar sesión</string>
<string name="logout_mycard">¿cerrar sesión en mycard\?</string>
<string name="login_mycard">Iniciar sesión</string>
<string name="logout_mycard">¿Cerrar sesión en mycard?</string>
<string name="back_to_mycard_home">Volver a la página de inicio</string>
<string name="edit_your_message">Introduce tu mensaje</string>
<string name="login_succeed">Sala de chat iniciada</string>
<string name="reChatJoining">volver a iniciar sesión\.\.\.</string>
<string name="reChatJoining">Volver a iniciar sesión...</string>
<string name="settings_data_language">Lenguaje</string>
<string name="settings_data_language_about">cambiar el idioma de la interfaz de usuario de YGOPro y la base de datos de las cartas</string>
<string name="find_in_page">encontrar:</string>
<string name="tip_card_info_diff">Las cartas publicadas y las de prelanzamiento son diferentes; tenga en cuenta después de parchearlas.</string>
<string name="tip_deckInfo_isNot_completeDeck">Información de cartas ¡Excepción! intento convertir la información de una carta existente</string>
<string name="settings_data_language_about">Cambiar el idioma de la interfaz de usuario de YGOMobile y la base de datos de las cartas</string>
<string name="find_in_page">Encontrar:</string>
<string name="tip_card_info_diff">Esta carta no está incluida en el software. Intente actualizar el software o verifique si la carta está disponible en el paquete de cartas de expansión.</string>
<string name="tip_deckInfo_isNot_completeDeck">El mazo de cartas actual se analiza de manera anormal y haremos todo lo posible para convertirlo en cartas existentes.</string>
<string name="tip_ygopro_is_running">Actualmente hay un juego en ejecución y no se puede iniciar un nuevo duelo. La contraseña de la sala se ha guardado en el historial. Finaliza el juego actual y luego selecciona el historial para unirte a la sala.</string>
</resources>
......@@ -269,6 +269,8 @@
<string name="Checking_Update">检查更新中,请稍候</string>
<string name="Found_Update">发现新版本,前往下载?</string>
<string name="Checking_Update_Failed">检查更新失败</string>
<string name="Download_Precard_Failed">先行卡下载失败</string>
<string name="Pre_Server_Name">萌卡超先行服</string>
<string name="Ask_to_Change_Other_Way">主线获取失败,尝试备选线路中...</string>
<string name="DuelAssistant">决斗助手启用中</string>
<string name="masterrule">学习大师规则</string>
......
......@@ -266,6 +266,8 @@
<string name="Checking_Update">Now Checking Update</string>
<string name="Found_Update">New upGrade is Founded, Download?</string>
<string name="Checking_Update_Failed">Checking Update Failed</string>
<string name="Download_Precard_Failed">Download pre-cards failed</string>
<string name="Pre_Server_Name">Mycard Super-pre Server</string>
<string name="Ask_to_Change_Other_Way">trying other way...</string>
<string name="DuelAssistant">DuelAssiatant is On</string>
<string name="masterrule">Master Rule</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