Skip to content
Snippets Groups Projects
Commit 6ec7e30b authored by Jawnnypoo's avatar Jawnnypoo
Browse files

Merge branch 'develop'

parents 6c016a2d c7245825
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 393 additions and 332 deletions
Loading
Loading
@@ -49,6 +49,11 @@ public class ProjectsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
notifyDataSetChanged();
}
 
public void addData(Collection<Project> projects) {
mValues.addAll(projects);
notifyDataSetChanged();
}
private final View.OnClickListener onProjectClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Loading
Loading
Loading
Loading
@@ -10,7 +10,7 @@ import com.commit451.gitlab.fragments.CommitsFragment;
import com.commit451.gitlab.fragments.FilesFragment;
import com.commit451.gitlab.fragments.IssuesFragment;
import com.commit451.gitlab.fragments.MembersFragment;
import com.commit451.gitlab.fragments.MergeRequestFragment;
import com.commit451.gitlab.fragments.MergeRequestsFragment;
import com.commit451.gitlab.fragments.OverviewFragment;
 
/**
Loading
Loading
@@ -41,7 +41,7 @@ public class SectionsPagerAdapter extends FragmentPagerAdapter {
case 3:
return FilesFragment.newInstance();
case 4:
return MergeRequestFragment.newInstance();
return MergeRequestsFragment.newInstance();
case 5:
return MembersFragment.newInstance();
}
Loading
Loading
Loading
Loading
@@ -18,7 +18,7 @@ import java.util.Collection;
public class UsersAdapter extends RecyclerView.Adapter<UserViewHolder> {
 
public interface Listener {
void onUserClicked(User user);
void onUserClicked(User user, UserViewHolder userViewHolder);
}
private Listener mListener;
private ArrayList<User> mData;
Loading
Loading
@@ -27,7 +27,8 @@ public class UsersAdapter extends RecyclerView.Adapter<UserViewHolder> {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onUserClicked(getUser(position));
UserViewHolder holder = (UserViewHolder) v.getTag(R.id.list_view_holder);
mListener.onUserClicked(getUser(position), holder);
}
};
 
Loading
Loading
@@ -47,6 +48,7 @@ public class UsersAdapter extends RecyclerView.Adapter<UserViewHolder> {
public void onBindViewHolder(UserViewHolder userViewHolder, int position) {
userViewHolder.bind(mData.get(position));
userViewHolder.itemView.setTag(R.id.list_position, position);
userViewHolder.itemView.setTag(R.id.list_view_holder, userViewHolder);
}
 
@Override
Loading
Loading
package com.commit451.gitlab.api;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.tools.Prefs;
import com.commit451.gitlab.data.Prefs;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.Response;
 
Loading
Loading
Loading
Loading
@@ -9,6 +9,7 @@ import com.commit451.gitlab.model.FileResponse;
import com.commit451.gitlab.model.Group;
import com.commit451.gitlab.model.Issue;
import com.commit451.gitlab.model.MergeRequest;
import com.commit451.gitlab.model.MergeRequestComment;
import com.commit451.gitlab.model.Milestone;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.model.Project;
Loading
Loading
@@ -27,6 +28,7 @@ import retrofit.http.POST;
import retrofit.http.PUT;
import retrofit.http.Path;
import retrofit.http.Query;
import retrofit.http.Url;
 
public interface GitLab {
String API_VERSION = "api/v3";
Loading
Loading
@@ -50,15 +52,17 @@ public interface GitLab {
@GET(API_VERSION + "/users?per_page=100")
Call<List<User>> getUsers();
 
@GET(API_VERSION + "/projects?per_page=100")
@GET(API_VERSION + "/projects?order_by=last_activity_at")
Call<List<Project>> getAllProjects();
 
@GET(API_VERSION + "/projects/owned?per_page=100")
@GET(API_VERSION + "/projects/owned?order_by=last_activity_at")
Call<List<Project>> getMyProjects();
 
@GET(API_VERSION + "/projects?per_page=100")
@GET(API_VERSION + "/projects?order_by=last_activity_at")
Call<List<Project>> searchAllProjects(@Query("search") String query);
@GET
Call<List<Project>> getProjectsNextPage(@Url String url);
/* --- PROJECTS --- */
 
