caching repo files directory to access them faster, fix for issue labeling where it might be displayed if the user is not the owner of the repo.

This commit is contained in:
Kosh 2017-02-23 22:49:17 +08:00
parent 831568c9b9
commit 3fd6c597c0
5 changed files with 50 additions and 10 deletions

View File

@ -38,6 +38,10 @@ interface RepoFilesMvp {
void onCallApi();
void onInitDataAndRequest(@NonNull String login, @NonNull String repoId, @Nullable String path);
@Nullable ArrayList<RepoFilesModel> getCachedFiles(@NonNull String url);
void cacheFiles(@NonNull String url, @NonNull ArrayList<RepoFilesModel> files);
}

View File

@ -9,10 +9,13 @@ import com.annimon.stream.Stream;
import com.fastaccess.R;
import com.fastaccess.data.dao.RepoFilesModel;
import com.fastaccess.data.dao.types.FilesType;
import com.fastaccess.helper.Logger;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import rx.Observable;
@ -22,6 +25,7 @@ import rx.Observable;
class RepoFilesPresenter extends BasePresenter<RepoFilesMvp.View> implements RepoFilesMvp.Presenter {
private ArrayList<RepoFilesModel> files = new ArrayList<>();
private HashMap<String, ArrayList<RepoFilesModel>> cachedFiles = new LinkedHashMap<>();
private String repoId;
private String login;
private String path;
@ -62,21 +66,42 @@ class RepoFilesPresenter extends BasePresenter<RepoFilesMvp.View> implements Rep
if (repoId == null || login == null) return;
makeRestCall(RestProvider.getRepoService().getRepoFiles(login, repoId, path),
response -> {
getFiles().clear();
files.clear();
manageSubscription(RepoFilesModel.save(response.getItems(), login, repoId).subscribe());
getFiles().addAll(Stream.of(response.getItems()).sortBy(model -> model.getType() == FilesType.file)
.collect(com.annimon.stream.Collectors.toList()));
ArrayList<RepoFilesModel> repoFilesModels = Stream.of(response.getItems())
.sortBy(model -> model.getType() == FilesType.file)
.collect(com.annimon.stream.Collectors.toCollection(ArrayList::new));
cachedFiles.put(path, repoFilesModels);
files.addAll(repoFilesModels);
sendToView(RepoFilesMvp.View::onNotifyAdapter);
});
}
@Override public void onInitDataAndRequest(@NonNull String login, @NonNull String repoId, @Nullable String path) {
this.login = login;
this.repoId = repoId;
if (!Objects.toString(path, "").equalsIgnoreCase(this.path)) {
this.path = Objects.toString(path, "");
onCallApi();
ArrayList<RepoFilesModel> cachedFiles = getCachedFiles(Objects.toString(path, ""));
if (cachedFiles != null && !cachedFiles.isEmpty()) {
Logger.e(files.size());
files.clear();
files.addAll(cachedFiles);
Logger.e(files.size(), cachedFiles.size());
sendToView(RepoFilesMvp.View::onNotifyAdapter);
} else {
this.login = login;
this.repoId = repoId;
if (!Objects.toString(path, "").equalsIgnoreCase(this.path)) {
this.path = Objects.toString(path, "");
onCallApi();
}
}
}
@Nullable @Override public ArrayList<RepoFilesModel> getCachedFiles(@NonNull String url) {
return cachedFiles.get(url);
}
@Override public void cacheFiles(@NonNull String url, @NonNull ArrayList<RepoFilesModel> files) {
Logger.e(url, files);
cachedFiles.put(url, files);
}
}

View File

@ -41,6 +41,8 @@ interface IssuePagerMvp {
boolean isOwner();
boolean isRepoOwner();
boolean isLocked();
void onHandleConfirmDialog(@Nullable Bundle bundle);

View File

@ -93,6 +93,15 @@ class IssuePagerPresenter extends BasePresenter<IssuePagerMvp.View> implements I
|| (parser != null && parser.getLogin().equalsIgnoreCase(me.getLogin()));
}
@Override public boolean isRepoOwner() {
if (getIssue() == null) return false;
UserModel userModel = getIssue() != null ? getIssue().getUser() : null;
LoginModel me = LoginModel.getUser();
PullsIssuesParser parser = PullsIssuesParser.getForPullRequest(getIssue().getHtmlUrl());
return userModel != null && userModel.getLogin().equalsIgnoreCase(me.getLogin())
|| (parser != null && parser.getLogin().equalsIgnoreCase(me.getLogin()));
}
@Override public boolean isLocked() {
return getIssue() != null && getIssue().isLocked();
}

View File

@ -116,7 +116,7 @@ public class IssuePagerView extends BaseActivity<IssuePagerMvp.View, IssuePagerP
getMenuInflater().inflate(R.menu.issue_menu, menu);
menu.findItem(R.id.closeIssue).setVisible(getPresenter().isOwner());
menu.findItem(R.id.lockIssue).setVisible(getPresenter().isOwner());
menu.findItem(R.id.labels).setVisible(getPresenter().isOwner());
menu.findItem(R.id.labels).setVisible(getPresenter().isRepoOwner());
return super.onCreateOptionsMenu(menu);
}
@ -154,7 +154,7 @@ public class IssuePagerView extends BaseActivity<IssuePagerMvp.View, IssuePagerP
Logger.e(isOwner);
menu.findItem(R.id.closeIssue).setVisible(isOwner);
menu.findItem(R.id.lockIssue).setVisible(isOwner);
menu.findItem(R.id.labels).setVisible(isOwner);
menu.findItem(R.id.labels).setVisible(getPresenter().isRepoOwner());
if (isOwner) {
//noinspection ConstantConditions ( getIssue at this stage is not null but AS doesn't know. )
closeIssue.setTitle(getPresenter().getIssue().getState() == IssueState.closed ? getString(R.string.re_open) : getString(R.string.close));