Skip to content
Snippets Groups Projects
Commit 200b1f67 authored by John Carlson's avatar John Carlson
Browse files

Rx'ify everything

parent 14e63a9e
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 1289 additions and 979 deletions
Loading
Loading
@@ -127,7 +127,7 @@ dependencies {
compile 'com.github.alorma:diff-textview:1.3.0'
compile 'com.wdullaer:materialdatetimepicker:2.5.0'
compile 'com.wefika:flowlayout:0.4.1'
compile 'com.github.novoda:simple-chrome-custom-tabs:0.1.3-rc1'
compile 'com.github.novoda:simple-chrome-custom-tabs:0.1.4'
compile 'com.afollestad.material-dialogs:core:0.9.1.0'
compile 'com.afollestad.material-dialogs:commons:0.9.1.0'
compile 'de.hdodenhof:circleimageview:2.1.0'
Loading
Loading
Loading
Loading
@@ -9,14 +9,12 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gimbal.Gimbal;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
Loading
Loading
@@ -37,7 +35,9 @@ import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.hdodenhof.circleimageview.CircleImageView;
import retrofit2.Callback;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -91,22 +91,6 @@ public class AboutActivity extends BaseActivity {
}
};
 
private Callback<List<Contributor>> mContributorResponseCallback = new EasyCallback<List<Contributor>>() {
@Override
public void success(@NonNull List<Contributor> response) {
mProgress.setVisibility(View.GONE);
addContributors(Contributor.groupContributors(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.failed_to_load_contributors, Snackbar.LENGTH_SHORT)
.show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -125,7 +109,29 @@ public class AboutActivity extends BaseActivity {
mPhysicsLayout.getPhysics().enableFling();
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
App.get().getGitLab().getContributors(REPO_ID).enqueue(mContributorResponseCallback);
App.get().getGitLab().getContributors(REPO_ID)
.compose(this.<List<Contributor>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Contributor>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.failed_to_load_contributors, Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(List<Contributor> contributors) {
mProgress.setVisibility(View.GONE);
addContributors(Contributor.groupContributors(contributors));
}
});
mProgress.setVisibility(View.VISIBLE);
}
 
Loading
Loading
Loading
Loading
@@ -4,7 +4,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
Loading
Loading
@@ -20,8 +19,6 @@ import android.widget.Spinner;
import android.widget.TextView;
 
import com.commit451.adapterflowlayout.AdapterFlowLayout;
import com.commit451.easycallback.EasyCallback;
import com.commit451.easycallback.NullBodyException;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.AddIssueLabelAdapter;
Loading
Loading
@@ -46,7 +43,12 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.adapter.rxjava.HttpException;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -103,103 +105,6 @@ public class AddIssueActivity extends MorphActivity {
Issue mIssue;
HashSet<Member> mMembers;
 
private final Callback<List<Milestone>> mMilestonesCallback = new EasyCallback<List<Milestone>>() {
@Override
public void success(@NonNull List<Milestone> response) {
mMilestoneProgress.setVisibility(View.GONE);
mMilestoneSpinner.setVisibility(View.VISIBLE);
MilestoneSpinnerAdapter milestoneSpinnerAdapter = new MilestoneSpinnerAdapter(AddIssueActivity.this, response);
mMilestoneSpinner.setAdapter(milestoneSpinnerAdapter);
if (mIssue != null) {
mMilestoneSpinner.setSelection(milestoneSpinnerAdapter.getSelectedItemPosition(mIssue.getMilestone()));
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mMilestoneProgress.setVisibility(View.GONE);
mMilestoneSpinner.setVisibility(View.GONE);
}
};
private final Callback<List<Member>> mAssigneeCallback = new EasyCallback<List<Member>>() {
@Override
public void success(@NonNull List<Member> response) {
mMembers.addAll(response);
if (mProject.belongsToGroup()) {
Timber.d("Project belongs to a group, loading those users too");
App.get().getGitLab().getGroupMembers(mProject.getNamespace().getId()).enqueue(mGroupMembersCallback);
} else {
setAssignees();
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mAssigneeSpinner.setVisibility(View.GONE);
mAssigneeProgress.setVisibility(View.GONE);
}
};
private final Callback<List<Member>> mGroupMembersCallback = new EasyCallback<List<Member>>() {
@Override
public void success(@NonNull List<Member> response) {
mMembers.addAll(response);
setAssignees();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mAssigneeSpinner.setVisibility(View.GONE);
mAssigneeProgress.setVisibility(View.GONE);
}
};
private final Callback<List<Label>> mLabelCallback = new EasyCallback<List<Label>>() {
@Override
public void success(@NonNull List<Label> response) {
mLabelsProgress.setVisibility(View.GONE);
mRootAddLabels.setVisibility(View.VISIBLE);
setLabels(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
//null body could just mean no labels have been created for this project
if (t instanceof NullBodyException) {
setLabels(new ArrayList<Label>());
} else {
mListLabels.setVisibility(View.GONE);
mLabelsProgress.setVisibility(View.GONE);
mLabelLabel.setVisibility(View.GONE);
}
}
};
private final Callback<Issue> mIssueCreatedCallback = new EasyCallback<Issue>() {
@Override
public void success(@NonNull Issue response) {
if (mIssue == null) {
App.bus().post(new IssueCreatedEvent(response));
} else {
App.bus().post(new IssueChangedEvent(response));
}
dismiss();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
Snackbar.make(mRoot, getString(R.string.failed_to_create_issue), Snackbar.LENGTH_SHORT)
.show();
}
};
@OnClick(R.id.text_add_labels)
void onAddLabelClicked() {
Navigator.navigateToAddLabels(this, mProject, REQUEST_LABEL);
Loading
Loading
@@ -269,9 +174,116 @@ public class AddIssueActivity extends MorphActivity {
}
 
private void load() {
App.get().getGitLab().getMilestones(mProject.getId(), getString(R.string.milestone_state_value_default)).enqueue(mMilestonesCallback);
App.get().getGitLab().getProjectMembers(mProject.getId()).enqueue(mAssigneeCallback);
App.get().getGitLab().getLabels(mProject.getId()).enqueue(mLabelCallback);
App.get().getGitLab().getMilestones(mProject.getId(), getString(R.string.milestone_state_value_default))
.compose(this.<Response<List<Milestone>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Milestone>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mMilestoneProgress.setVisibility(View.GONE);
mMilestoneSpinner.setVisibility(View.GONE);
}
@Override
public void onNext(Response<List<Milestone>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mMilestoneProgress.setVisibility(View.GONE);
mMilestoneSpinner.setVisibility(View.VISIBLE);
MilestoneSpinnerAdapter milestoneSpinnerAdapter = new MilestoneSpinnerAdapter(AddIssueActivity.this, listResponse.body());
mMilestoneSpinner.setAdapter(milestoneSpinnerAdapter);
if (mIssue != null) {
mMilestoneSpinner.setSelection(milestoneSpinnerAdapter.getSelectedItemPosition(mIssue.getMilestone()));
}
}
});
App.get().getGitLab().getProjectMembers(mProject.getId())
.compose(this.<Response<List<Member>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Member>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mAssigneeSpinner.setVisibility(View.GONE);
mAssigneeProgress.setVisibility(View.GONE);
}
@Override
public void onNext(Response<List<Member>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mMembers.addAll(listResponse.body());
if (mProject.belongsToGroup()) {
Timber.d("Project belongs to a group, loading those users too");
App.get().getGitLab().getGroupMembers(mProject.getNamespace().getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Member>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mAssigneeSpinner.setVisibility(View.GONE);
mAssigneeProgress.setVisibility(View.GONE);
}
@Override
public void onNext(Response<List<Member>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mMembers.addAll(listResponse.body());
setAssignees();
}
});
} else {
setAssignees();
}
}
});
App.get().getGitLab().getLabels(mProject.getId())
.compose(this.<List<Label>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Label>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mListLabels.setVisibility(View.GONE);
mLabelsProgress.setVisibility(View.GONE);
mLabelLabel.setVisibility(View.GONE);
}
@Override
public void onNext(List<Label> labels) {
mLabelsProgress.setVisibility(View.GONE);
mRootAddLabels.setVisibility(View.VISIBLE);
setLabels(labels);
}
});
}
 