@GET(API_VERSION + "/projects/{id}/repository/branches?per_page=100&order_by=last_activity_at")
Loading
Loading
@@ -73,8 +77,19 @@ public interface GitLab {
@GET(API_VERSION + "/projects/{id}/repository/contributors")
Call<List<Contributor>> getContributors(@Path("id") long projectId);
 
@GET(API_VERSION + "/projects/{id}/merge_requests")
Call<List<MergeRequest>> getMergeRequests(@Path("id") long projectId);
@GET(API_VERSION + "/projects/{id}/merge_requests?state=opened")
Call<List<MergeRequest>> getMergeRequests(@Path("id") long projectId,
@Query("state") String state);
@GET(API_VERSION + "/projects/{id}/merge_request/{mergeRequestId}/comments")
Call<List<MergeRequestComment>> getMergeRequestNotes(@Path("id") long projectId,
@Path("mergeRequestId") long mergeRequestId);
@FormUrlEncoded
@POST(API_VERSION + "/projects/{id}/merge_request/{merge_request_id}/comments")
Call<MergeRequestComment> postMergeRequestComment(@Path("id") long projectId,
@Path("merge_request_id") long mergeRequestId,
@Field("note") String body);
/* --- COMMITS --- */
 
Loading
Loading
@@ -93,7 +108,8 @@ public interface GitLab {
/* --- ISSUE --- */
 
@GET(API_VERSION + "/projects/{id}/issues?per_page=100")
Call<List<Issue>> getIssues(@Path("id") long projectId);
Call<List<Issue>> getIssues(@Path("id") long projectId,
@Query("state") String state);
 
@FormUrlEncoded
@POST(API_VERSION + "/projects/{id}/issues")
Loading
Loading
@@ -101,7 +117,7 @@ public interface GitLab {
@Field("title") String title,
@Field("description") String description);
 
@GET(API_VERSION + "/projects/{id}/issues/{issue_id}/notes?per_page=100")
@GET(API_VERSION + "/projects/{id}/issues/{issue_id}/notes?order_by=last_activity_at")
Call<List<Note>> getIssueNotes(@Path("id") long projectId,
@Path("issue_id") long issueId);
 
Loading
Loading
Loading
Loading
@@ -2,7 +2,7 @@ package com.commit451.gitlab.api;
 
import com.commit451.gitlab.BuildConfig;
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.tools.Prefs;
import com.commit451.gitlab.data.Prefs;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
Loading
Loading
package com.commit451.gitlab.tools;
package com.commit451.gitlab.data;
 
import android.content.Context;
import android.content.SharedPreferences;
Loading
Loading
Loading
Loading
@@ -7,7 +7,7 @@ import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.events.LogoutEvent;
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.tools.Prefs;
import com.commit451.gitlab.data.Prefs;
 
import butterknife.ButterKnife;
import butterknife.OnClick;
Loading
Loading
Loading
Loading
@@ -59,6 +59,53 @@ public class FilesFragment extends BaseFragment {
String mBranchName;
ArrayList<String> mPath;
 
private Callback<List<TreeItem>> mFilesCallback = new Callback<List<TreeItem>>() {
@Override
public void onResponse(Response<List<TreeItem>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
if(response.code() == 404) {
errorText.setVisibility(View.VISIBLE);
list.setVisibility(View.GONE);
}
else {
if(mPath.size() > 0) {
mPath.remove(mPath.size() - 1);
}
list.setAdapter(null);
if(response.code() != 500) {
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_files), Snackbar.LENGTH_SHORT)
.show();
}
}
return;
}
if (getView() == null) {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
if (response.body() != null && !response.body().isEmpty()) {
list.setVisibility(View.VISIBLE);
list.setAdapter(new FilesAdapter(response.body()));
errorText.setVisibility(View.GONE);
} else {
errorText.setVisibility(View.VISIBLE);
}
}
@Override
public void onFailure(Throwable t) {
if(mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_files), Snackbar.LENGTH_SHORT)
.show();
Timber.e(t.toString());
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -119,56 +166,9 @@ public class FilesFragment extends BaseFragment {
currentPath += p;
}
 
GitLabClient.instance().getTree(mProject.getId(), mBranchName, currentPath).enqueue(filesCallback);
GitLabClient.instance().getTree(mProject.getId(), mBranchName, currentPath).enqueue(mFilesCallback);
}
private Callback<List<TreeItem>> filesCallback = new Callback<List<TreeItem>>() {
@Override
public void onResponse(Response<List<TreeItem>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
if(response.code() == 404) {
errorText.setVisibility(View.VISIBLE);
list.setVisibility(View.GONE);
}
else {
if(mPath.size() > 0) {
mPath.remove(mPath.size() - 1);
}
list.setAdapter(null);
if(response.code() != 500) {
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_files), Snackbar.LENGTH_SHORT)
.show();
}
}
return;
}
if (getView() == null) {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
if (response.body() != null && !response.body().isEmpty()) {
list.setVisibility(View.VISIBLE);
list.setAdapter(new FilesAdapter(response.body()));
errorText.setVisibility(View.GONE);
} else {
errorText.setVisibility(View.VISIBLE);
}
}
@Override
public void onFailure(Throwable t) {
if(mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_files), Snackbar.LENGTH_SHORT)
.show();
Timber.e(t.toString());
}
};
public boolean onBackPressed() {
if(mPath.size() > 0) {
mPath.remove(mPath.size() - 1);
Loading
Loading
Loading
Loading
@@ -8,10 +8,13 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.activities.IssueActivity;
import com.commit451.gitlab.activities.ProjectActivity;
import com.commit451.gitlab.adapter.IssuesAdapter;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -21,11 +24,13 @@ import com.commit451.gitlab.events.IssueCreatedEvent;
import com.commit451.gitlab.events.ProjectReloadEvent;
import com.commit451.gitlab.model.Issue;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.NavigationManager;
import com.squareup.otto.Subscribe;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindString;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit.Callback;
Loading
Loading
@@ -33,67 +38,97 @@ import retrofit.Response;
import retrofit.Retrofit;
import timber.log.Timber;
 
public class IssuesFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
public class IssuesFragment extends BaseFragment {
 
public static IssuesFragment newInstance() {
return new IssuesFragment();
}
 
@Bind(R.id.add_issue_button) View addIssueButton;
@Bind(R.id.list) RecyclerView listView;
@Bind(R.id.issue_spinner) Spinner mSpinner;
@Bind(R.id.add_issue_button) View mAddIssueButton;
@Bind(R.id.list) RecyclerView mIssueRecyclerView;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.message_text) TextView mMessageTextView;
 
IssuesAdapter issuesAdapter;
EventReceiver eventReceiver;
IssuesAdapter mIssuesAdapter;
EventReceiver mEventReceiver;
Project mProject;
@BindString(R.string.issue_opened)
String mState;
String[] mStates;
 
private final IssuesAdapter.Listener mIssuesAdapterListener = new IssuesAdapter.Listener() {
@Override
public void onIssueClicked(Issue issue) {
getActivity().startActivity(IssueActivity.newInstance(getActivity(), mProject, issue));
NavigationManager.navigateToIssue(getActivity(), mProject, issue);
}
};
 
public IssuesFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_issues, container, false);
ButterKnife.bind(this, view);
private final SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData();
}
};
 
