Added an advanced error response system.
This commit is contained in:
parent
259006d354
commit
9fc86b219b
Binary file not shown.
@ -1,11 +1,8 @@
|
||||
package ru.volgorobot.vrcatalog;
|
||||
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.github.msteinbeck.sig4j.signal.Signal1;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import ru.volgorobot.vrcatalog.additional.NetworkErrorException;
|
||||
import ru.volgorobot.vrcatalog.model.FirstLevelModel;
|
||||
import ru.volgorobot.vrcatalog.model.SecondLevelModel;
|
||||
import ru.volgorobot.vrcatalog.model.ThirdLevelModel;
|
||||
@ -20,13 +17,13 @@ public interface MainContract {
|
||||
|
||||
interface Presenter {
|
||||
void getFirstLevel();
|
||||
void failureAnswerSlot(int errorCode);
|
||||
}
|
||||
|
||||
interface MainModel {
|
||||
Signal1<Integer> errorSignal = new Signal1<>();
|
||||
ArrayList<FirstLevelModel> getFirstLevel();
|
||||
ArrayList<SecondLevelModel> getSecondLevelByParentID(int parentID);
|
||||
ArrayList<ThirdLevelModel> getThirdLevelByParentID(int parentID);
|
||||
ArrayList<FirstLevelModel> getFirstLevel() throws NetworkErrorException, NullPointerException;
|
||||
ArrayList<SecondLevelModel> getSecondLevelByParentID(int parentID) throws NetworkErrorException, NullPointerException;
|
||||
ArrayList<ThirdLevelModel> getThirdLevelByParentID(int parentID) throws NetworkErrorException, NullPointerException;
|
||||
void reinitializeApi() throws IllegalStateException;
|
||||
boolean getApiState();
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,8 @@ import android.os.AsyncTask;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import ru.volgorobot.vrcatalog.additional.NetworkErrorException;
|
||||
import ru.volgorobot.vrcatalog.additional.ResultWithErrorCode;
|
||||
import ru.volgorobot.vrcatalog.model.CoreModel;
|
||||
import ru.volgorobot.vrcatalog.model.FirstLevelModel;
|
||||
|
||||
@ -14,34 +16,38 @@ public class MainPresenter implements MainContract.Presenter {
|
||||
|
||||
public MainPresenter(MainContract.MainActivityView mainActivityView, Context context) {
|
||||
this.mView = mainActivityView;
|
||||
try {
|
||||
this.coreModel = new CoreModel(context);
|
||||
} catch (IllegalStateException e) {
|
||||
mView.onFailureAnswer(3);
|
||||
}
|
||||
coreModel.errorSignal.connect(this::failureAnswerSlot);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getFirstLevel() {
|
||||
new AsyncTask<Void, Void, ArrayList<FirstLevelModel>>() {
|
||||
try {
|
||||
coreModel.reinitializeApi();
|
||||
} catch (IllegalStateException e) {
|
||||
mView.onFailureAnswer(3);
|
||||
return;
|
||||
}
|
||||
new AsyncTask<Void, Void, ResultWithErrorCode<ArrayList<FirstLevelModel>>>() {
|
||||
@Override
|
||||
protected ArrayList<FirstLevelModel> doInBackground(Void... voids) {
|
||||
ArrayList<FirstLevelModel> firstLevelModels = coreModel.getFirstLevel();
|
||||
return firstLevelModels;
|
||||
protected ResultWithErrorCode<ArrayList<FirstLevelModel>> doInBackground(Void... voids) {
|
||||
ArrayList<FirstLevelModel> firstLevelModels = null;
|
||||
try {
|
||||
firstLevelModels = coreModel.getFirstLevel();
|
||||
} catch (NetworkErrorException networkErrorException) {
|
||||
return new ResultWithErrorCode<>(firstLevelModels, networkErrorException.getErrorCode());
|
||||
} catch (NullPointerException nullPointerException) {
|
||||
return new ResultWithErrorCode<>(firstLevelModels, 3);
|
||||
}
|
||||
return new ResultWithErrorCode<>(firstLevelModels, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(ArrayList<FirstLevelModel> firstLevelModels) {
|
||||
mView.buildFirstLevelTree(firstLevelModels);
|
||||
protected void onPostExecute(ResultWithErrorCode<ArrayList<FirstLevelModel>> result) {
|
||||
switch (result.getErrorCode()) {
|
||||
case 0: {
|
||||
mView.buildFirstLevelTree(result.getData());
|
||||
break;
|
||||
}
|
||||
}.execute();
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void failureAnswerSlot(int errorCode) {
|
||||
switch (errorCode) {
|
||||
case 1: {
|
||||
mView.onFailureAnswer(1);
|
||||
break;
|
||||
@ -55,5 +61,8 @@ public class MainPresenter implements MainContract.Presenter {
|
||||
break;
|
||||
}
|
||||
}
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,13 @@
|
||||
package ru.volgorobot.vrcatalog.additional;
|
||||
|
||||
public class NetworkErrorException extends Exception {
|
||||
private int errorCode;
|
||||
|
||||
public NetworkErrorException(int errorCode) {
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
|
||||
public int getErrorCode() {
|
||||
return errorCode;
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package ru.volgorobot.vrcatalog.additional;
|
||||
|
||||
|
||||
public class ResultWithErrorCode<T> {
|
||||
private T data;
|
||||
private int errorCode;
|
||||
|
||||
public ResultWithErrorCode(T data, int errorCode) {
|
||||
this.data = data;
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
|
||||
public T getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public int getErrorCode() {
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
public void setData(T data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public void setErrorCode(int errorCode) {
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
}
|
@ -11,18 +11,88 @@ import java.util.List;
|
||||
|
||||
import retrofit2.Response;
|
||||
import ru.volgorobot.vrcatalog.MainContract;
|
||||
import ru.volgorobot.vrcatalog.additional.NetworkErrorException;
|
||||
import ru.volgorobot.vrcatalog.api.Controller;
|
||||
import ru.volgorobot.vrcatalog.api.VRApi;
|
||||
|
||||
public class CoreModel implements MainContract.MainModel {
|
||||
private Context context;
|
||||
private VRApi vrApi;
|
||||
private String baseURL;
|
||||
public final Signal1<Integer> errorSignal = new Signal1<>();
|
||||
|
||||
public CoreModel(Context context) throws IllegalStateException {
|
||||
public CoreModel(Context context) {
|
||||
this.context = context;
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
String baseURL = sharedPreferences.getString("addressOfServer", "");
|
||||
this.baseURL = sharedPreferences.getString("addressOfServer", "");
|
||||
try {
|
||||
vrApi = Controller.getApi(baseURL);
|
||||
} catch(IllegalStateException e) {
|
||||
// Nothing
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<FirstLevelModel> getFirstLevel() throws NetworkErrorException, NullPointerException {
|
||||
if(vrApi == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
final ArrayList<FirstLevelModel> firstLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<FirstLevelModel>> response = vrApi.getFirstLevel().execute();
|
||||
if(response.isSuccessful()) {
|
||||
firstLevelModels.addAll(response.body());
|
||||
} else {
|
||||
throw new NetworkErrorException(2);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new NetworkErrorException(1);
|
||||
}
|
||||
return firstLevelModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<SecondLevelModel> getSecondLevelByParentID(int parentID) throws NetworkErrorException, NullPointerException {
|
||||
if(vrApi == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
final ArrayList<SecondLevelModel> secondLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<SecondLevelModel>> response = vrApi.getSecondLevel(parentID).execute();
|
||||
if(response.isSuccessful()) {
|
||||
secondLevelModels.addAll(response.body());
|
||||
} else {
|
||||
throw new NetworkErrorException(2);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new NetworkErrorException(1);
|
||||
}
|
||||
return secondLevelModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ThirdLevelModel> getThirdLevelByParentID(int parentID) throws NetworkErrorException, NullPointerException {
|
||||
if(vrApi == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
final ArrayList<ThirdLevelModel> thirdLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<ThirdLevelModel>> response = vrApi.getDetails(parentID).execute();
|
||||
if(response.isSuccessful()) {
|
||||
thirdLevelModels.addAll(response.body());
|
||||
} else {
|
||||
throw new NetworkErrorException(2);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new NetworkErrorException(1);
|
||||
}
|
||||
return thirdLevelModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reinitializeApi() throws IllegalStateException {
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
this.baseURL = sharedPreferences.getString("addressOfServer", "");
|
||||
try {
|
||||
vrApi = Controller.getApi(baseURL);
|
||||
} catch(IllegalStateException e) {
|
||||
@ -31,50 +101,11 @@ public class CoreModel implements MainContract.MainModel {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<FirstLevelModel> getFirstLevel() {
|
||||
final ArrayList<FirstLevelModel> firstLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<FirstLevelModel>> response = vrApi.getFirstLevel().execute();
|
||||
if(response.isSuccessful()) {
|
||||
firstLevelModels.addAll(response.body());
|
||||
public boolean getApiState() {
|
||||
if(vrApi != null) {
|
||||
return true;
|
||||
} else {
|
||||
errorSignal.emit(2);
|
||||
return false;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
errorSignal.emit(1);
|
||||
}
|
||||
return firstLevelModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<SecondLevelModel> getSecondLevelByParentID(int parentID) {
|
||||
final ArrayList<SecondLevelModel> secondLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<SecondLevelModel>> response = vrApi.getSecondLevel(parentID).execute();
|
||||
if(response.isSuccessful()) {
|
||||
secondLevelModels.addAll(response.body());
|
||||
} else {
|
||||
errorSignal.emit(2);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
errorSignal.emit(1);
|
||||
}
|
||||
return secondLevelModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ThirdLevelModel> getThirdLevelByParentID(int parentID) {
|
||||
final ArrayList<ThirdLevelModel> thirdLevelModels = new ArrayList<>();
|
||||
try {
|
||||
Response<List<ThirdLevelModel>> response = vrApi.getDetails(parentID).execute();
|
||||
if(response.isSuccessful()) {
|
||||
thirdLevelModels.addAll(response.body());
|
||||
} else {
|
||||
errorSignal.emit(2);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
errorSignal.emit(1);
|
||||
}
|
||||
return thirdLevelModels;
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,8 @@ import me.texy.treeview.TreeNode;
|
||||
import me.texy.treeview.base.BaseNodeViewBinder;
|
||||
import ru.volgorobot.vrcatalog.MainContract;
|
||||
import ru.volgorobot.vrcatalog.R;
|
||||
import ru.volgorobot.vrcatalog.additional.NetworkErrorException;
|
||||
import ru.volgorobot.vrcatalog.additional.ResultWithErrorCode;
|
||||
import ru.volgorobot.vrcatalog.model.CoreModel;
|
||||
import ru.volgorobot.vrcatalog.model.FirstLevelModel;
|
||||
import ru.volgorobot.vrcatalog.model.SecondLevelModel;
|
||||
@ -45,7 +47,7 @@ public class FirstLevelNodeViewBinder extends BaseNodeViewBinder {
|
||||
public void onNodeToggled(TreeNode treeNode, boolean expand) {
|
||||
if(expand) {
|
||||
FirstLevelModel firstLevelModel = (FirstLevelModel) treeNode.getValue();
|
||||
new AsyncTask<Void, Void, ArrayList<SecondLevelModel>>() {
|
||||
new AsyncTask<Void, Void, ResultWithErrorCode<ArrayList<SecondLevelModel>>>() {
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
super.onPreExecute();
|
||||
@ -53,24 +55,49 @@ public class FirstLevelNodeViewBinder extends BaseNodeViewBinder {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ArrayList<SecondLevelModel> doInBackground(Void... voids) {
|
||||
ArrayList<SecondLevelModel> secondLevelModels = coreModel.getSecondLevelByParentID(firstLevelModel.getID());
|
||||
return secondLevelModels;
|
||||
protected ResultWithErrorCode<ArrayList<SecondLevelModel>> doInBackground(Void... voids) {
|
||||
ArrayList<SecondLevelModel> secondLevelModels = null;
|
||||
try {
|
||||
secondLevelModels = coreModel.getSecondLevelByParentID(firstLevelModel.getID());
|
||||
} catch (NetworkErrorException networkErrorException) {
|
||||
return new ResultWithErrorCode<>(secondLevelModels, networkErrorException.getErrorCode());
|
||||
} catch (NullPointerException nullPointerException) {
|
||||
return new ResultWithErrorCode<>(secondLevelModels, 3);
|
||||
}
|
||||
|
||||
return new ResultWithErrorCode<>(secondLevelModels, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(ArrayList<SecondLevelModel> secondLevelModels) {
|
||||
super.onPostExecute(secondLevelModels);
|
||||
protected void onPostExecute(ResultWithErrorCode<ArrayList<SecondLevelModel>> result) {
|
||||
super.onPostExecute(result);
|
||||
switch (result.getErrorCode()) {
|
||||
case 0: {
|
||||
ArrayList<TreeNode> treeNodes = new ArrayList<>();
|
||||
for (int i = 0; i < secondLevelModels.size(); i++) {
|
||||
TreeNode treeNode1 = new TreeNode(secondLevelModels.get(i));
|
||||
for (int i = 0; i < result.getData().size(); i++) {
|
||||
TreeNode treeNode1 = new TreeNode(result.getData().get(i));
|
||||
treeNode1.setLevel(1);
|
||||
treeNodes.add(treeNode1);
|
||||
}
|
||||
treeNode.setChildren(treeNodes);
|
||||
mView.refreshTree();
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
imageView.animate().rotation(90).setDuration(200).start();
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
mView.onFailureAnswer(1);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
mView.onFailureAnswer(2);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
mView.onFailureAnswer(3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
}
|
||||
}.execute();
|
||||
} else {
|
||||
|
@ -12,6 +12,8 @@ import me.texy.treeview.TreeNode;
|
||||
import me.texy.treeview.base.BaseNodeViewBinder;
|
||||
import ru.volgorobot.vrcatalog.MainContract;
|
||||
import ru.volgorobot.vrcatalog.R;
|
||||
import ru.volgorobot.vrcatalog.additional.NetworkErrorException;
|
||||
import ru.volgorobot.vrcatalog.additional.ResultWithErrorCode;
|
||||
import ru.volgorobot.vrcatalog.model.CoreModel;
|
||||
import ru.volgorobot.vrcatalog.model.SecondLevelModel;
|
||||
import ru.volgorobot.vrcatalog.model.ThirdLevelModel;
|
||||
@ -29,7 +31,6 @@ public class SecondLevelNodeViewBinder extends BaseNodeViewBinder {
|
||||
imageView = (ImageView) itemView.findViewById(R.id.arrow_img);
|
||||
this.coreModel = new CoreModel(context);
|
||||
this.mView = mView;
|
||||
coreModel.errorSignal.connect(mView::onFailureAnswer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -47,7 +48,7 @@ public class SecondLevelNodeViewBinder extends BaseNodeViewBinder {
|
||||
public void onNodeToggled(TreeNode treeNode, boolean expand) {
|
||||
if(expand) {
|
||||
SecondLevelModel secondLevelModel = (SecondLevelModel) treeNode.getValue();
|
||||
new AsyncTask<Void, Void, ArrayList<ThirdLevelModel>>() {
|
||||
new AsyncTask<Void, Void, ResultWithErrorCode<ArrayList<ThirdLevelModel>>>() {
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
super.onPreExecute();
|
||||
@ -55,24 +56,48 @@ public class SecondLevelNodeViewBinder extends BaseNodeViewBinder {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ArrayList<ThirdLevelModel> doInBackground(Void... voids) {
|
||||
ArrayList<ThirdLevelModel> thirdLevelModels = coreModel.getThirdLevelByParentID(secondLevelModel.getID());
|
||||
return thirdLevelModels;
|
||||
protected ResultWithErrorCode<ArrayList<ThirdLevelModel>> doInBackground(Void... voids) {
|
||||
ArrayList<ThirdLevelModel> thirdLevelModels = null;
|
||||
try {
|
||||
thirdLevelModels = coreModel.getThirdLevelByParentID(secondLevelModel.getID());
|
||||
} catch (NetworkErrorException networkErrorException) {
|
||||
return new ResultWithErrorCode<>(thirdLevelModels, networkErrorException.getErrorCode());
|
||||
} catch (NullPointerException nullPointerException) {
|
||||
return new ResultWithErrorCode<>(thirdLevelModels, 3);
|
||||
}
|
||||
return new ResultWithErrorCode<>(thirdLevelModels, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(ArrayList<ThirdLevelModel> thirdLevelModels) {
|
||||
super.onPostExecute(thirdLevelModels);
|
||||
protected void onPostExecute(ResultWithErrorCode<ArrayList<ThirdLevelModel>> result) {
|
||||
super.onPostExecute(result);
|
||||
switch (result.getErrorCode()) {
|
||||
case 0: {
|
||||
ArrayList<TreeNode> treeNodes = new ArrayList<>();
|
||||
for (int i = 0; i < thirdLevelModels.size(); i++) {
|
||||
TreeNode treeNode1 = new TreeNode(thirdLevelModels.get(i));
|
||||
for (int i = 0; i < result.getData().size(); i++) {
|
||||
TreeNode treeNode1 = new TreeNode(result.getData().get(i));
|
||||
treeNode1.setLevel(2);
|
||||
treeNodes.add(treeNode1);
|
||||
}
|
||||
treeNode.setChildren(treeNodes);
|
||||
mView.refreshTree();
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
imageView.animate().rotation(90).setDuration(200).start();
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
mView.onFailureAnswer(1);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
mView.onFailureAnswer(2);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
mView.onFailureAnswer(3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mView.swipeLayoutSetRefreshing(false);
|
||||
}
|
||||
}.execute();
|
||||
} else {
|
||||
|
@ -5,6 +5,7 @@ buildscript {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||
@ -19,6 +20,7 @@ allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user