private void showLoading() {
Loading
Loading
@@ -395,22 +407,49 @@ public class AddIssueActivity extends MorphActivity {
private void createOrSaveIssue(String title, String description, @Nullable Long assigneeId,
@Nullable Long milestoneId, @Nullable String labels) {
if (mIssue == null) {
App.get().getGitLab().createIssue(
observeUpdate(App.get().getGitLab().createIssue(
mProject.getId(),
title,
description,
assigneeId,
milestoneId,
labels).enqueue(mIssueCreatedCallback);
labels));
} else {
App.get().getGitLab().updateIssue(mProject.getId(),
observeUpdate(App.get().getGitLab().updateIssue(mProject.getId(),
mIssue.getId(),
title,
description,
assigneeId,
milestoneId,
labels).enqueue(mIssueCreatedCallback);
labels));
}
}
 
private void observeUpdate(Observable<Issue> observable) {
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Issue>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
Snackbar.make(mRoot, getString(R.string.failed_to_create_issue), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Issue issue) {
if (mIssue == null) {
App.bus().post(new IssueCreatedEvent(issue));
} else {
App.bus().post(new IssueChangedEvent(issue));
}
dismiss();
}
});
}
}
\ No newline at end of file
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
Loading
Loading
@@ -13,7 +12,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.LabelAdapter;
Loading
Loading
@@ -27,6 +25,9 @@ import java.util.List;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -118,23 +119,31 @@ public class AddLabelActivity extends BaseActivity {
}
}
});
App.get().getGitLab().getLabels(mProjectId).enqueue(new EasyCallback<List<Label>>() {
@Override
public void success(@NonNull List<Label> response) {
mSwipeRefreshLayout.setRefreshing(false);
if (response.isEmpty()) {
mTextMessage.setVisibility(View.VISIBLE);
}
mLabelAdapter.setItems(response);
}
@Override
public void failure(Throwable t) {
mSwipeRefreshLayout.setRefreshing(false);
mTextMessage.setVisibility(View.VISIBLE);
Timber.e(t);
}
});
App.get().getGitLab().getLabels(mProjectId)
.compose(this.<List<Label>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Label>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
mTextMessage.setVisibility(View.VISIBLE);
}
@Override
public void onNext(List<Label> labels) {
mSwipeRefreshLayout.setRefreshing(false);
if (labels.isEmpty()) {
mTextMessage.setVisibility(View.VISIBLE);
}
mLabelAdapter.setItems(labels);
}
});
}
 
@Override
Loading
Loading
Loading
Loading
@@ -4,7 +4,6 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.widget.Toolbar;
Loading
Loading
@@ -16,7 +15,6 @@ import android.widget.EditText;
import android.widget.FrameLayout;
 
import com.commit451.easel.Easel;
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.event.MilestoneChangedEvent;
Loading
Loading
@@ -33,7 +31,10 @@ import java.util.Date;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
public class AddMilestoneActivity extends MorphActivity {
Loading
Loading
@@ -109,27 +110,6 @@ public class AddMilestoneActivity extends MorphActivity {
}
};
 