listView.setLayoutManager(new LinearLayoutManager(getActivity()));
issuesAdapter = new IssuesAdapter(mIssuesAdapterListener);
listView.setAdapter(issuesAdapter);
mSwipeRefreshLayout.setOnRefreshListener(this);
private final AdapterView.OnItemSelectedListener mSpinnerItemSelectedListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mState = mStates[position];
loadData();
}
 
eventReceiver = new EventReceiver();
GitLabApp.bus().register(eventReceiver);
@Override
public void onNothingSelected(AdapterView<?> parent) { }
};
 
if (getActivity() instanceof ProjectActivity) {
mProject = ((ProjectActivity) getActivity()).getProject();
if (mProject != null) {
loadData();
}
} else {
throw new IllegalStateException("Incorrect parent activity");
}
return view;
public IssuesFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mStates = getResources().getStringArray(R.array.issue_state_values);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_issues, container, false);
}
@Override
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
mIssueRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mIssuesAdapter = new IssuesAdapter(mIssuesAdapterListener);
mIssueRecyclerView.setAdapter(mIssuesAdapter);
mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener);
mSpinner.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, getResources().getStringArray(R.array.issue_state_names)));
mSpinner.setOnItemSelectedListener(mSpinnerItemSelectedListener);
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
if (getActivity() instanceof ProjectActivity) {
mProject = ((ProjectActivity) getActivity()).getProject();
if (mProject != null) {
loadData();
}
} else {
throw new IllegalStateException("Incorrect parent activity");
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
GitLabApp.bus().unregister(eventReceiver);
GitLabApp.bus().unregister(mEventReceiver);
}
@Override
public void onRefresh() {
loadData();
}
public void loadData() {
mMessageTextView.setVisibility(View.GONE);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
Loading
Loading
@@ -102,10 +137,10 @@ public class IssuesFragment extends BaseFragment implements SwipeRefreshLayout.O
}
}
});
GitLabClient.instance().getIssues(mProject.getId()).enqueue(issuesCallback);
GitLabClient.instance().getIssues(mProject.getId(), mState).enqueue(mIssuesCallback);
}
private Callback<List<Issue>> issuesCallback = new Callback<List<Issue>>() {
private Callback<List<Issue>> mIssuesCallback = new Callback<List<Issue>>() {
 
@Override
public void onResponse(Response<List<Issue>> response, Retrofit retrofit) {
Loading
Loading
@@ -116,9 +151,11 @@ public class IssuesFragment extends BaseFragment implements SwipeRefreshLayout.O
return;
}
mSwipeRefreshLayout.setRefreshing(false);
issuesAdapter.setIssues(response.body());
if (response.body().isEmpty()) {
mMessageTextView.setVisibility(View.VISIBLE);
}
 
addIssueButton.setEnabled(true);
mIssuesAdapter.setIssues(response.body());
}
 
@Override
Loading
Loading
@@ -133,7 +170,7 @@ public class IssuesFragment extends BaseFragment implements SwipeRefreshLayout.O
}
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_issues), Snackbar.LENGTH_SHORT)
.show();
listView.setAdapter(null);
mIssueRecyclerView.setAdapter(null);
}
};
Loading
Loading
@@ -161,13 +198,13 @@ public class IssuesFragment extends BaseFragment implements SwipeRefreshLayout.O
 
