package com.quinn.githubknife.interactor; import android.content.Context; import android.util.Log; import com.quinn.githubknife.R; import com.quinn.githubknife.account.GitHubAccount; import com.quinn.githubknife.listener.OnLoadRepoListener; import com.quinn.githubknife.model.GithubService; import com.quinn.githubknife.model.RetrofitUtil; import com.quinn.httpknife.github.Branch; import com.quinn.httpknife.github.Empty; import com.quinn.httpknife.github.Repository; import java.util.List; import retrofit.Call; import retrofit.Callback; import retrofit.Response; import retrofit.Retrofit; /** * Created by Quinn on 8/1/15. */ public class RepoInteractorImpl implements RepoInteractor{ private final static String TAG = RepoInteractorImpl.class.getSimpleName(); private final static int STAR_STATE = 1; private final static int FAIL = 2; private final static int FORK_RESULT = 3; private final static int BRANCHES = 4; private Context context; private GitHubAccount gitHubAccount; private OnLoadRepoListener listener; private GithubService service; public RepoInteractorImpl(Context context, final OnLoadRepoListener listener){ this.context = context; this.listener = listener; this.service = RetrofitUtil.getJsonRetrofitInstance(context).create(GithubService.class); this.gitHubAccount = GitHubAccount.getInstance(context); } @Override public void hasStar(final String owner, final String repo) { Call<Empty> call = service.hasStar(owner, repo); call.enqueue(new Callback<Empty>() { @Override public void onResponse(Response<Empty> response, Retrofit retrofit) { if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); star(owner,repo); } if (response.code() == 204) { listener.setStarState(true); } else { listener.setStarState(false); } } @Override public void onFailure(Throwable t) { listener.onError(context.getString(R.string.fail_unfollow) + repo); } }); } @Override public void star(final String owner, final String repo) { Call<Empty> call = service.star(owner, repo); call.enqueue(new Callback<Empty>() { @Override public void onResponse(Response<Empty> response, Retrofit retrofit) { if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); star(owner, repo); } if (response.code() == 204) { listener.setStarState(true); } else { listener.onError(context.getString(R.string.fail_unfollow) + repo); } } @Override public void onFailure(Throwable t) { listener.onError(context.getString(R.string.fail_unfollow) + repo); } }); } @Override public void unStar(final String owner, final String repo) { Call<Empty> call = service.unStar(owner, repo); call.enqueue(new Callback<Empty>() { @Override public void onResponse(Response<Empty> response, Retrofit retrofit) { if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); star(owner, repo); } if (response.code() == 204) { listener.setStarState(false); } else { listener.onError(context.getString(R.string.fail_unfollow) + repo); } } @Override public void onFailure(Throwable t) { listener.onError(context.getString(R.string.fail_unfollow) + repo); } }); } @Override public void fork(final String owner, final String repo) { Call<List<Repository>> call = service.fork(owner, repo); call.enqueue(new Callback<List<Repository>>() { @Override public void onResponse(Response<List<Repository>> response, Retrofit retrofit) { RetrofitUtil.printResponse(response); if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); fork(owner, repo); } if (response.isSuccess()) { listener.forkResult(true); } else { listener.forkResult(false); } } @Override public void onFailure(Throwable t) { RetrofitUtil.printThrowable(t); listener.forkResult(false); } }); } @Override public void loadBranches(final String owner, final String repo) { final Call<List<Branch>> call = service.getBranches(owner, repo); call.enqueue(new Callback<List<Branch>>() { @Override public void onResponse(Response<List<Branch>> response, Retrofit retrofit) { RetrofitUtil.printResponse(response); if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); loadBranches(owner, repo); } else if (response.isSuccess()) { listener.setBranches(response.body()); } else { listener.onError("加载分支失败"); } } @Override public void onFailure(Throwable t) { listener.onError("加载分支失败"); } }); } @Override public void loadRepo(final String owner, final String repo) { Call<Repository> call = service.repo(owner, repo); call.enqueue(new Callback<Repository>() { @Override public void onResponse(Response<Repository> response, Retrofit retrofit) { if (response.code() == 401) { gitHubAccount.invalidateToken(RetrofitUtil.token); loadRepo(owner,repo); } Log.i(TAG, "loadRepo " + response.body()); listener.setRepo(response.body()); } @Override public void onFailure(Throwable t) { listener.onError(context.getString(R.string.network_error) + repo); } }); } }