private Callback<Milestone> mMilestoneCallback = new EasyCallback<Milestone>() {
@Override
public void success(@NonNull Milestone response) {
mProgress.setVisibility(View.GONE);
if (mMilestone == null) {
App.bus().post(new MilestoneCreatedEvent(response));
} else {
App.bus().post(new MilestoneChangedEvent(response));
}
finish();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
showError();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -175,20 +155,49 @@ public class AddMilestoneActivity extends MorphActivity {
}
 
if (mMilestone == null) {
App.get().getGitLab().createMilestone(mProjectId,
createOrEditMilestone(App.get().getGitLab().createMilestone(mProjectId,
mTitle.getText().toString(),
mDescription.getText().toString(),
dueDate).enqueue(mMilestoneCallback);
dueDate));
} else {
App.get().getGitLab().editMilestone(mProjectId,
createOrEditMilestone(App.get().getGitLab().editMilestone(mProjectId,
mMilestone.getId(),
mTitle.getText().toString(),
mDescription.getText().toString(),
dueDate).enqueue(mMilestoneCallback);
dueDate));
}
 
}
 
private void createOrEditMilestone(Observable<Milestone> observable) {
observable.subscribeOn(Schedulers.io())
.compose(this.<Milestone>bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Milestone>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
showError();
}
@Override
public void onNext(Milestone milestone) {
mProgress.setVisibility(View.GONE);
if (mMilestone == null) {
App.bus().post(new MilestoneCreatedEvent(milestone));
} else {
App.bus().post(new MilestoneChangedEvent(milestone));
}
finish();
}
});
}
private void showError() {
Snackbar.make(mRoot, getString(R.string.failed_to_create_milestone), Snackbar.LENGTH_SHORT)
.show();
Loading
Loading
Loading
Loading
@@ -18,8 +18,6 @@ import android.widget.ImageView;
import android.widget.TextView;
 
import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.commit451.easycallback.EasyCallback;
import com.commit451.easycallback.HttpException;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.Label;
Loading
Loading
@@ -31,6 +29,9 @@ import org.parceler.Parcels;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -63,29 +64,6 @@ public class AddNewLabelActivity extends BaseActivity implements ColorChooserDia
 
int mChosenColor = -1;
 
private final EasyCallback<Label> mCreateLabelCallback = new EasyCallback<Label>() {
@Override
public void success(@NonNull Label response) {
Intent data = new Intent();
data.putExtra(KEY_NEW_LABEL, Parcels.wrap(response));
setResult(RESULT_OK, data);
finish();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
if (t instanceof HttpException && ((HttpException) t).response().code() == 409) {
Snackbar.make(mRoot, R.string.label_already_exists, Snackbar.LENGTH_SHORT)
.show();
} else {
Snackbar.make(mRoot, R.string.failed_to_create_label, Snackbar.LENGTH_SHORT)
.show();
}
}
};
@OnClick(R.id.root_color)
void onChooseColorClicked() {
// Pass AppCompatActivity which implements ColorCallback, along with the title of the dialog
Loading
Loading
@@ -153,7 +131,35 @@ public class AddNewLabelActivity extends BaseActivity implements ColorChooserDia
mProgress.setAlpha(0.0f);
mProgress.animate().alpha(1.0f);
App.get().getGitLab().createLabel(getProjectId(), title, color, description)
.enqueue(mCreateLabelCallback);
.compose(this.<Label>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Label>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
if (e instanceof retrofit2.adapter.rxjava.HttpException && ((retrofit2.adapter.rxjava.HttpException) e).response().code() == 409) {
Snackbar.make(mRoot, R.string.label_already_exists, Snackbar.LENGTH_SHORT)
.show();
} else {
Snackbar.make(mRoot, R.string.failed_to_create_label, Snackbar.LENGTH_SHORT)
.show();
}
}
@Override
public void onNext(Label label) {
Intent data = new Intent();
data.putExtra(KEY_NEW_LABEL, Parcels.wrap(label));
setResult(RESULT_OK, data);
finish();
}
});
}
}
}
Loading
Loading
@@ -4,7 +4,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
Loading
Loading
@@ -19,8 +18,6 @@ import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.easycallback.HttpException;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.UsersAdapter;
Loading
Loading
@@ -41,7 +38,12 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.adapter.rxjava.HttpException;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -168,76 +170,9 @@ public class AddUserActivity extends MorphActivity {
public void onAccessApplied(int accessLevel) {
mAccessDialog.showLoading();
if (mGroup == null) {
App.get().getGitLab().addProjectMember(
mProjectId,
mSelectedUser.getId(),
accessLevel).enqueue(mAddGroupMemeberCallback);
add(App.get().getGitLab().addProjectMember(mProjectId, mSelectedUser.getId(), accessLevel));
} else {
App.get().getGitLab().addGroupMember(mGroup.getId(),
mSelectedUser.getId(),
accessLevel).enqueue(mAddGroupMemeberCallback);
}
}
};
private final Callback<List<UserBasic>> mUserCallback = new EasyCallback<List<UserBasic>>() {
@Override
public void success(@NonNull List<UserBasic> response) {
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
mAdapter.setData(response);
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
Timber.d("Next page url is %s", mNextPageUrl);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
Snackbar.make(mRoot, getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
}
};
private final Callback<List<UserBasic>> mMoreUsersCallback = new EasyCallback<List<UserBasic>>() {
@Override
public void success(@NonNull List<UserBasic> response) {
mLoading = false;
mAdapter.setLoading(false);
mAdapter.addData(response);
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mAdapter.setLoading(false);
}
};
private final Callback<Member> mAddGroupMemeberCallback = new EasyCallback<Member>() {
@Override
public void success(@NonNull Member response) {
Snackbar.make(mRoot, R.string.user_added_successfully, Snackbar.LENGTH_SHORT)
.show();
mAccessDialog.dismiss();
dismiss();
App.bus().post(new MemberAddedEvent(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
if (t instanceof HttpException) {
//Conflict
if (((HttpException) t).response().code() == 409) {
Snackbar.make(mRoot, R.string.error_user_conflict, Snackbar.LENGTH_SHORT)
.show();
}
} else {
Snackbar.make(mRoot, R.string.error_failed_to_add_user, Snackbar.LENGTH_SHORT)
.show();
add(App.get().getGitLab().addGroupMember(mProjectId, mSelectedUser.getId(), accessLevel));
}
}
};
Loading
Loading
@@ -275,13 +210,105 @@ public class AddUserActivity extends MorphActivity {
mTeleprinter.hideKeyboard();
mSwipeRefreshLayout.setRefreshing(true);
mLoading = true;
App.get().getGitLab().searchUsers(mSearchQuery).enqueue(mUserCallback);
App.get().getGitLab().searchUsers(mSearchQuery)
.compose(this.<Response<List<UserBasic>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<UserBasic>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
Snackbar.make(mRoot, getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Response<List<UserBasic>> response) {
if (!response.isSuccessful()) {
onError(new HttpException(response));
return;
}
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
mAdapter.setData(response.body());
mNextPageUrl = LinkHeaderParser.parse(response).getNext();
Timber.d("Next page url is %s", mNextPageUrl);
}
});
}
 
private void loadMore() {
mLoading = true;
mAdapter.setLoading(true);
Timber.d("loadMore " + mNextPageUrl.toString() + " " + mSearchQuery);
App.get().getGitLab().searchUsers(mNextPageUrl.toString(), mSearchQuery).enqueue(mMoreUsersCallback);
App.get().getGitLab().searchUsers(mNextPageUrl.toString(), mSearchQuery)
.compose(this.<Response<List<UserBasic>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<UserBasic>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mAdapter.setLoading(false);
}
@Override
public void onNext(Response<List<UserBasic>> response) {
if (!response.isSuccessful()) {
onError(new HttpException(response));
return;
}
mLoading = false;
mAdapter.setLoading(false);
mAdapter.addData(response.body());
mNextPageUrl = LinkHeaderParser.parse(response).getNext();
}
});
}
private void add(Observable<Response<Member>> observable) {
observable.subscribeOn(Schedulers.io())
.compose(this.<Response<Member>>bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<Member>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
Snackbar.make(mRoot, R.string.error_failed_to_add_user, Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Response<Member> response) {
if (response.isSuccessful()) {
Snackbar.make(mRoot, R.string.user_added_successfully, Snackbar.LENGTH_SHORT)
.show();
mAccessDialog.dismiss();
dismiss();
App.bus().post(new MemberAddedEvent(response.body()));
} else {
if (response.code() == 409) {
Snackbar.make(mRoot, R.string.error_user_conflict, Snackbar.LENGTH_SHORT)
.show();
} else {
onError(new Exception("Does not matter"));
}
}
}
});
}
}
Loading
Loading
@@ -5,13 +5,11 @@ import android.animation.Animator;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.FileUploadResponse;
Loading
Loading
@@ -30,6 +28,7 @@ import io.codetail.animation.ViewAnimationUtils;
import okhttp3.MultipartBody;
import pl.aprilapps.easyphotopicker.DefaultCallback;
import pl.aprilapps.easyphotopicker.EasyImage;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
Loading
Loading
@@ -59,22 +58,6 @@ public class AttachActivity extends BaseActivity {
 
Project mProject;
 
private final EasyCallback<FileUploadResponse> mUploadCallback = new EasyCallback<FileUploadResponse>() {
@Override
public void success(@NonNull FileUploadResponse response) {
Intent data = new Intent();
data.putExtra(KEY_FILE_UPLOAD_RESPONSE, Parcels.wrap(response));
setResult(RESULT_OK, data);
finish();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
finish();
}
};
@OnClick(R.id.root)
void onRootClicked() {
onBackPressed();
Loading
Loading
@@ -112,7 +95,7 @@ public class AttachActivity extends BaseActivity {
Animator animator = ViewAnimationUtils
.createCircularReveal(mCard, 0, mCard.getHeight(), 0, finalRadius);
animator.setDuration(500);
animator.setInterpolator( new AccelerateDecelerateInterpolator());
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.start();
}
});
Loading
Loading
@@ -164,7 +147,29 @@ public class AttachActivity extends BaseActivity {
.subscribe(new Action1<MultipartBody.Part>() {
@Override
public void call(MultipartBody.Part part) {
App.get().getGitLab().uploadFile(mProject.getId(), part).enqueue(mUploadCallback);
App.get().getGitLab().uploadFile(mProject.getId(), part)
.compose(AttachActivity.this.<FileUploadResponse>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<FileUploadResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
finish();
}
@Override
public void onNext(FileUploadResponse fileUploadResponse) {
Intent data = new Intent();
data.putExtra(KEY_FILE_UPLOAD_RESPONSE, Parcels.wrap(fileUploadResponse));
setResult(RESULT_OK, data);
finish();
}
});
}
});
}
Loading
Loading
Loading
Loading
@@ -16,7 +16,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.BuildSectionsPagerAdapter;
Loading
Loading
@@ -31,6 +30,9 @@ import org.parceler.Parcels;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -66,75 +68,93 @@ public class BuildActivity extends BaseActivity {
Project mProject;
Build mBuild;
 
private final EasyCallback<Build> mRetryCallback = new EasyCallback<Build>() {
@Override
public void success(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_started, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_retry_build, Snackbar.LENGTH_LONG)
.show();
}
};
private final EasyCallback<Build> mEraseCallback = new EasyCallback<Build>() {
@Override
public void success(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_erased, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_erase_build, Snackbar.LENGTH_LONG)
.show();
}
};
private final EasyCallback<Build> mCancelCallback = new EasyCallback<Build>() {
@Override
public void success(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_canceled, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_cancel_build, Snackbar.LENGTH_LONG)
.show();
}
};
private final Toolbar.OnMenuItemClickListener mOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_retry:
mProgress.setVisibility(View.VISIBLE);
App.get().getGitLab().retryBuild(mProject.getId(), mBuild.getId()).enqueue(mRetryCallback);
App.get().getGitLab().retryBuild(mProject.getId(), mBuild.getId())
.compose(BuildActivity.this.<Build>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Build>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_retry_build, Snackbar.LENGTH_LONG)
.show();
}
@Override
public void onNext(Build build) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_started, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(build));
}
});
return true;
case R.id.action_erase:
mProgress.setVisibility(View.VISIBLE);
App.get().getGitLab().eraseBuild(mProject.getId(), mBuild.getId()).enqueue(mEraseCallback);
App.get().getGitLab().eraseBuild(mProject.getId(), mBuild.getId())
.compose(BuildActivity.this.<Build>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Build>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_erase_build, Snackbar.LENGTH_LONG)
.show();
}
@Override
public void onNext(Build build) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_erased, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(build));
}
});
return true;
case R.id.action_cancel:
mProgress.setVisibility(View.VISIBLE);
App.get().getGitLab().cancelBuild(mProject.getId(), mBuild.getId()).enqueue(mCancelCallback);
App.get().getGitLab().cancelBuild(mProject.getId(), mBuild.getId())
.compose(BuildActivity.this.<Build>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Build>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_cancel_build, Snackbar.LENGTH_LONG)
.show();
}
@Override
public void onNext(Build build) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_canceled, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new BuildChangedEvent(build));
}
});
return true;
case R.id.action_download:
checkDownloadBuild();
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
Loading
Loading
@@ -12,7 +11,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.DiffAdapter;
Loading
Loading
@@ -26,7 +24,9 @@ import java.util.List;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -54,22 +54,6 @@ public class DiffActivity extends BaseActivity {
private Project mProject;
private RepositoryCommit mCommit;
 
private Callback<List<Diff>> mDiffCallback = new EasyCallback<List<Diff>>() {
@Override
public void success(@NonNull List<Diff> response) {
mSwipeRefreshLayout.setRefreshing(false);
mDiffAdapter.setData(response);
}
@Override
public void failure(Throwable t) {
mSwipeRefreshLayout.setRefreshing(false);
Timber.e(t);
mMessageText.setText(R.string.connection_error);
mMessageText.setVisibility(View.VISIBLE);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -116,6 +100,28 @@ public class DiffActivity extends BaseActivity {
}
}
});
App.get().getGitLab().getCommitDiff(mProject.getId(), mCommit.getId()).enqueue(mDiffCallback);
App.get().getGitLab().getCommitDiff(mProject.getId(), mCommit.getId())
.compose(this.<List<Diff>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Diff>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mSwipeRefreshLayout.setRefreshing(false);
Timber.e(e);
mMessageText.setText(R.string.connection_error);
mMessageText.setVisibility(View.VISIBLE);
}
@Override
public void onNext(List<Diff> diffs) {
mSwipeRefreshLayout.setRefreshing(false);
mDiffAdapter.setData(diffs);
}
});
}
}
\ No newline at end of file
Loading
Loading
@@ -21,7 +21,6 @@ import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.webkit.WebView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.RepositoryFile;
Loading
Loading
@@ -36,7 +35,6 @@ import java.nio.charset.Charset;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
Loading
Loading
@@ -53,7 +51,9 @@ public class FileActivity extends BaseActivity {
 
@Retention(RetentionPolicy.SOURCE)
@IntDef({OPTION_SAVE, OPTION_OPEN})
public @interface Option {}
public @interface Option {
}
public static final int OPTION_SAVE = 0;
public static final int OPTION_OPEN = 1;
 
Loading
Loading
@@ -65,10 +65,14 @@ public class FileActivity extends BaseActivity {
return intent;
}
 
@BindView(R.id.root) ViewGroup mRoot;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.file_blob) WebView mFileBlobView;
@BindView(R.id.progress) View mProgressView;
@BindView(R.id.root)
ViewGroup mRoot;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.file_blob)
WebView mFileBlobView;
@BindView(R.id.progress)
View mProgressView;
 