@Subscribe
public void onIssueAdded(IssueCreatedEvent event) {
issuesAdapter.addIssue(event.issue);
listView.smoothScrollToPosition(0);
mIssuesAdapter.addIssue(event.issue);
mIssueRecyclerView.smoothScrollToPosition(0);
}
 
@Subscribe
public void onIssueChanged(IssueChangedEvent event) {
issuesAdapter.updateIssue(event.issue);
mIssuesAdapter.updateIssue(event.issue);
}
}
}
\ No newline at end of file
Loading
Loading
@@ -20,6 +20,8 @@ import com.commit451.gitlab.events.ProjectReloadEvent;
import com.commit451.gitlab.events.UserAddedEvent;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.viewHolders.MemberViewHolder;
import com.squareup.otto.Subscribe;
 
import java.util.List;
Loading
Loading
@@ -44,14 +46,48 @@ public class MembersFragment extends BaseFragment implements SwipeRefreshLayout.
return fragment;
}
 
@Bind(R.id.add_user_button) View addUserButton;
@Bind(R.id.list) RecyclerView listView;
@Bind(R.id.add_user_button) View mAddUserButton;
@Bind(R.id.list) RecyclerView mRecyclerView;
MemberAdapter mAdapter;
@Bind(R.id.error_text) TextView errorText;
@Bind(R.id.swipe_layout) SwipeRefreshLayout swipeLayout;
@Bind(R.id.error_text) TextView mErrorText;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
 
Project mProject;
EventReceiver eventReceiver;
EventReceiver mEventReceiver;
private final Callback<List<User>> usersCallback = new Callback<List<User>>() {
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
return;
}
if (getView() == null) {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
mErrorText.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
mAddUserButton.setVisibility(View.VISIBLE);
mAdapter.setData(response.body());
mAddUserButton.setEnabled(true);
}
@Override
public void onFailure(Throwable t) {
if (getView() == null) {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
mErrorText.setVisibility(View.VISIBLE);
mAddUserButton.setVisibility(View.GONE);
Timber.e(t.toString());
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
}
};
 
public MembersFragment() {}
Loading
Loading
@@ -62,16 +98,16 @@ public class MembersFragment extends BaseFragment implements SwipeRefreshLayout.
 
