Commit c9a904f3 authored by fallenstardust's avatar fallenstardust

移除专门删除接口,改为缓存和同步全部用户卡组接口

parent dab5d86f
......@@ -1331,14 +1331,13 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}).done((deckData) -> {
if (deckData != null) {
mDeckId = deckData.getDeckId();
deckData.getDeckYdk();
LogUtil.i(TAG,deckData.toString());
String fileFullName = deckData.getDeckName() + YDK_FILE_EX;
File dir = new File(getActivity().getApplicationInfo().dataDir, "cache");
//将卡组存到cache缓存目录中
boolean result = DeckSquareFileUtil.saveFileToPath(dir.getPath(), fileFullName, deckData.getDeckYdk(), deckData.getDeckUpdateDate());
if (result) {//存储成功,使用预加载功能
LogUtil.i(TAG, "square deck detail done");
//File file = new File(dir, fileFullName);
preLoadFile(dir.getPath() + "/" + fileFullName);
tv_add_1.setText(R.string.like_deck_thumb);
ll_click_like.setVisibility(View.VISIBLE);
......
......@@ -35,9 +35,6 @@ import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.bean.DeckType;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.LoginToken;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.MyOnlineDeckDetail;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushSingleDeckResponse;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.lite.databinding.FragmentDeckSelectBinding;
import cn.garymb.ygomobile.ui.adapters.DeckListAdapter;
......@@ -45,12 +42,9 @@ import cn.garymb.ygomobile.ui.adapters.SimpleListAdapter;
import cn.garymb.ygomobile.ui.adapters.TextSelectAdapter;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.ImageUtil;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.DeckUtil;
import cn.garymb.ygomobile.utils.FileUtils;
import cn.garymb.ygomobile.utils.IOUtils;
import cn.garymb.ygomobile.utils.LogUtil;
import cn.garymb.ygomobile.utils.SharedPreferenceUtil;
import cn.garymb.ygomobile.utils.YGODeckDialogUtil;
import cn.garymb.ygomobile.utils.YGOUtil;
import cn.garymb.ygomobile.utils.recyclerview.DeckTypeTouchHelperCallback;
......
package cn.garymb.ygomobile.ui.cards.deck_square;
import static cn.garymb.ygomobile.Constants.CORE_DECK_PATH;
import static cn.garymb.ygomobile.ui.cards.deck_square.DeckSquareFileUtil.toDeckItemList;
import android.widget.Toast;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -16,12 +15,10 @@ import java.util.Map;
import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.bean.DeckType;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.cards.DeckManagerFragment;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.BasicResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.DeckIdResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.DeckMultiIdResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.DownloadDeckResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.GetSquareDeckCondition;
......@@ -33,8 +30,6 @@ import cn.garymb.ygomobile.ui.cards.deck_square.api_response.MyOnlineDeckDetail;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushDeckPublicState;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushMultiDeck;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushMultiResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushSingleDeck;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushSingleDeckResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.SquareDeckResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.bo.MyDeckItem;
import cn.garymb.ygomobile.ui.plus.VUiKit;
......@@ -175,52 +170,6 @@ public class DeckSquareApiUtil {
}
/**
* 阻塞方法,将对应于deckId、deckName的卡组内容json推送到服务器。
* 如果在服务器存在deckId相同的记录,则更新卡组,deckName会覆盖服务器上的卡组名
* 如果在服务器存在deckName相同、deckId不同的记录,则更新失败
*
* @param deckfile
* @param loginToken
* @param deckId
* @return
* @throws IOException
*/
private static PushSingleDeckResponse pushDeck(DeckFile deckfile, LoginToken loginToken, String deckId) throws IOException {
String deckContent = DeckSquareFileUtil.setDeckId(deckfile.getPath(), loginToken.getUserId(), deckId);
PushSingleDeckResponse result = null;
String url = "http://rarnu.xyz:38383/api/mdpro3/sync/single";
Map<String, String> headers = new HashMap<>();
headers.put("ReqSource", "YGOMobile");
headers.put("token", loginToken.getServerToken());
Gson gson = new Gson();
PushSingleDeck pushSingleDeck = new PushSingleDeck();
pushSingleDeck.setDeckContributor(SharedPreferenceUtil.getMyCardUserName());
pushSingleDeck.setUserId(loginToken.getUserId());
PushSingleDeck.DeckData deckData = new PushSingleDeck.DeckData();
deckData.setDeckId(deckId);
deckData.setDeckName(deckfile.getName());
deckData.setDeckType(deckfile.getTypeName());
deckData.setDeckCoverCard1(deckfile.getFirstCode());
deckData.setDelete(false);
deckData.setDeckYdk(deckContent);
pushSingleDeck.setDeck(deckData);
String json = gson.toJson(pushSingleDeck);
Response response = OkhttpUtil.postJson(url, json, headers);
String responseBodyString = response.body().string();
result = gson.fromJson(responseBodyString, PushSingleDeckResponse.class);
LogUtil.i(TAG, "push deck response:" + responseBodyString);
return result;
}
/**
* 阻塞方法,将对应于deckDataList、deckIdList的卡组内容json推送到服务器。
* 如果在服务器存在deckId相同的记录,则更新卡组,deckName会覆盖服务器上的卡组名
......@@ -252,49 +201,6 @@ public class DeckSquareApiUtil {
}
/**
* 阻塞方法,推送新卡组的内容时使用。首先从服务器请求一个新的卡组id,之后将卡组上传到服务器
* 首先调用服务端api获取卡组id,之后将卡组id设置到ydk中,之后调用服务器api将卡组上传
*
* @param deckFile
* @param loginToken
*/
public static PushSingleDeckResponse requestIdAndPushNewDeck(DeckFile deckFile, LoginToken loginToken) throws IOException {
if (loginToken == null) {
return null;
}
String getDeckIdUrl = "http://rarnu.xyz:38383/api/mdpro3/deck/deckId";
Map<String, String> headers = new HashMap<>();
headers.put("ReqSource", "YGOMobile");
headers.put("token", loginToken.getServerToken());
Gson gson = new Gson();
DeckIdResponse deckIdResult = null;
Response response = OkhttpUtil.synchronousGet(getDeckIdUrl, null, headers);
String responseBodyString = response.body().string();
// Convert JSON to Java object using Gson
deckIdResult = gson.fromJson(responseBodyString, DeckIdResponse.class);
LogUtil.i(TAG, "deck id result:" + deckIdResult.toString());
if (deckIdResult == null) {
return null;
}
String deckId = deckIdResult.getDeckId();//从服务器获取
if (deckId == null) {
return null;
}
return pushDeck(deckFile, loginToken, deckId);
}
/**
* 阻塞方法,推送新卡组的内容时使用。首先从服务器请求一个新的卡组id,之后将卡组上传到服务器
* 首先调用服务端api获取卡组id,之后将卡组id设置到ydk中,之后调用服务器api将卡组上传
......@@ -339,6 +245,51 @@ public class DeckSquareApiUtil {
return pushDecks(deckDataList, loginToken, deckIdList);
}
public static PushMultiResponse deleteDecks(List<DeckFile> deckFileList) throws IOException {
if (SharedPreferenceUtil.getServerToken() != null) {
LoginToken loginToken = new LoginToken(
SharedPreferenceUtil.getServerUserId(),
SharedPreferenceUtil.getServerToken()
);
// 创建一个局部变量来持有deckFileList的引用,因为有时候异步执行会导致获取不到传参的deckFileList
final List<DeckFile> deleteDeckList = new ArrayList<>(deckFileList);
// 先判断缓存表是否正常获取到了
if (DeckManagerFragment.getOriginalData().isEmpty()) {
// 获取在线卡组列表(异步处理)
VUiKit.defer().when(() -> {
return DeckSquareApiUtil.getUserDecks(loginToken);
}).fail((e) -> {
LogUtil.e(TAG, "getUserDecks failed: " + e);
}).done((result) -> {
if (result == null || result.getData() == null) {
return;
}
DeckManagerFragment.getOriginalData().addAll(result.getData());
});
}
for (DeckFile deleteDeckFile : deleteDeckList) {
for (MyOnlineDeckDetail onlineDeckDetail : DeckManagerFragment.getOriginalData()) {
if (deleteDeckFile.getFileName().equals(onlineDeckDetail.getDeckName()) && deleteDeckFile.getTypeName().equals(onlineDeckDetail.getDeckType())) {
onlineDeckDetail.setDelete(true);// 将要删除的列表元素的isDelete值设置过
//顺带设置一下
deleteDeckFile.setDeckId(onlineDeckDetail.getDeckId());
}
}
}
try {
syncMyDecks(toDeckItemList(DeckManagerFragment.getOriginalData()),loginToken);
} catch (IOException e) {
LogUtil.e(TAG, "删除卡组失败:" + e);
}
}
return null;
}
/**
* 批量上传已经在云上存在的卡组
*
......@@ -497,81 +448,6 @@ public class DeckSquareApiUtil {
}
public static void deleteDecks(List<DeckFile> deckFileList) {
if (SharedPreferenceUtil.getServerToken() != null) {
LoginToken loginToken = new LoginToken(
SharedPreferenceUtil.getServerUserId(),
SharedPreferenceUtil.getServerToken()
);
// 创建一个局部变量来持有deckFileList的引用,因为有时候异步执行会导致获取不到传参的deckFileList
final List<DeckFile> localDeckFileList = new ArrayList<>(deckFileList);
// 获取在线卡组列表(异步处理)
VUiKit.defer().when(() -> {
return DeckSquareApiUtil.getUserDecks(loginToken);
}).fail((e) -> {
LogUtil.e(TAG, "getUserDecks failed: " + e);
}).done((result) -> {
if (result == null || result.getData() == null) {
return;
}
List<MyOnlineDeckDetail> onlineDecks = result.getData();
for (MyOnlineDeckDetail onlineDeck : onlineDecks) {
for (DeckFile deckFile : localDeckFileList) {
if (onlineDeck.getDeckName().equals(deckFile.getName())) {
// 删除在线卡组(异步处理)
VUiKit.defer().when(() -> {
PushSingleDeckResponse deckResponse = deleteDeck(onlineDeck.getDeckId(), loginToken);
return deckResponse;
}).fail((deleteError) -> {
LogUtil.e(TAG, "Delete Online Deck failed: " + deleteError);
}).done((deleteSuccess) -> {
if (deleteSuccess.isData()) {
LogUtil.i(TAG, "Online deck deleted successfully");
}
});
break;
}
}
}
});
}
}
public static PushSingleDeckResponse deleteDeck(String deckId, LoginToken loginToken) throws
IOException {
PushSingleDeckResponse result = null;
String url = "http://rarnu.xyz:38383/api/mdpro3/sync/single";
Map<String, String> headers = new HashMap<>();
headers.put("ReqSource", "YGOMobile");
headers.put("token", loginToken.getServerToken());
Gson gson = new Gson();
PushSingleDeck pushSingleDeck = new PushSingleDeck();
PushSingleDeck.DeckData deckData = new PushSingleDeck.DeckData();
deckData.setDeckId(deckId);
deckData.setDelete(true);
pushSingleDeck.setDeck(deckData);
pushSingleDeck.setUserId(loginToken.getUserId());
String json = gson.toJson(pushSingleDeck);
Response response = OkhttpUtil.postJson(url, json, headers);
String responseBodyString = response.body().string();
// Convert JSON to Java object using Gson
result = gson.fromJson(responseBodyString, PushSingleDeckResponse.class);
LogUtil.i(TAG, "push deck response:" + responseBodyString);
return result;
}
/**
* 管理员使用,删除某卡组(听说可以删除别人的卡组,没试过)
* 该api没有权限校验,慎用
......
......@@ -48,6 +48,7 @@ public class DeckSquareFileUtil {
item.setDeckCoverCard1(detail.getDeckCoverCard1());
item.setUpdateTimestamp(detail.getDeckUpdateDate());
item.setPublic(detail.isPublic());
item.setDelete(detail.isDelete());
myOnlineDecks.add(item);
}
return myOnlineDecks;
......
......@@ -85,13 +85,6 @@ public class DeckSquareListAdapter extends BaseQuickAdapter<OnlineDeckDetail, Ba
} else {
imageLoader.bindImage(cardImage, -1, null, ImageLoader.Type.small);
}
// 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
/* 如果查不到版本号,则不显示图片 */
/* 如果能查到版本号,则显示图片,利用glide的signature,将版本号和url作为signature,由glide判断是否使用缓存 */
}
}
\ No newline at end of file
......@@ -18,10 +18,9 @@ import cn.garymb.ygomobile.ui.cards.deck_square.api_response.BasicResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.LoginToken;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.MyDeckResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.MyOnlineDeckDetail;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushSingleDeckResponse;
import cn.garymb.ygomobile.ui.cards.deck_square.bo.MyDeckItem;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.cards.deck_square.api_response.PushMultiResponse;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.LogUtil;
......@@ -119,18 +118,14 @@ public class MyDeckListAdapter extends BaseQuickAdapter<MyOnlineDeckDetail, Base
return;
}
VUiKit.defer().when(() -> {
PushSingleDeckResponse result = DeckSquareApiUtil.deleteDeck(item.getDeckId(), loginToken);
return result;
}).fail(e -> {
List<DeckFile> deleteList = new ArrayList<>();
deleteList.add(new DeckFile(item.getDeckId(), DeckType.ServerType.MY_SQUARE));
try {
DeckSquareApiUtil.deleteDecks(deleteList);
}catch (Throwable e){
LogUtil.i(TAG, "square deck detail fail" + e.getMessage());
}).done(data -> {
if (data.isData()) {
remove(item);
} else {
YGOUtil.showTextToast("delete fail " + data.getMessage());
}
});
}
remove(item);
}
}
......
......@@ -232,4 +232,18 @@ public class MyOnlineDeckDetail implements Parcelable {
public void setDelete(boolean delete) {
isDelete = delete;
}
public String toString(){
return "MyOnlineDeckDetail{" +
"deckName='" + deckName + '\'' +
", deckId=" + deckId +
", deckType=" + deckType +
", deckContributor=" + deckContributor +
", userId='" + userId + '\'' +
", deckCoverCard1=" + deckCoverCard1 +
", deckLike='" + deckLike + '\'' +
", isPublic='" + isPublic + '\'' +
", deckYdk='" + deckYdk + '\'' +
'}';
}
}
\ No newline at end of file
......@@ -153,7 +153,7 @@ public class OnlineDeckDetail implements Parcelable {
}
public String toString(){
return "MyOnlineDeckDetail{" +
return "preView_OnlineDeckDetail{" +
"deckName='" + deckName + '\'' +
", deckId=" + deckId +
", lastDate=" + lastDate +
......
......@@ -47,6 +47,7 @@ public class PushMultiDeck {
private Integer deckProtector = 0;
private long timestamp = 0;
private String deckYdk;
private boolean isDeleting = false;
public String getDeckId() {
return deckId;
......@@ -128,5 +129,9 @@ public class PushMultiDeck {
this.deckYdk = deckYdk;
}
public boolean getDeleting() {return isDeleting;}
public void setDeleting(boolean isDeleting) {this.isDeleting = isDeleting;}
}
}
package cn.garymb.ygomobile.ui.cards.deck_square.api_response;
public class PushSingleDeck {
private String deckContributor;
private Integer userId;
private DeckData deck;
public String getDeckContributor() {
return deckContributor;
}
public void setDeckContributor(String deckContributor) {
this.deckContributor = deckContributor;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public DeckData getDeck() {
return deck;
}
public void setDeck(DeckData deck) {
this.deck = deck;
}
public static class DeckData {
private String deckId;
private String deckName;
private String deckType;
private Integer deckCoverCard1 = 0;
private Integer deckCoverCard2 = 0;
private Integer deckCoverCard3 = 0;
private Integer deckCase = 0;
private Integer deckProtector = 0;
private String deckYdk;
private boolean isDelete = false;
public String getDeckId() {
return deckId;
}
public void setDeckId(String deckId) {
this.deckId = deckId;
}
public String getDeckName() {
return deckName;
}
public void setDeckName(String deckName) {
this.deckName = deckName;
}
public String getDeckType() {
return deckType;
}
public void setDeckType(String deckType) {
this.deckType = deckType;
}
public Integer getDeckCoverCard1(Integer firstCode) {
return deckCoverCard1;
}
public void setDeckCoverCard1(Integer deckCoverCard1) {
this.deckCoverCard1 = deckCoverCard1;
}
public Integer getDeckCoverCard2() {
return deckCoverCard2;
}
public void setDeckCoverCard2(Integer deckCoverCard2) {
this.deckCoverCard2 = deckCoverCard2;
}
public Integer getDeckCoverCard3() {
return deckCoverCard3;
}
public void setDeckCoverCard3(Integer deckCoverCard3) {
this.deckCoverCard3 = deckCoverCard3;
}
public Integer getDeckCase() {
return deckCase;
}
public void setDeckCase(Integer deckCase) {
this.deckCase = deckCase;
}
public Integer getDeckProtector() {
return deckProtector;
}
public void setDeckProtector(Integer deckProtector) {
this.deckProtector = deckProtector;
}
public String getDeckYdk() {
return deckYdk;
}
public void setDeckYdk(String deckYdk) {
this.deckYdk = deckYdk;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
}
package cn.garymb.ygomobile.ui.cards.deck_square.api_response;
//将卡组上传后,返回的响应
//对应接口http://rarnu.xyz:38383/api/mdpro3/sync/single
public class PushSingleDeckResponse {
private Integer code;
private String message;
//!!!!注意,本字段是boolean,与PushMultiDeckResponse的不同!
private boolean data;//服务器的执行结果,true代表卡组上传成功。false代表卡组上传失败
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isData() {
return data;
}
public void setData(boolean data) {
this.data = data;
}
}
......@@ -20,6 +20,8 @@ public class MyDeckItem {
private Boolean isPublic;
private Boolean isDelete;
public int getIdUploaded() {
return idUploaded;
}
......@@ -93,6 +95,14 @@ public class MyDeckItem {
isPublic = aPublic;
}
public Boolean isDelete() {
return isDelete;
}
public void setDelete(Boolean aDelete) {
isDelete = aDelete;
}
@Override
public String toString() {
return "MyDeckItem{" +
......
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