private long mProjectId;
private String mPath;
Loading
Loading
@@ -76,23 +80,9 @@ public class FileActivity extends BaseActivity {
private RepositoryFile mRepositoryFile;
private String mFileName;
private byte[] mBlob;
private @Option int mOption;
private final Callback<RepositoryFile> mRepositoryFileCallback = new EasyCallback<RepositoryFile>() {
@Override
public void success(@NonNull RepositoryFile response) {
mProgressView.setVisibility(View.GONE);
bindFile(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgressView.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.file_load_error, Snackbar.LENGTH_SHORT)
.show();
}
};
private
@Option
int mOption;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
Loading
Loading
@@ -114,7 +104,7 @@ public class FileActivity extends BaseActivity {
mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
switch (item.getItemId()) {
case R.id.action_open:
mOption = OPTION_OPEN;
checkAccountPermission();
Loading
Loading
@@ -133,7 +123,29 @@ public class FileActivity extends BaseActivity {
 
private void loadData() {
mProgressView.setVisibility(View.VISIBLE);
App.get().getGitLab().getFile(mProjectId, mPath, mRef).enqueue(mRepositoryFileCallback);
App.get().getGitLab().getFile(mProjectId, mPath, mRef)
.compose(this.<RepositoryFile>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<RepositoryFile>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgressView.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.file_load_error, Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(RepositoryFile repositoryFile) {
mProgressView.setVisibility(View.GONE);
bindFile(repositoryFile);
}
});
}
 
private void bindFile(RepositoryFile repositoryFile) {
Loading
Loading
@@ -155,7 +167,8 @@ public class FileActivity extends BaseActivity {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<byte[]>() {
@Override
public void onCompleted() {}
public void onCompleted() {
}
 
@Override
public void onError(Throwable e) {
Loading
Loading
Loading
Loading
@@ -7,7 +7,6 @@ import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
Loading
Loading
@@ -19,7 +18,6 @@ import android.widget.ImageView;
 
import com.commit451.alakazam.Alakazam;
import com.commit451.easel.Easel;
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.GroupPagerAdapter;
Loading
Loading
@@ -31,7 +29,9 @@ import org.parceler.Parcels;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -54,28 +54,20 @@ public class GroupActivity extends BaseActivity {
return intent;
}
 
@BindView(R.id.root) View mRoot;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbarLayout;
@BindView(R.id.viewpager) ViewPager mViewPager;
@BindView(R.id.tabs) TabLayout mTabLayout;
@BindView(R.id.backdrop) ImageView mBackdrop;
@BindView(R.id.progress) View mProgress;
private final Callback<GroupDetail> mGroupCallback = new EasyCallback<GroupDetail>() {
@Override
public void success(@NonNull GroupDetail response) {
mProgress.setVisibility(View.GONE);
bind(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
showError();
}
};
@BindView(R.id.root)
View mRoot;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.collapsing_toolbar)
CollapsingToolbarLayout mCollapsingToolbarLayout;
@BindView(R.id.viewpager)
ViewPager mViewPager;
@BindView(R.id.tabs)
TabLayout mTabLayout;
@BindView(R.id.backdrop)
ImageView mBackdrop;
@BindView(R.id.progress)
View mProgress;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
Loading
Loading
@@ -99,7 +91,28 @@ public class GroupActivity extends BaseActivity {
} else {
mProgress.setVisibility(View.VISIBLE);
long groupId = getIntent().getLongExtra(KEY_GROUP_ID, -1);
App.get().getGitLab().getGroup(groupId).enqueue(mGroupCallback);
App.get().getGitLab().getGroup(groupId)
.compose(this.<GroupDetail>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<GroupDetail>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
showError();
}
@Override
public void onNext(GroupDetail groupDetail) {
mProgress.setVisibility(View.GONE);
bind(groupDetail);
}
});
}
}
 
Loading
Loading
@@ -119,7 +132,8 @@ public class GroupActivity extends BaseActivity {
}
 
@Override
public void onError() {}
public void onError() {
}
});
 
mViewPager.setAdapter(new GroupPagerAdapter(this, getSupportFragmentManager(), group));
Loading
Loading
Loading
Loading
@@ -4,7 +4,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
Loading
Loading
@@ -13,7 +12,6 @@ import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.GroupAdapter;
Loading
Loading
@@ -30,7 +28,11 @@ import java.util.List;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -68,47 +70,6 @@ public class GroupsActivity extends BaseActivity {
}
};
 
private final Callback<List<Group>> mGroupsCallback = new EasyCallback<List<Group>>() {
@Override
public void success(@NonNull List<Group> response) {
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
if (response.isEmpty()) {
mMessageText.setText(R.string.no_groups);
mMessageText.setVisibility(View.VISIBLE);
mGroupRecyclerView.setVisibility(View.GONE);
} else {
mGroupAdapter.setGroups(response);
mMessageText.setVisibility(View.GONE);
mGroupRecyclerView.setVisibility(View.VISIBLE);
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.connection_error);
}
};
private final Callback<List<Group>> mMoreGroupsCallback = new EasyCallback<List<Group>>() {
@Override
public void success(@NonNull List<Group> response) {
mLoading = false;
mGroupAdapter.addGroups(response);
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mLoading = false;
}
};
private final GroupAdapter.Listener mGroupAdapterListener = new GroupAdapter.Listener() {
@Override
public void onGroupClicked(Group group, GroupViewHolder groupViewHolder) {
Loading
Loading
@@ -173,7 +134,44 @@ public class GroupsActivity extends BaseActivity {
mNextPageUrl = null;
mLoading = true;
 
App.get().getGitLab().getGroups().enqueue(mGroupsCallback);
App.get().getGitLab().getGroups()
.compose(this.<Response<List<Group>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Group>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.connection_error);
}
@Override
public void onNext(Response<List<Group>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
if (listResponse.body().isEmpty()) {
mMessageText.setText(R.string.no_groups);
mMessageText.setVisibility(View.VISIBLE);
mGroupRecyclerView.setVisibility(View.GONE);
} else {
mGroupAdapter.setGroups(listResponse.body());
mMessageText.setVisibility(View.GONE);
mGroupRecyclerView.setVisibility(View.VISIBLE);
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
}
}
});
}
 