mAdapter = new MemberAdapter(new MemberAdapter.Listener() {
@Override
public void onUserClicked(User user) {
//TODO go to profile or allow kicking from group or something
public void onUserClicked(User user, MemberViewHolder memberViewHolder) {
NavigationManager.navigateToUser(getActivity(), memberViewHolder.image, user);
}
});
listView.setLayoutManager(new LinearLayoutManager(getActivity()));
listView.setAdapter(mAdapter);
swipeLayout.setOnRefreshListener(this);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setAdapter(mAdapter);
mSwipeRefreshLayout.setOnRefreshListener(this);
 
eventReceiver = new EventReceiver();
GitLabApp.bus().register(eventReceiver);
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
 
if (getActivity() instanceof ProjectActivity) {
mProject = ((ProjectActivity) getActivity()).getProject();
Loading
Loading
@@ -89,7 +125,7 @@ public class MembersFragment extends BaseFragment implements SwipeRefreshLayout.
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
GitLabApp.bus().unregister(eventReceiver);
GitLabApp.bus().unregister(mEventReceiver);
}
@Override
Loading
Loading
@@ -98,56 +134,22 @@ public class MembersFragment extends BaseFragment implements SwipeRefreshLayout.
}
public void loadData() {
swipeLayout.post(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(true);
}
});
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
GitLabClient.instance().getGroupMembers(mProject.getNamespace().getId()).enqueue(usersCallback);
}
public Callback<List<User>> usersCallback = new Callback<List<User>>() {
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
return;
}
if (getView() == null) {
return;
}
swipeLayout.setRefreshing(false);
errorText.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
addUserButton.setVisibility(View.VISIBLE);
mAdapter.setData(response.body());
addUserButton.setEnabled(true);
}
@Override
public void onFailure(Throwable t) {
if (getView() == null) {
return;
}
swipeLayout.setRefreshing(false);
errorText.setVisibility(View.VISIBLE);
addUserButton.setVisibility(View.GONE);
Timber.e(t.toString());
Snackbar.make(getActivity().getWindow().getDecorView(), getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
}
};
public boolean onBackPressed() {
return false;
}
@OnClick(R.id.add_user_button)
public void onAddUserClick() {
startActivity(AddUserActivity.newInstance(getActivity()));
startActivity(AddUserActivity.newInstance(getActivity(), mProject.getNamespace().getId()));
}
 
