Skip to content

Commit

Permalink
Improve the Issue Dashboard to better reflect GitHub's behaviour
Browse files Browse the repository at this point in the history
CC #106
  • Loading branch information
jonan committed Dec 16, 2016
1 parent 0b40401 commit 3aef326
Show file tree
Hide file tree
Showing 12 changed files with 210 additions and 55 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- Show issue reactions.

### Fixed
- Improve the Issue Dashboard to better reflect GitHub's behaviour.
- Some minor bug fixes.

### Translations
Expand Down
39 changes: 39 additions & 0 deletions app/src/main/java/com/github/mobile/api/model/Issue.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,45 @@
*/
package com.github.mobile.api.model;

import java.util.Date;
import java.util.List;

public class Issue {
public long id;

public String url;

public String html_url;

public int number;

public String state;

public String title;

public String body;

public User user;

public List<Label> labels;

public User assignee;

public Milestone milestone;

public boolean locked;

public int comments;

public PullRequest pull_request;

public Date created_at;

public Date closed_at;

public Date updated_at;

public User closed_by;

public ReactionSummary reactions;
}
2 changes: 2 additions & 0 deletions app/src/main/java/com/github/mobile/api/model/Label.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package com.github.mobile.api.model;

public class Label {
public long id;

public String name;

public String color;
Expand Down
24 changes: 24 additions & 0 deletions app/src/main/java/com/github/mobile/api/model/Milestone.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,30 @@
*/
package com.github.mobile.api.model;

import java.util.Date;

public class Milestone {
public long id;

public int number;

public String state;

public String title;

public String description;

public User creator;

public int open_issues;

public int closed_issues;

public Date created_at;

public Date updated_at;

public Date closed_at;

public Date due_on;
}
20 changes: 20 additions & 0 deletions app/src/main/java/com/github/mobile/api/model/PullRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2016 Jon Ander Peñalba
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.mobile.api.model;

public class PullRequest {
public String url;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.github.mobile.api.service;

import com.github.mobile.api.model.Issue;
import com.github.mobile.api.model.Repository;
import com.github.mobile.api.model.SearchResult;
import com.github.mobile.api.model.User;
Expand All @@ -33,4 +34,9 @@ Call<SearchResult<User>> searchUsers(
Call<SearchResult<Repository>> searchRepositories(
@Query("q") String q,
@Query("page") int page);

@GET("search/issues")
Call<SearchResult<Issue>> searchIssues(
@Query("q") String q,
@Query("page") int page);
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/github/mobile/core/issue/IssueUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,16 @@ public static boolean isPullRequest(final Issue issue) {
&& !TextUtils.isEmpty(issue.getPullRequest().getHtmlUrl());
}

/**
* Is the given issue a pull request?
*
* @param issue
* @return true if pull request, false otherwise
*/
public static boolean isPullRequest(final com.github.mobile.api.model.Issue issue) {
return issue.pull_request != null;
}

/**
* Convert {@link PullRequest} model {@link Issue} model
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,41 +16,44 @@
package com.github.mobile.ui.issue;

import static com.github.mobile.RequestCodes.ISSUE_VIEW;
import static org.eclipse.egit.github.core.service.IssueService.FIELD_FILTER;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;

import com.github.kevinsawicki.wishlist.SingleTypeAdapter;
import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.api.service.PaginationService;
import com.github.mobile.api.service.SearchService;
import com.github.mobile.core.ResourcePager;
import com.github.mobile.core.issue.IssueStore;
import com.github.mobile.ui.PagedItemFragment;
import com.github.mobile.util.AvatarLoader;
import com.google.inject.Inject;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.egit.github.core.RepositoryIssue;
import org.eclipse.egit.github.core.client.PageIterator;
import org.eclipse.egit.github.core.service.IssueService;

/**
* Fragment to display a pageable list of dashboard issues
*/
public class DashboardIssueFragment extends PagedItemFragment<RepositoryIssue> {
public class DashboardIssueFragment extends PagedItemFragment<Issue> {

/**
* Filter data argument
*/
public static final String ARG_FILTER = "filter";

@Inject
private IssueService service;
private SearchService service;

@Inject
private IssueStore store;
/*@Inject
private IssueStore store;*/

@Inject
private AvatarLoader avatars;
Expand Down Expand Up @@ -80,28 +83,33 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
startActivityForResult(
IssuesViewActivity.createIntent(items, position
IssuesViewActivity.createIntentWithNewModel(items, position
- getListAdapter().getHeadersCount()), ISSUE_VIEW);
}

@Override
protected ResourcePager<RepositoryIssue> createPager() {
return new ResourcePager<RepositoryIssue>() {
protected ResourcePager<Issue> createPager() {
return new ResourcePager<Issue>() {

@Override
protected RepositoryIssue register(RepositoryIssue resource) {
// TODO
/*@Override
protected Issue register(Issue resource) {
return store.addIssue(resource);
}
}*/

@Override
protected Object getId(RepositoryIssue resource) {
return resource.getId();
protected Object getId(Issue resource) {
return resource.id;
}

@Override
public PageIterator<RepositoryIssue> createIterator(int page,
int size) {
return service.pageIssues(filterData, page, size);
public Iterator<Collection<Issue>> createIterator(int page, int size) {
return new PaginationService<Issue>(page) {
@Override
public Collection<Issue> getSinglePage(int page, int itemsPerPage) throws IOException {
return service.searchIssues(filterData.get(FIELD_FILTER), page).execute().body().items;
}
}.getIterator();
}
};
}
Expand All @@ -117,10 +125,10 @@ protected int getErrorMessage(Exception exception) {
}

@Override
protected SingleTypeAdapter<RepositoryIssue> createAdapter(
List<RepositoryIssue> items) {
protected SingleTypeAdapter<Issue> createAdapter(
List<Issue> items) {
return new DashboardIssueListAdapter(avatars, getActivity().getResources(),
getActivity().getLayoutInflater(),
items.toArray(new RepositoryIssue[items.size()]));
items.toArray(new Issue[items.size()]));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,18 @@
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.core.issue.IssueUtils;
import com.github.mobile.util.AvatarLoader;
import com.github.mobile.util.TypefaceUtils;

import org.eclipse.egit.github.core.RepositoryIssue;

/**
* Adapter to display a list of dashboard issues
*/
public class DashboardIssueListAdapter extends
IssueListAdapter<RepositoryIssue> {
IssueListAdapter<Issue> {

private int numberPaintFlags;

Expand All @@ -43,18 +41,18 @@ public class DashboardIssueListAdapter extends
* @param elements
*/
public DashboardIssueListAdapter(AvatarLoader avatars,
Resources resources, LayoutInflater inflater, RepositoryIssue[] elements) {
Resources resources, LayoutInflater inflater, Issue[] elements) {
super(R.layout.dashboard_issue_item, inflater, resources, elements, avatars);
}

@Override
public long getItemId(final int position) {
return getItem(position).getId();
return getItem(position).id;
}

@Override
protected int getNumber(final RepositoryIssue issue) {
return issue.getNumber();
protected int getNumber(final Issue issue) {
return issue.number;
}

@Override
Expand All @@ -79,33 +77,33 @@ protected int[] getChildViewIds() {
}

@Override
protected void update(int position, RepositoryIssue issue) {
updateNumber(issue.getNumber(), issue.getState(), numberPaintFlags, 1);
protected void update(int position, Issue issue) {
updateNumber(issue.number, issue.state, numberPaintFlags, 1);

avatars.bind(imageView(3), issue.getUser());
avatars.bind(imageView(3), issue.user);

String[] segments = issue.getUrl().split("/");
String[] segments = issue.url.split("/");
int length = segments.length;
if (length >= 4)
setText(0, segments[length - 4] + '/' + segments[length - 3]);
else
setText(0, null);

setText(2, issue.getTitle());
setText(2, issue.title);

updateReporter(issue.getUser().getLogin(), issue.getCreatedAt(), 4);
updateReporter(issue.user.login, issue.created_at, 4);

setGone(5, !IssueUtils.isPullRequest(issue));
setNumber(7, issue.getComments());
setNumber(7, issue.comments);

if (issue.getComments() > 0) {
if (issue.comments > 0) {
textView(6).setTextColor(resources.getColor(R.color.text_icon_highlighted));
textView(7).setTextColor(resources.getColor(R.color.text_icon_highlighted));
} else {
textView(6).setTextColor(resources.getColor(R.color.text_icon_disabled));
textView(7).setTextColor(resources.getColor(R.color.text_icon_disabled));
}

updateLabels(issue.getLabels(), 8);
updateLabelsWithNewModel(issue.labels, 8);
}
}
Loading

0 comments on commit 3aef326

Please sign in to comment.