private void loadMore() {
Loading
Loading
@@ -193,7 +191,32 @@ public class GroupsActivity extends BaseActivity {
mLoading = true;
 
Timber.d("loadMore called for %s", mNextPageUrl);
App.get().getGitLab().getGroups(mNextPageUrl.toString()).enqueue(mMoreGroupsCallback);
App.get().getGitLab().getGroups(mNextPageUrl.toString())
.compose(this.<Response<List<Group>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Group>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mLoading = false;
}
@Override
public void onNext(Response<List<Group>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mLoading = false;
mGroupAdapter.addGroups(listResponse.body());
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
}
});
}
 
private class EventReceiver {
Loading
Loading
Loading
Loading
@@ -4,7 +4,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
Loading
Loading
@@ -16,7 +15,6 @@ import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.IssueDetailsAdapter;
Loading
Loading
@@ -40,9 +38,12 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.adapter.rxjava.HttpException;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -125,149 +126,36 @@ public class IssueActivity extends BaseActivity {
closeOrOpenIssue();
return true;
case R.id.action_delete:
App.get().getGitLab().deleteIssue(mProject.getId(), mIssue.getId()).enqueue(mDeleteIssueCallback);
App.get().getGitLab().deleteIssue(mProject.getId(), mIssue.getId())
.compose(IssueActivity.this.<String>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
Snackbar.make(mRoot, getString(R.string.failed_to_delete_issue), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(String s) {
App.bus().post(new IssueReloadEvent());
Toast.makeText(IssueActivity.this, R.string.issue_deleted, Toast.LENGTH_SHORT)
.show();
finish();
}
});
return true;
}
return false;
}
};
 
private Callback<Project> mProjectCallback = new EasyCallback<Project>() {
@Override
public void success(@NonNull Project response) {
mProject = response;
App.get().getGitLab().getIssuesByIid(mProject.getId(), mIssueIid).enqueue(mIssueCallback);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<List<Issue>> mIssueCallback = new EasyCallback<List<Issue>>() {
@Override
public void success(@NonNull List<Issue> response) {
if (response.isEmpty()) {
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
} else {
mIssue = response.get(0);
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue, mProject);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
bindIssue();
bindProject();
loadNotes();
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<List<Note>> mNotesCallback = new EasyCallback<List<Note>>() {
@Override
public void success(@NonNull List<Note> response) {
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
mIssueDetailsAdapter.setNotes(response);
}
@Override
public void failure(Throwable t) {
mLoading = false;
Timber.e(t);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<List<Note>> mMoreNotesCallback = new EasyCallback<List<Note>>() {
@Override
public void success(@NonNull List<Note> response) {
mLoading = false;
mIssueDetailsAdapter.setLoading(false);
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
mIssueDetailsAdapter.addNotes(response);
}
@Override
public void failure(Throwable t) {
mLoading = false;
Timber.e(t);
mIssueDetailsAdapter.setLoading(false);
}
};
private final Callback<Issue> mOpenCloseCallback = new EasyCallback<Issue>() {
@Override
public void success(@NonNull Issue response) {
mProgress.setVisibility(View.GONE);
mIssue = response;
App.bus().post(new IssueChangedEvent(mIssue));
App.bus().post(new IssueReloadEvent());
setOpenCloseMenuStatus();
loadNotes();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.error_changing_issue), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<Note> mPostNoteCallback = new EasyCallback<Note>() {
@Override
public void success(@NonNull Note response) {
mProgress.setVisibility(View.GONE);
mIssueDetailsAdapter.addNote(response);
mNotesRecyclerView.smoothScrollToPosition(IssueDetailsAdapter.getHeaderCount());
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
private final Callback<Void> mDeleteIssueCallback = new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
App.bus().post(new IssueReloadEvent());
Toast.makeText(IssueActivity.this, R.string.issue_deleted, Toast.LENGTH_SHORT)
.show();
finish();
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
Timber.e(t);
Snackbar.make(mRoot, getString(R.string.failed_to_delete_issue), Snackbar.LENGTH_SHORT)
.show();
}
};
@OnClick(R.id.fab_edit_issue)
public void onEditIssueClick(View fab) {
Navigator.navigateToEditIssue(IssueActivity.this, fab, mProject, mIssue);
Loading
Loading
@@ -336,7 +224,62 @@ public class IssueActivity extends BaseActivity {
}
}
});
App.get().getGitLab().getProject(projectNamespace, projectName).enqueue(mProjectCallback);
App.get().getGitLab().getProject(projectNamespace, projectName)
.compose(this.<Project>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Project>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Project project) {
mProject = project;
App.get().getGitLab().getIssuesByIid(mProject.getId(), mIssueIid)
.compose(IssueActivity.this.<List<Issue>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Issue>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(List<Issue> issues) {
if (issues.isEmpty()) {
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
} else {
mIssue = issues.get(0);
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue, mProject);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
bindIssue();
bindProject();
loadNotes();
}
}
});
}
});
}
}
 