private class EventReceiver {
Loading
Loading
Loading
Loading
@@ -9,6 +9,9 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
Loading
Loading
@@ -19,11 +22,13 @@ import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.events.ProjectReloadEvent;
import com.commit451.gitlab.model.MergeRequest;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.NavigationManager;
import com.squareup.otto.Subscribe;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindString;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.Response;
Loading
Loading
@@ -33,23 +38,26 @@ import retrofit.Retrofit;
* Merge all the requests!
* Created by Jawn on 9/20/2015.
*/
public class MergeRequestFragment extends BaseFragment {
public static MergeRequestFragment newInstance() {
public class MergeRequestsFragment extends BaseFragment {
 
public static MergeRequestsFragment newInstance() {
Bundle args = new Bundle();
MergeRequestFragment fragment = new MergeRequestFragment();
MergeRequestsFragment fragment = new MergeRequestsFragment();
fragment.setArguments(args);
return fragment;
}
 
@Bind(R.id.error_text) TextView mErrorText;
@Bind(R.id.state_spinner) Spinner mSpinner;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mRecyclerView;
EventReceiver mEventReceiver;
MergeRequestAdapter mMergeRequestAdapter;
Project mProject;
@BindString(R.string.merge_request_state_value_default)
String mState;
String[] mStates;
 
private final SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
@Override
Loading
Loading
@@ -58,6 +66,24 @@ public class MergeRequestFragment extends BaseFragment {
}
};
 
private final AdapterView.OnItemSelectedListener mSpinnerItemSelectedListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mState = mStates[position];
loadData();
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
};
private final MergeRequestAdapter.Listener mMergeRequestAdapterListener = new MergeRequestAdapter.Listener() {
@Override
public void onMergeRequestClicked(MergeRequest mergeRequest) {
NavigationManager.navigateToMergeRequest(getActivity(), mProject, mergeRequest);
}
};
private final Callback<List<MergeRequest>> mCallback = new Callback<List<MergeRequest>>() {
@Override
public void onResponse(Response<List<MergeRequest>> response, Retrofit retrofit) {
Loading
Loading
@@ -71,9 +97,8 @@ public class MergeRequestFragment extends BaseFragment {
if (response.body().isEmpty()) {
mErrorText.setVisibility(View.VISIBLE);
mErrorText.setText(R.string.no_merge_requests);
} else {
mMergeRequestAdapter.setData(response.body());
}
mMergeRequestAdapter.setData(response.body());
}
 
@Override
Loading
Loading
@@ -89,6 +114,7 @@ public class MergeRequestFragment extends BaseFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mEventReceiver = new EventReceiver();
mStates = getContext().getResources().getStringArray(R.array.merge_request_state_values);
}
 
@Nullable
Loading
Loading
@@ -103,9 +129,12 @@ public class MergeRequestFragment extends BaseFragment {
ButterKnife.bind(this, view);
GitLabApp.bus().register(mEventReceiver);
mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener);
mMergeRequestAdapter = new MergeRequestAdapter();
mMergeRequestAdapter = new MergeRequestAdapter(mMergeRequestAdapterListener);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setAdapter(mMergeRequestAdapter);
mSpinner.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, getResources().getStringArray(R.array.merge_request_state_names)));
mSpinner.setOnItemSelectedListener(mSpinnerItemSelectedListener);
if (getActivity() instanceof ProjectActivity) {
mProject = ((ProjectActivity) getActivity()).getProject();
if (mProject != null) {
Loading
Loading
@@ -126,6 +155,7 @@ public class MergeRequestFragment extends BaseFragment {
@Override
protected void loadData() {
super.loadData();
mErrorText.setVisibility(View.GONE);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
Loading
Loading
@@ -134,7 +164,7 @@ public class MergeRequestFragment extends BaseFragment {
}
}
});
GitLabClient.instance().getMergeRequests(mProject.getId()).enqueue(mCallback);
GitLabClient.instance().getMergeRequests(mProject.getId(), mState).enqueue(mCallback);
}
 
public boolean onBackPressed() {
Loading
Loading
Loading
Loading
@@ -61,14 +61,14 @@ public class OverviewFragment extends BaseFragment {
private Callback<List<TreeItem>> mFilesCallback = new Callback<List<TreeItem>>() {
@Override
public void onResponse(Response<List<TreeItem>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
mErrorText.setText(R.string.connection_error);
if (getView() == null) {
return;
}
if (getView() == null) {
if (!response.isSuccess()) {
mSwipeRefreshLayout.setRefreshing(false);
showError(getString(R.string.no_readme_found));
return;
}
mSwipeRefreshLayout.setRefreshing(false);
for (TreeItem treeItem : response.body()) {
if (treeItem.getName().equalsIgnoreCase("README.md")) {
GitLabClient.instance().getFile(mProject.getId(), treeItem.getName(), mBranchName).enqueue(mFileCallback);
Loading
Loading
@@ -81,6 +81,7 @@ public class OverviewFragment extends BaseFragment {
@Override
public void onFailure(Throwable t) {
if (getView() != null) {
mSwipeRefreshLayout.setRefreshing(false);
showError(getString(R.string.failed_to_load));
}
}
Loading
Loading
@@ -89,10 +90,12 @@ public class OverviewFragment extends BaseFragment {
private Callback<FileResponse> mFileCallback = new Callback<FileResponse>() {
@Override
public void onResponse(Response<FileResponse> response, Retrofit retrofit) {
if (!response.isSuccess()) {
if (getView() == null) {
return;
}
if (getView() == null) {
mSwipeRefreshLayout.setRefreshing(false);
if (!response.isSuccess()) {
showError(getString(R.string.no_readme_found));
return;
}
try {
Loading
Loading
@@ -108,6 +111,10 @@ public class OverviewFragment extends BaseFragment {
 
@Override
public void onFailure(Throwable t) {
if (getView() == null) {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
showError(getString(R.string.failed_to_load));
}
};
Loading
Loading
@@ -171,9 +178,11 @@ public class OverviewFragment extends BaseFragment {
}
 
private void showError(String error) {
mErrorText.setVisibility(View.VISIBLE);
mOverview.setVisibility(View.GONE);
mErrorText.setText(error);
if (getView() != null) {
mErrorText.setVisibility(View.VISIBLE);
mOverview.setVisibility(View.GONE);
mErrorText.setText(error);
}
}
 
public boolean onBackPressed() {
Loading
Loading
Loading
Loading
@@ -14,6 +14,7 @@ import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectsAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.LinkHeaderResolver;
import com.commit451.gitlab.tools.NavigationManager;
 
import java.util.List;
Loading
Loading
@@ -57,15 +58,32 @@ public class ProjectsFragment extends BaseFragment {
 
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mRecyclerView;
LinearLayoutManager mLayoutManager;
ProjectsAdapter mProjectsAdapter;
@Bind(R.id.message_text) TextView mMessageText;
 
private int mMode;
private String mQuery;
private String mNextPageUrl;
private boolean mLoading = false;
private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = mLayoutManager.getChildCount();
int totalItemCount = mLayoutManager.getItemCount();
int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (firstVisibleItem + visibleItemCount >= totalItemCount && !mLoading && mNextPageUrl != null) {
loadMore();
}
}
};
 
private final Callback<List<Project>> mProjectsCallback = new Callback<List<Project>>() {
@Override
public void onResponse(Response<List<Project>> response, Retrofit retrofit) {
mLoading = false;
if (getView() == null) {
return;
}
Loading
Loading
@@ -76,6 +94,8 @@ public class ProjectsFragment extends BaseFragment {
mMessageText.setText(R.string.connection_error);
return;
}
mNextPageUrl = LinkHeaderResolver.getNextPageUrl(response.headers());
Timber.d("Next page url " + mNextPageUrl);
if (response.body().isEmpty()) {
mMessageText.setText(R.string.no_projects);
mRecyclerView.setVisibility(View.GONE);
Loading
Loading
@@ -83,7 +103,7 @@ public class ProjectsFragment extends BaseFragment {
} else {
mMessageText.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
mProjectsAdapter.setData(response.body());
mProjectsAdapter.addData(response.body());
}
}
 
Loading
Loading
@@ -136,8 +156,10 @@ public class ProjectsFragment extends BaseFragment {
}
});
mProjectsAdapter = new ProjectsAdapter(getActivity(), mProjectsListener);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mProjectsAdapter);
mRecyclerView.addOnScrollListener(mOnScrollListener);
loadData();
}
 
Loading
Loading
@@ -146,6 +168,7 @@ public class ProjectsFragment extends BaseFragment {
super.loadData();
mMessageText.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
mProjectsAdapter.clearData();
switch (mMode) {
case MODE_ALL:
showLoading();
Loading
Loading
@@ -167,7 +190,14 @@ public class ProjectsFragment extends BaseFragment {
}
}
 
private void loadMore() {
mLoading = true;
Timber.d("loadMore called for " + mNextPageUrl);
GitLabClient.instance().getProjectsNextPage(mNextPageUrl).enqueue(mProjectsCallback);
}
private void showLoading() {
mLoading = true;
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
Loading
Loading
Loading
Loading
@@ -17,6 +17,7 @@ import com.commit451.gitlab.adapter.UsersAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.viewHolders.UserViewHolder;
 
import java.util.List;
 
Loading
Loading
@@ -28,6 +29,7 @@ import retrofit.Retrofit;
import timber.log.Timber;
 
/**
* All the users!
* Created by John on 9/28/15.
*/
public class UsersFragment extends BaseFragment {
Loading
Loading
@@ -63,8 +65,8 @@ public class UsersFragment extends BaseFragment {
 
private final UsersAdapter.Listener mUsersAdapterListener = new UsersAdapter.Listener() {
@Override
public void onUserClicked(User user) {
NavigationManager.navigateToUser(getActivity(), user);
public void onUserClicked(User user, UserViewHolder userViewHolder) {
NavigationManager.navigateToUser(getActivity(), userViewHolder.image, user);
}
};
 
Loading
Loading
@@ -72,11 +74,11 @@ public class UsersFragment extends BaseFragment {
 
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
mSwipeRefreshLayout.setRefreshing(false);
if (!response.isSuccess()) {
if (getView() == null) {
return;
}
if (getView() == null) {
mSwipeRefreshLayout.setRefreshing(false);
if (!response.isSuccess()) {
return;
}
if (response.body().size() == 0) {
Loading
Loading
Loading
Loading
@@ -4,6 +4,8 @@ import com.google.gson.annotations.SerializedName;
 
import org.parceler.Parcel;
 
import java.util.Date;
/**
* Merge that request!
* Created by Jawn on 9/20/2015.
Loading
Loading
@@ -34,6 +36,10 @@ public class MergeRequest {
User mAssignee;
@SerializedName("description")
String mDescription;
@SerializedName("updated_at")
Date mUpdatedAt;
@SerializedName("created_at")
Date mCreatedAt;
@SerializedName("work_in_progress")
boolean mWorkInProgress;
 
Loading
Loading
@@ -90,4 +96,12 @@ public class MergeRequest {
public boolean isWorkInProgress() {
return mWorkInProgress;
}
public Date getCreatedAt() {
return mCreatedAt;
}
public Date getUpdatedAt() {
return mUpdatedAt;
}
}
package com.commit451.gitlab.model;
import com.google.gson.annotations.SerializedName;
import org.parceler.Parcel;
/**
* A comment on a merge request
* Created by Jawnnypoo on 11/17/2015.
*/
@Parcel
public class MergeRequestComment {
@SerializedName("note")
String mComment;
@SerializedName("author")
User mAuthor;
public String getComment() {
return mComment;
}
public User getAuthor() {
return mAuthor;
}
}
package com.commit451.gitlab.model;
 
import com.google.gson.annotations.SerializedName;
import org.parceler.Parcel;
 
import java.util.Date;
@Parcel
public class Note {
@SerializedName("id")
long id;
@SerializedName("body")
String body;
@SerializedName("author")
User author;
@SerializedName("created_at")
Date created_at;
 
public Note(){}
Loading
Loading
package com.commit451.gitlab.tools;
import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.widget.SwitchCompat;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.CheckBox;
import android.widget.TextView;
import com.commit451.gitlab.R;
public class ColorUtil {
private static float[] hsv = new float[3];
public static int getDarkerColor(int color) {
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f; // value component
return Color.HSVToColor(hsv);
}
public static void setStatusBarAndNavBarColor(Window window, int color) {
if (Build.VERSION.SDK_INT >= 21) {
window.setStatusBarColor(color);
window.setNavigationBarColor(color);
}
}
public static void animateStatusBarAndNavBarColors(Window window, int endColor) {
if (Build.VERSION.SDK_INT >= 21) {
statusBar(window, window.getStatusBarColor(), endColor);
navigationBar(window, window.getNavigationBarColor(), endColor);
}
}
public static ColorStateList createColorStateList(int color) {
return ColorStateList.valueOf(color);
}
public static ColorStateList createColorStateList(int color, int pressed) {
return new ColorStateList(new int[][]{
new int[]{android.R.attr.state_pressed},
new int[]{}
}, new int[]{
pressed,
color
});
}
public static void setBackgroundDrawable(View view, Drawable drawable) {
if (Build.VERSION.SDK_INT >= 16) {
view.setBackground(drawable);
} else {
view.setBackgroundDrawable(drawable);
}
}
public static int getBackgroundColor(View v) {
Drawable background = v.getBackground();
if (background instanceof ColorDrawable) {
return ((ColorDrawable) background).getColor();
} else {
return Color.TRANSPARENT;
}
}
public static Animator animateBackgroundColor(View v, int endColor) {
ObjectAnimator oa = ObjectAnimator.ofObject(v, "backgroundColor", new ArgbEvaluator(),
getBackgroundColor(v), endColor);
oa.start();
return oa;
}
public static Animator statusBar(Window window, int startColor, int endColor) {
ObjectAnimator oa = ObjectAnimator.ofObject(window, "statusBarColor", new ArgbEvaluator(),
startColor, endColor);
oa.start();
return oa;
}
public static Animator navigationBar(Window window, int startColor, int endColor) {
ObjectAnimator oa = ObjectAnimator.ofObject(window, "navigationBarColor", new ArgbEvaluator(),
startColor, endColor);
oa.start();
return oa;
}
public static void setTint(CheckBox box, int color, int unpressedColor) {
ColorStateList sl = new ColorStateList(new int[][]{
new int[]{-android.R.attr.state_checked},
new int[]{android.R.attr.state_checked}
}, new int[]{
unpressedColor,
color
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
box.setButtonTintList(sl);
} else {
Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(box.getContext(), R.drawable.abc_btn_check_material));
DrawableCompat.setTintList(drawable, sl);
box.setButtonDrawable(drawable);
}
}
public static void setTint(SwitchCompat switchCompat, int color, int unpressedColor) {
ColorStateList sl = new ColorStateList(new int[][]{
new int[]{-android.R.attr.state_checked},
new int[]{android.R.attr.state_checked}
}, new int[]{
unpressedColor,
color
});
DrawableCompat.setTintList(switchCompat.getThumbDrawable(), sl);
}
public static void setMenuItemsColor(Menu menu, int color) {
for (int i = 0; i < menu.size(); i++) {
Drawable icon = menu.getItem(i).getIcon();
if (icon != null) {
icon.setColorFilter(color, PorterDuff.Mode.MULTIPLY);
}
}
}
public static Animator animateTextColor(TextView textView, int color) {
ObjectAnimator oa = ObjectAnimator.ofObject(textView, "textColor", new ArgbEvaluator(),
textView.getCurrentTextColor(), color);
oa.start();
return oa;
}
}
package com.commit451.gitlab.tools;
import android.content.Context;
import com.commit451.gitlab.R;
import java.util.Date;
/**
* Our own DateUtils, which call forwards to {@link android.text.format.DateUtils} with some
* nice defaults
* Created by Jawnnypoo on 11/17/2015.
*/
public class DateUtils {
public static CharSequence getRelativeTimeSpanString(Context context, Date startTime) {
Date now = new Date();
if (now.getTime() - startTime.getTime() < android.text.format.DateUtils.SECOND_IN_MILLIS) {
return context.getString(R.string.just_now);
}
return android.text.format.DateUtils.getRelativeTimeSpanString(startTime.getTime(),
now.getTime(),
android.text.format.DateUtils.SECOND_IN_MILLIS);
}
}
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