Loading
Loading
@@ -350,8 +293,8 @@ public class IssueActivity extends BaseActivity {
mProgress.setVisibility(View.GONE);
mSendMessageView.appendText(response.getMarkdown());
} else {
Snackbar.make(mRoot, R.string.failed_to_upload_file, Snackbar.LENGTH_LONG)
.show();
Snackbar.make(mRoot, R.string.failed_to_upload_file, Snackbar.LENGTH_LONG)
.show();
}
break;
}
Loading
Loading
@@ -384,13 +327,69 @@ public class IssueActivity extends BaseActivity {
}
});
mLoading = true;
App.get().getGitLab().getIssueNotes(mProject.getId(), mIssue.getId()).enqueue(mNotesCallback);
App.get().getGitLab().getIssueNotes(mProject.getId(), mIssue.getId())
.compose(this.<Response<List<Note>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Note>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mLoading = false;
Timber.e(e);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Response<List<Note>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
mIssueDetailsAdapter.setNotes(listResponse.body());
}
});
}
 
private void loadMoreNotes() {
mLoading = true;
mIssueDetailsAdapter.setLoading(true);
App.get().getGitLab().getIssueNotes(mNextPageUrl.toString()).enqueue(mMoreNotesCallback);
App.get().getGitLab().getIssueNotes(mNextPageUrl.toString())
.compose(this.<Response<List<Note>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Note>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mLoading = false;
Timber.e(e);
mIssueDetailsAdapter.setLoading(false);
}
@Override
public void onNext(Response<List<Note>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mLoading = false;
mIssueDetailsAdapter.setLoading(false);
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
mIssueDetailsAdapter.addNotes(listResponse.body());
}
});
}
 
private void postNote(String message) {
Loading
Loading
@@ -406,20 +405,71 @@ public class IssueActivity extends BaseActivity {
mTeleprinter.hideKeyboard();
mSendMessageView.clearText();
 
App.get().getGitLab().addIssueNote(mProject.getId(), mIssue.getId(), message).enqueue(mPostNoteCallback);
App.get().getGitLab().addIssueNote(mProject.getId(), mIssue.getId(), message)
.compose(this.<Note>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Note>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Note note) {
mProgress.setVisibility(View.GONE);
mIssueDetailsAdapter.addNote(note);
mNotesRecyclerView.smoothScrollToPosition(IssueDetailsAdapter.getHeaderCount());
}
});
}
 
private void closeOrOpenIssue() {
mProgress.setVisibility(View.VISIBLE);
if (mIssue.getState().equals(Issue.STATE_CLOSED)) {
App.get().getGitLab().updateIssueStatus(mProject.getId(), mIssue.getId(), Issue.STATE_REOPEN)
.enqueue(mOpenCloseCallback);
updateIssueStatus(App.get().getGitLab().updateIssueStatus(mProject.getId(), mIssue.getId(), Issue.STATE_REOPEN));
} else {
App.get().getGitLab().updateIssueStatus(mProject.getId(), mIssue.getId(), Issue.STATE_CLOSE)
.enqueue(mOpenCloseCallback);
updateIssueStatus(App.get().getGitLab().updateIssueStatus(mProject.getId(), mIssue.getId(), Issue.STATE_CLOSE));
}
}
 
private void updateIssueStatus(Observable<Issue> observable) {
observable
.compose(this.<Issue>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Issue>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.error_changing_issue), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Issue issue) {
mProgress.setVisibility(View.GONE);
mIssue = issue;
App.bus().post(new IssueChangedEvent(mIssue));
App.bus().post(new IssueReloadEvent());
setOpenCloseMenuStatus();
loadNotes();
}
});
}
private void setOpenCloseMenuStatus() {
mOpenCloseMenuItem.setTitle(mIssue.getState().equals(Issue.STATE_CLOSED) ? R.string.reopen : R.string.close);
}
Loading
Loading
Loading
Loading
@@ -3,12 +3,9 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.Build;
Loading
Loading
@@ -23,12 +20,15 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
* Intermediate activity when deep linking to another activity and things need to load
*/
public class LoadSomeInfoActivity extends AppCompatActivity {
public class LoadSomeInfoActivity extends BaseActivity {
 
private static final String EXTRA_LOAD_TYPE = "load_type";
private static final String EXTRA_PROJECT_NAMESPACE = "project_namespace";
Loading
Loading
@@ -91,102 +91,6 @@ public class LoadSomeInfoActivity extends AppCompatActivity {
finish();
}
 
private final EasyCallback<Project> mProjectCallback = new EasyCallback<Project>() {
@Override
public void success(@NonNull Project response) {
mProject = response;
switch (mLoadType) {
case LOAD_TYPE_DIFF:
String sha = getIntent().getStringExtra(EXTRA_COMMIT_SHA);
App.get().getGitLab().getCommit(response.getId(), sha).enqueue(mCommitCallback);
return;
case LOAD_TYPE_MERGE_REQUEST:
String mergeRequestId = getIntent().getStringExtra(EXTRA_MERGE_REQUEST);
App.get().getGitLab().getMergeRequestsByIid(response.getId(), mergeRequestId).enqueue(mMergeRequestCallback);
return;
case LOAD_TYPE_BUILD:
long buildId = getIntent().getLongExtra(EXTRA_BUILD_ID, -1);
App.get().getGitLab().getBuild(response.getId(), buildId).enqueue(mBuildCallback);
return;
case LOAD_TYPE_MILESTONE:
String milestoneId = getIntent().getStringExtra(EXTRA_MILESTONE_ID);
App.get().getGitLab().getMilestonesByIid(response.getId(), milestoneId).enqueue(mMilestoneCallback);
return;
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
onError();
}
};
private final EasyCallback<RepositoryCommit> mCommitCallback = new EasyCallback<RepositoryCommit>() {
@Override
public void success(@NonNull RepositoryCommit response) {
Navigator.navigateToDiffActivity(LoadSomeInfoActivity.this, mProject, response);
finish();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
onError();
}
};
private final EasyCallback<List<MergeRequest>> mMergeRequestCallback = new EasyCallback<List<MergeRequest>>() {
@Override
public void success(@NonNull List<MergeRequest> response) {
if (!response.isEmpty()) {
Navigator.navigateToMergeRequest(LoadSomeInfoActivity.this, mProject, response.get(0));
finish();
} else {
onError();
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
onError();
}
};
private final EasyCallback<Build> mBuildCallback = new EasyCallback<Build>() {
@Override
public void success(@NonNull Build response) {
Navigator.navigateToBuild(LoadSomeInfoActivity.this, mProject, response);
finish();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
onError();
}
};
private final EasyCallback<List<Milestone>> mMilestoneCallback = new EasyCallback<List<Milestone>>() {
@Override
public void success(@NonNull List<Milestone> response) {
if (!response.isEmpty()) {
Navigator.navigateToMilestone(LoadSomeInfoActivity.this, mProject, response.get(0));
finish();
} else {
onError();
}
}
@Override
public void failure(Throwable t) {
Timber.e(t);
onError();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -203,11 +107,140 @@ public class LoadSomeInfoActivity extends AppCompatActivity {
case LOAD_TYPE_MILESTONE:
String namespace = getIntent().getStringExtra(EXTRA_PROJECT_NAMESPACE);
String project = getIntent().getStringExtra(EXTRA_PROJECT_NAME);
App.get().getGitLab().getProject(namespace, project).enqueue(mProjectCallback);
App.get().getGitLab().getProject(namespace, project)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Project>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
LoadSomeInfoActivity.this.onError();
}
@Override
public void onNext(Project project) {
loadNextPart(project);
}
});
break;
}
}
 
private void loadNextPart(Project response) {
mProject = response;
switch (mLoadType) {
case LOAD_TYPE_DIFF:
String sha = getIntent().getStringExtra(EXTRA_COMMIT_SHA);
App.get().getGitLab().getCommit(response.getId(), sha)
.compose(LoadSomeInfoActivity.this.<RepositoryCommit>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<RepositoryCommit>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
LoadSomeInfoActivity.this.onError();
}
@Override
public void onNext(RepositoryCommit repositoryCommit) {
Navigator.navigateToDiffActivity(LoadSomeInfoActivity.this, mProject, repositoryCommit);
finish();
}
});
return;
case LOAD_TYPE_MERGE_REQUEST:
String mergeRequestId = getIntent().getStringExtra(EXTRA_MERGE_REQUEST);
App.get().getGitLab().getMergeRequestsByIid(response.getId(), mergeRequestId)
.compose(LoadSomeInfoActivity.this.<List<MergeRequest>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MergeRequest>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
LoadSomeInfoActivity.this.onError();
}
@Override
public void onNext(List<MergeRequest> mergeRequests) {
if (!mergeRequests.isEmpty()) {
Navigator.navigateToMergeRequest(LoadSomeInfoActivity.this, mProject, mergeRequests.get(0));
finish();
} else {
LoadSomeInfoActivity.this.onError();
}
}
});
return;
case LOAD_TYPE_BUILD:
long buildId = getIntent().getLongExtra(EXTRA_BUILD_ID, -1);
App.get().getGitLab().getBuild(response.getId(), buildId)
.compose(LoadSomeInfoActivity.this.<Build>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Build>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
LoadSomeInfoActivity.this.onError();
}
@Override
public void onNext(Build build) {
Navigator.navigateToBuild(LoadSomeInfoActivity.this, mProject, build);
finish();
}
});
return;
case LOAD_TYPE_MILESTONE:
String milestoneId = getIntent().getStringExtra(EXTRA_MILESTONE_ID);
App.get().getGitLab().getMilestonesByIid(response.getId(), milestoneId)
.compose(LoadSomeInfoActivity.this.<List<Milestone>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Milestone>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
LoadSomeInfoActivity.this.onError();
}
@Override
public void onNext(List<Milestone> milestones) {
if (!milestones.isEmpty()) {
Navigator.navigateToMilestone(LoadSomeInfoActivity.this, mProject, milestones.get(0));
finish();
} else {
LoadSomeInfoActivity.this.onError();
}
}
});
return;
}
}
private void onError() {
Toast.makeText(LoadSomeInfoActivity.this, R.string.failed_to_load, Toast.LENGTH_SHORT)
.show();
Loading
Loading
Loading
Loading
@@ -136,33 +136,6 @@ public class LoginActivity extends BaseActivity {
}
};
 
private final Callback<UserFull> mTestUserCallback = new Callback<UserFull>() {
@Override
public void onResponse(Call<UserFull> call, Response<UserFull> response) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccessful() || response.body() == null) {
handleConnectionResponse(response);
return;
}
mAccount.setUser(response.body());
mAccount.setLastUsed(new Date());
App.get().getPrefs().addAccount(mAccount);
App.get().setAccount(mAccount);
App.bus().post(new LoginEvent(mAccount));
//This is mostly for if projects already exists, then we will reload the data
App.bus().post(new ReloadDataEvent());
Navigator.navigateToStartingActivity(LoginActivity.this);
finish();
}
@Override
public void onFailure(Call<UserFull> call, Throwable t) {
Timber.e(t);
handleConnectionError(t);
}
};
@OnClick(R.id.login_button)
public void onLoginClick() {
mTeleprinter.hideKeyboard();
Loading
Loading
@@ -420,7 +393,7 @@ public class LoginActivity extends BaseActivity {
} else {
mUrlHint.setError(null);
}
if (url.charAt(url.length()-1) != '/') {
if (url.charAt(url.length() - 1) != '/') {
mUrlHint.setError(getString(R.string.please_end_your_url_with_a_slash));
return false;
} else {
Loading
Loading
@@ -454,7 +427,39 @@ public class LoginActivity extends BaseActivity {
gitlabClientBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
}
GitLab gitLab = GitLabFactory.create(mAccount, gitlabClientBuilder.build());
gitLab.getThisUser().enqueue(mTestUserCallback);
gitLab.getThisUser()
.compose(this.<Response<UserFull>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<UserFull>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
handleConnectionError(e);
}
@Override
public void onNext(Response<UserFull> response) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccessful() || response.body() == null) {
handleConnectionResponse(response);
return;
}
mAccount.setUser(response.body());
mAccount.setLastUsed(new Date());
App.get().getPrefs().addAccount(mAccount);
App.get().setAccount(mAccount);
App.bus().post(new LoginEvent(mAccount));
//This is mostly for if projects already exists, then we will reload the data
App.bus().post(new ReloadDataEvent());
Navigator.navigateToStartingActivity(LoginActivity.this);
finish();
}
});
}
 
private void handleConnectionError(Throwable t) {
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
Loading
Loading
@@ -12,8 +11,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.easycallback.HttpException;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.MergeRequestSectionsPagerAdapter;
Loading
Loading
@@ -25,6 +22,9 @@ import org.parceler.Parcels;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
/**
Loading
Loading
@@ -56,38 +56,44 @@ public class MergeRequestActivity extends BaseActivity {
Project mProject;
MergeRequest mMergeRequest;
 
private final EasyCallback<MergeRequest> mMergeRequestCallback = new EasyCallback<MergeRequest>() {
@Override
public void success(@NonNull MergeRequest response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.merge_request_accepted, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new MergeRequestChangedEvent(response));
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
String message = getString(R.string.unable_to_merge);
if (t instanceof HttpException) {
int code = ((HttpException) t).response().code();
if (code == 406) {
message = getString(R.string.merge_request_already_merged_or_closed);
}
}
Snackbar.make(mRoot, message, Snackbar.LENGTH_LONG)
.show();
}
};
private final Toolbar.OnMenuItemClickListener mOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_merge:
mProgress.setVisibility(View.VISIBLE);
App.get().getGitLab().acceptMergeRequest(mProject.getId(), mMergeRequest.getId()).enqueue(mMergeRequestCallback);
App.get().getGitLab().acceptMergeRequest(mProject.getId(), mMergeRequest.getId())
.compose(MergeRequestActivity.this.<MergeRequest>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<MergeRequest>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
String message = getString(R.string.unable_to_merge);
if (e instanceof retrofit2.adapter.rxjava.HttpException) {
int code = ((retrofit2.adapter.rxjava.HttpException) e).response().code();
if (code == 406) {
message = getString(R.string.merge_request_already_merged_or_closed);
}
}
Snackbar.make(mRoot, message, Snackbar.LENGTH_LONG)
.show();
}
@Override
public void onNext(MergeRequest mergeRequest) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.merge_request_accepted, Snackbar.LENGTH_LONG)
.show();
App.bus().post(new MergeRequestChangedEvent(mergeRequest));
}
});
return true;
}
return false;
Loading
Loading
Loading
Loading
@@ -5,7 +5,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
Loading
Loading
@@ -15,7 +14,6 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.DividerItemDecoration;
Loading
Loading
@@ -35,7 +33,12 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.adapter.rxjava.HttpException;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
public class MilestoneActivity extends BaseActivity {
Loading
Loading
@@ -84,68 +87,6 @@ public class MilestoneActivity extends BaseActivity {
Navigator.navigateToEditMilestone(MilestoneActivity.this, fab, mProject, mMilestone);
}
 
private final Callback<List<Issue>> mIssuesCallback = new EasyCallback<List<Issue>>() {
@Override
public void success(@NonNull List<Issue> response) {
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
if (!response.isEmpty()) {
mMessageText.setVisibility(View.GONE);
} else {
Timber.d("No issues found");
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.no_issues);
}
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
mMilestoneIssuesAdapter.setIssues(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.connection_error_issues);
mMilestoneIssuesAdapter.setIssues(null);
}
};
private final Callback<List<Issue>> mMoreIssuesCallback = new EasyCallback<List<Issue>>() {
@Override
public void success(@NonNull List<Issue> response) {
mLoading = false;
mNextPageUrl = LinkHeaderParser.parse(response()).getNext();
mMilestoneIssuesAdapter.addIssues(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mLoading = false;
}
};
private final Callback<Milestone> mOpenCloseCallback = new EasyCallback<Milestone>() {
@Override
public void success(@NonNull Milestone response) {
mProgress.setVisibility(View.GONE);
mMilestone = response;
App.bus().post(new MilestoneChangedEvent(mMilestone));
setOpenCloseMenuStatus();
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.failed_to_create_milestone), Snackbar.LENGTH_SHORT)
.show();
}
};
private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
Loading
Loading
@@ -236,7 +177,46 @@ public class MilestoneActivity extends BaseActivity {
}
}
});
App.get().getGitLab().getMilestoneIssues(mProject.getId(), mMilestone.getId()).enqueue(mIssuesCallback);
App.get().getGitLab().getMilestoneIssues(mProject.getId(), mMilestone.getId())
.compose(this.<Response<List<Issue>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Issue>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mLoading = false;
mSwipeRefreshLayout.setRefreshing(false);
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.connection_error_issues);
mMilestoneIssuesAdapter.setIssues(null);
}
@Override
public void onNext(Response<List<Issue>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
if (!listResponse.body().isEmpty()) {
mMessageText.setVisibility(View.GONE);
} else {
Timber.d("No issues found");
mMessageText.setVisibility(View.VISIBLE);
mMessageText.setText(R.string.no_issues);
}
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
mMilestoneIssuesAdapter.setIssues(listResponse.body());
}
});
}
 
private void loadMore() {
Loading
Loading
@@ -248,20 +228,70 @@ public class MilestoneActivity extends BaseActivity {
mLoading = true;
 
Timber.d("loadMore called for %s", mNextPageUrl);
App.get().getGitLab().getMilestoneIssues(mNextPageUrl.toString()).enqueue(mMoreIssuesCallback);
App.get().getGitLab().getMilestoneIssues(mNextPageUrl.toString())
.compose(this.<Response<List<Issue>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Issue>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mLoading = false;
}
@Override
public void onNext(Response<List<Issue>> listResponse) {
if (!listResponse.isSuccessful()) {
onError(new HttpException(listResponse));
return;
}
mLoading = false;
mNextPageUrl = LinkHeaderParser.parse(listResponse).getNext();
mMilestoneIssuesAdapter.addIssues(listResponse.body());
}
});
}
 
private void closeOrOpenIssue() {
mProgress.setVisibility(View.VISIBLE);
if (mMilestone.getState().equals(Milestone.STATE_ACTIVE)) {
App.get().getGitLab().updateMilestoneStatus(mProject.getId(), mMilestone.getId(), Milestone.STATE_EVENT_CLOSE)
.enqueue(mOpenCloseCallback);
updateMilestoneStatus(App.get().getGitLab().updateMilestoneStatus(mProject.getId(), mMilestone.getId(), Milestone.STATE_EVENT_CLOSE));
} else {
App.get().getGitLab().updateMilestoneStatus(mProject.getId(), mMilestone.getId(), Milestone.STATE_EVENT_ACTIVATE)
.enqueue(mOpenCloseCallback);
updateMilestoneStatus(App.get().getGitLab().updateMilestoneStatus(mProject.getId(), mMilestone.getId(), Milestone.STATE_EVENT_ACTIVATE));
}
}
 
private void updateMilestoneStatus(Observable<Milestone> observable) {
observable.compose(this.<Milestone>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Milestone>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.failed_to_create_milestone), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Milestone milestone) {
mProgress.setVisibility(View.GONE);
mMilestone = milestone;
App.bus().post(new MilestoneChangedEvent(mMilestone));
setOpenCloseMenuStatus();
}
});
}
private void setOpenCloseMenuStatus() {
mOpenCloseMenuItem.setTitle(mMilestone.getState().equals(Milestone.STATE_CLOSED) ? R.string.reopen : R.string.close);
}
Loading
Loading
Loading
Loading
@@ -5,7 +5,6 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
Loading
Loading
@@ -16,7 +15,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
 
import com.commit451.easycallback.EasyCallback;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectSectionsPagerAdapter;
Loading
Loading
@@ -32,7 +30,10 @@ import org.parceler.Parcels;
 
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
 
public class ProjectActivity extends BaseActivity {
Loading
Loading
@@ -80,26 +81,6 @@ public class ProjectActivity extends BaseActivity {
Project mProject;
Ref mRef;
 
private final Callback<Project> mProjectCallback = new EasyCallback<Project>() {
@Override
public void success(@NonNull Project response) {
mProgress.animate()
.alpha(0.0f)
.withEndAction(new HideRunnable(mProgress));
bindProject(response);
}
@Override
public void failure(Throwable t) {
Timber.e(t);
mProgress.animate()
.alpha(0.0f)
.withEndAction(new HideRunnable(mProgress));
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
private final Toolbar.OnMenuItemClickListener mOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Loading
Loading
@@ -194,12 +175,41 @@ public class ProjectActivity extends BaseActivity {
 
private void loadProject(String projectId) {
showProgress();
App.get().getGitLab().getProject(projectId).enqueue(mProjectCallback);
loadProject(App.get().getGitLab().getProject(projectId));
}
 
private void loadProject(String projectNamespace, String projectName) {
showProgress();
App.get().getGitLab().getProject(projectNamespace, projectName).enqueue(mProjectCallback);
loadProject(App.get().getGitLab().getProject(projectNamespace, projectName));
}
private void loadProject(Observable<Project> observable) {
observable.compose(this.<Project>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Project>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.e(e);
mProgress.animate()
.alpha(0.0f)
.withEndAction(new HideRunnable(mProgress));
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
@Override
public void onNext(Project project) {
mProgress.animate()
.alpha(0.0f)
.withEndAction(new HideRunnable(mProgress));
bindProject(project);
}
});
}
 
private void showProgress() {
Loading
Loading
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment