Skip to content
Snippets Groups Projects
Commit 8c945cbb authored by Jawnnypoo's avatar Jawnnypoo
Browse files

Change notes to a Recyclerview with a fancy header

parent 0aaf2a88
No related branches found
No related tags found
No related merge requests found
Showing
with 548 additions and 402 deletions
Loading
Loading
@@ -3,55 +3,43 @@ package com.commit451.gitlab;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.commit451.gitlab.adapter.MilestonesAdapter;
import com.commit451.gitlab.adapter.NoteAdapter;
import com.commit451.gitlab.adapter.UserAdapter;
import com.commit451.gitlab.adapter.NotesAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.Issue;
import com.commit451.gitlab.model.Milestone;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.Repository;
import com.commit451.gitlab.tools.RetrofitHelper;
 
import java.util.ArrayList;
import java.util.List;
 
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import in.uncod.android.bypass.Bypass;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
import timber.log.Timber;
 
public class IssueActivity extends BaseActivity {
 
@Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.scroll1) ScrollView scroll;
@Bind(R.id.title) TextView title;
@Bind(R.id.state_spinner) Spinner stateSpinner;
@Bind(R.id.assignee_spinner) Spinner assigneeSpinner;
@Bind(R.id.milestone_spinner) Spinner milestoneSpinner;
@Bind(R.id.description) TextView description;
@Bind(R.id.note_list) ListView noteList;
@Bind(R.id.progressbar_loading) View progressBar;
@Bind(R.id.swipe_layout) SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.list) RecyclerView listView;
@Bind(R.id.new_note_edit) EditText newNoteEdit;
 
private NotesAdapter notesAdapter;
private ProgressDialog pd;
@Override
Loading
Loading
@@ -59,130 +47,73 @@ public class IssueActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_issue);
ButterKnife.bind(this);
if(Repository.selectedIssue != null) {
setupUI();
loadNotes();
}
else {
finish();
}
}
/**
* Set up the {@link android.app.ActionBar}.
*/
private void setupUI() {
long tempId = Repository.selectedIssue.getIid();
if(tempId < 1) {
tempId = Repository.selectedIssue.getId();
}
toolbar.setNavigationIcon(R.drawable.ic_back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
toolbar.setTitle("Issue #" + tempId);
title.setText(Repository.selectedIssue.getTitle());
ArrayList<String> temp3 = new ArrayList<>();
if(Repository.selectedIssue.getState().equals("opened")) {
temp3.add("opened");
temp3.add("closed");
}
else {
temp3.add("closed");
temp3.add("reopened");
}
stateSpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, temp3));
stateSpinner.setSelection(temp3.indexOf(Repository.selectedIssue.getState()));
//Hack so that the onItemSelected does not get triggered the first time we create the view
stateSpinner.post(new Runnable() {
@Override
public void run() {
stateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
changeStatus();
}
 
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
}
});
 
if(Repository.selectedIssue.getAssignee() != null) {
ArrayList<User> temp = new ArrayList<User>();
temp.add(Repository.selectedIssue.getAssignee());
assigneeSpinner.setAdapter(new UserAdapter(this, temp));
}
GitLabClient.instance().getUsersFallback(Repository.selectedProject.getId(), usersCallback);
ArrayList<Milestone> temp2 = new ArrayList<Milestone>();
if(Repository.selectedIssue.getMilestone() != null) {
temp2.add(Repository.selectedIssue.getMilestone());
}
milestoneSpinner.setAdapter(new MilestonesAdapter(this, temp2));
GitLabClient.instance().getMilestones(Repository.selectedProject.getId(), milestonesCallback);
Bypass bypass = new Bypass();
String desc = Repository.selectedIssue.getDescription();
if(desc == null) {
desc = "";
}
description.setText(bypass.markdownToSpannable(desc));
description.setMovementMethod(LinkMovementMethod.getInstance());
Repository.setListViewSize(noteList);
}
private void loadNotes() {
progressBar.setVisibility(View.VISIBLE);
long tempId = Repository.selectedIssue.getIid();
if(tempId < 1) {
tempId = Repository.selectedIssue.getId();
}
toolbar.setNavigationIcon(R.drawable.ic_back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
toolbar.setTitle("Issue #" + tempId);
notesAdapter = new NotesAdapter();
listView.setLayoutManager(new LinearLayoutManager(this));
listView.setAdapter(notesAdapter);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
load();
}
});
load();
}
private void load() {
swipeRefreshLayout.setRefreshing(true);
//TODO chain these
GitLabClient.instance().getIssueNotes(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), notesCallback);
GitLabClient.instance().getMilestones(Repository.selectedProject.getId(), milestonesCallback);
GitLabClient.instance().getUsersFallback(Repository.selectedProject.getId(), usersCallback);
}
 
private void changeStatus() {
String selection = stateSpinner.getSelectedItem().toString();
String value = "";
if(selection.equals("closed") && (Repository.selectedIssue.getState().equals("opened") || Repository.selectedIssue.getState().equals("reopened"))) {
value = "close";
}
if((selection.equals("reopened") || selection.equals("opened")) && Repository.selectedIssue.getState().equals("closed")) {
value = "reopen";
}
GitLabClient.instance().editIssue(
Repository.selectedProject.getId(),
Repository.selectedIssue.getId(),
value,
"",
issueCallback);
// String selection = stateSpinner.getSelectedItem().toString();
// String value = "";
// if(selection.equals("closed") && (Repository.selectedIssue.getState().equals("opened") || Repository.selectedIssue.getState().equals("reopened"))) {
// value = "close";
// }
// if((selection.equals("reopened") || selection.equals("opened")) && Repository.selectedIssue.getState().equals("closed")) {
// value = "reopen";
// }
//
// GitLabClient.instance().editIssue(
// Repository.selectedProject.getId(),
// Repository.selectedIssue.getId(),
// value,
// "",
// issueCallback);
}
private Callback<List<Note>> notesCallback = new Callback<List<Note>>() {
@Override
public void success(List<Note> notes, Response resp) {
progressBar.setVisibility(View.GONE);
NoteAdapter noteAdapter = new NoteAdapter(IssueActivity.this, notes);
noteList.setAdapter(noteAdapter);
Repository.setListViewSize(noteList);
swipeRefreshLayout.setRefreshing(false);
notesAdapter.addNotes(notes);
}
@Override
public void failure(RetrofitError e) {
RetrofitHelper.printDebugInfo(IssueActivity.this, e);
progressBar.setVisibility(View.GONE);
Timber.e(e.toString());
swipeRefreshLayout.setRefreshing(false);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
Loading
Loading
@@ -192,8 +123,9 @@ public class IssueActivity extends BaseActivity {
public void onNewNoteClick() {
String body = newNoteEdit.getText().toString();
if(body.length() < 1)
return;
if(body.length() < 1) {
return;
}
pd = ProgressDialog.show(IssueActivity.this, "", getResources().getString(R.string.progress_dialog), true);
Loading
Loading
@@ -209,28 +141,19 @@ public class IssueActivity extends BaseActivity {
@Override
public void success(Note note, Response resp) {
if(pd != null && pd.isShowing())
pd.cancel();
((NoteAdapter) noteList.getAdapter()).addNote(note);
Repository.setListViewSize(noteList);
scroll.post(new Runnable() {
@Override
public void run() {
// Scroll to bottom of list
scroll.fullScroll(View.FOCUS_DOWN);
}
});
if(pd != null && pd.isShowing()) {
pd.cancel();
}
notesAdapter.addNote(note);
}
@Override
public void failure(RetrofitError e) {
RetrofitHelper.printDebugInfo(IssueActivity.this, e);
Timber.e(e.toString());
if(pd != null && pd.isShowing())
pd.cancel();
if(pd != null && pd.isShowing()) {
pd.cancel();
}
 
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
Loading
Loading
@@ -241,19 +164,19 @@ public class IssueActivity extends BaseActivity {
@Override
public void success(Issue issue, Response resp) {
if(pd != null && pd.isShowing())
if(pd != null && pd.isShowing()) {
pd.cancel();
}
Repository.selectedIssue.setState(stateSpinner.getSelectedItem().toString());
Repository.selectedIssue.setAssignee((User) assigneeSpinner.getSelectedItem());
Repository.selectedIssue.setMilestone((Milestone) milestoneSpinner.getSelectedItem());
// Repository.selectedIssue.setState(stateSpinner.getSelectedItem().toString());
// Repository.selectedIssue.setAssignee((User) assigneeSpinner.getSelectedItem());
// Repository.selectedIssue.setMilestone((Milestone) milestoneSpinner.getSelectedItem());
//TODO notify the main activity when a issue changes so it will update in the list
}
@Override
public void failure(RetrofitError e) {
RetrofitHelper.printDebugInfo(IssueActivity.this, e);
Timber.e(e.toString());
if(pd != null && pd.isShowing()) {
pd.cancel();
}
Loading
Loading
@@ -266,18 +189,17 @@ public class IssueActivity extends BaseActivity {
@Override
public void success(List<User> users, Response resp) {
progressBar.setVisibility(View.GONE);
UserAdapter ua = new UserAdapter(IssueActivity.this, users);
assigneeSpinner.setAdapter(ua);
assigneeSpinner.setSelection(ua.getPosition(Repository.selectedIssue.getAssignee()), true);
swipeRefreshLayout.setRefreshing(false);
notesAdapter.addUsers(users);
// UserAdapter ua = new UserAdapter(IssueActivity.this, users);
// assigneeSpinner.setAdapter(ua);
// assigneeSpinner.setSelection(ua.getPosition(Repository.selectedIssue.getAssignee()), true);
}
@Override
public void failure(RetrofitError e) {
RetrofitHelper.printDebugInfo(IssueActivity.this, e);
progressBar.setVisibility(View.GONE);
Timber.e(e.toString());
swipeRefreshLayout.setRefreshing(false);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
Loading
Loading
@@ -287,21 +209,21 @@ public class IssueActivity extends BaseActivity {
@Override
public void success(List<Milestone> milestones, Response resp) {
progressBar.setVisibility(View.GONE);
MilestonesAdapter ma = new MilestonesAdapter(IssueActivity.this, milestones);
milestoneSpinner.setAdapter(ma);
milestoneSpinner.setSelection(ma.getPosition(Repository.selectedIssue.getMilestone()), true);
if (milestones.isEmpty()) {
milestoneSpinner.setVisibility(View.GONE);
}
swipeRefreshLayout.setRefreshing(false);
notesAdapter.addMilestones(milestones);
// MilestonesAdapter ma = new MilestonesAdapter(IssueActivity.this, milestones);
// milestoneSpinner.setAdapter(ma);
// milestoneSpinner.setSelection(ma.getPosition(Repository.selectedIssue.getMilestone()), true);
// if (milestones.isEmpty()) {
// milestoneSpinner.setVisibility(View.GONE);
// }
}
@Override
public void failure(RetrofitError e) {
RetrofitHelper.printDebugInfo(IssueActivity.this, e);
progressBar.setVisibility(View.GONE);
Timber.e(e.toString());
swipeRefreshLayout.setRefreshing(false);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
Loading
Loading
package com.commit451.gitlab.adapter;
import android.content.Context;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.tools.Repository;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import fr.tkeunebr.gravatar.Gravatar;
import in.uncod.android.bypass.Bypass;
public class NoteAdapter extends BaseAdapter {
private ArrayList<Note> notes;
private LayoutInflater inflater;
public NoteAdapter(Context context, List<Note> notes) {
this.notes = new ArrayList<Note>(notes);
if(context != null) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
}
@Override
public int getCount() {
return notes.size();
}
@Override
public Note getItem(int position) {
return notes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void addNote(Note note) {
if(note != null) {
notes.add(note);
notifyDataSetChanged();
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) convertView = inflater.inflate(R.layout.note_list_item, parent, false);
if(position >= notes.size() || notes.get(position) == null)
return convertView;
final TextView title = (TextView) convertView.findViewById(R.id.title);
final TextView custom = (TextView) convertView.findViewById(R.id.custom);
final TextView summary = (TextView) convertView.findViewById(R.id.summary);
final ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
if(notes.get(position).getCreatedAt() != null)
custom.setText(DateUtils.getRelativeTimeSpanString(notes.get(position).getCreatedAt().getTime()));
if(notes.get(position).getAuthor() != null)
title.setText(notes.get(position).getAuthor().getName());
String temp = "";
if(notes.get(position).getBody() != null)
temp = notes.get(position).getBody();
Bypass bypass = new Bypass();
summary.setText(bypass.markdownToSpannable(temp));
summary.setMovementMethod(LinkMovementMethod.getInstance());
float percent = Repository.displayWidth / 720f;
int size = (int) (96f * percent);
String url = "http://www.gravatar.com/avatar/00000000000000000000000000000000?s=" + size;
if(notes.get(position).getAuthor().getEmail() != null)
url = Gravatar.init().with(notes.get(position).getAuthor().getEmail()).size(size).build();
else if(notes.get(position).getAuthor().getAvatarUrl() != null)
url = notes.get(position).getAuthor().getAvatarUrl() + "&s=" + size;
Picasso.with(convertView.getContext()).load(url).into(icon);
return convertView;
}
}
package com.commit451.gitlab.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import com.commit451.gitlab.model.Milestone;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.viewHolders.IssueHeaderViewHolder;
import com.commit451.gitlab.viewHolders.NoteViewHolder;
import java.util.ArrayList;
import java.util.List;
/**
* Nice notes
* Created by Jawn on 8/6/2015.
*/
public class NotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_COMMENT = 1;
private static final int HEADER_COUNT = 1;
private ArrayList<Note> mNotes;
private ArrayList<User> mUsers;
private ArrayList<Milestone> mMilestones;
public NotesAdapter() {
mNotes = new ArrayList<>();
mUsers = new ArrayList<>();
mMilestones = new ArrayList<>();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return IssueHeaderViewHolder.create(parent);
} else if (viewType == TYPE_COMMENT) {
RecyclerView.ViewHolder holder = NoteViewHolder.newInstance(parent);
return holder;
}
throw new IllegalArgumentException("No view type matches");
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof IssueHeaderViewHolder) {
((IssueHeaderViewHolder) holder).bind();
} else if (holder instanceof NoteViewHolder) {
Note note = getNoteAt(position);
((NoteViewHolder) holder).bind(note);
}
}
@Override
public int getItemCount() {
return mNotes.size() + HEADER_COUNT;
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return TYPE_HEADER;
} else {
return TYPE_COMMENT;
}
}
private boolean isPositionHeader(int position) {
return position == 0;
}
public Note getNoteAt(int position) {
return mNotes.get(position-1);
}
public void addNotes(List<Note> notes) {
if (!notes.isEmpty()) {
mNotes.clear();
mNotes.addAll(notes);
}
notifyDataSetChanged();
}
public void addNote(Note note) {
//TODO declare position that changed
mNotes.add(0, note);
notifyItemInserted(0);
}
public void addUsers(List<User> users) {
if (!users.isEmpty()) {
users.clear();
mUsers.addAll(users);
}
notifyDataSetChanged();
}
public void addMilestones(List<Milestone> milestones) {
if (!milestones.isEmpty()) {
milestones.clear();
mMilestones.addAll(milestones);
}
notifyDataSetChanged();
}
}
package com.commit451.gitlab.events;
/**
* Created by Jawn on 7/31/2015.
*/
public class IssueCreatedEvent {
}
Loading
Loading
@@ -3,6 +3,7 @@ package com.commit451.gitlab.model;
import java.util.Date;
 
import com.commit451.gitlab.tools.Repository;
import com.google.gson.annotations.SerializedName;
 
public class Project {
Loading
Loading
@@ -19,6 +20,8 @@ public class Project {
private boolean wall_enabled;
private boolean wiki_enabled;
private Date created_at;
@SerializedName("avatar_url")
private String avatarUrl;
public long getId() {
return id;
Loading
Loading
@@ -136,7 +139,15 @@ public class Project {
else
return name;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public Group getGroup() {
if(Repository.groups == null)
return null;
Loading
Loading
package com.commit451.gitlab.tools;
 
import android.content.Context;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;
 
import com.commit451.gitlab.adapter.IssuesAdapter;
import com.commit451.gitlab.adapter.NewUserAdapter;
import com.commit451.gitlab.model.Branch;
import com.commit451.gitlab.model.DiffLine;
import com.commit451.gitlab.model.Group;
Loading
Loading
@@ -52,25 +45,4 @@ public class Repository {
newestCommit = null;
}
public static void setListViewSize(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null)
return;
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
for(int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if(listItem instanceof ViewGroup)
listItem.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
}
package com.commit451.gitlab.viewHolders;
import android.support.v7.widget.RecyclerView;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Spinner;
import android.widget.TextView;
import com.commit451.gitlab.R;
import com.commit451.gitlab.tools.Repository;
import butterknife.Bind;
import butterknife.ButterKnife;
import in.uncod.android.bypass.Bypass;
/**
* Created by Jawn on 8/6/2015.
*/
public class IssueHeaderViewHolder extends RecyclerView.ViewHolder {
public static IssueHeaderViewHolder create(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_header_issue, parent, false);
return new IssueHeaderViewHolder(view);
}
@Bind(R.id.title) TextView title;
@Bind(R.id.state_spinner) Spinner stateSpinner;
@Bind(R.id.assignee_spinner) Spinner assigneeSpinner;
@Bind(R.id.milestone_spinner) Spinner milestoneSpinner;
@Bind(R.id.description) TextView description;
public IssueHeaderViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
public void bind() {
title.setText(Repository.selectedIssue.getTitle());
Bypass bypass = new Bypass();
String desc = Repository.selectedIssue.getDescription();
if(desc == null) {
desc = "";
}
description.setText(bypass.markdownToSpannable(desc));
description.setMovementMethod(LinkMovementMethod.getInstance());
// ArrayList<String> temp3 = new ArrayList<>();
// if(Repository.selectedIssue.getState().equals("opened")) {
// temp3.add("opened");
// temp3.add("closed");
// }
// else {
// temp3.add("closed");
// temp3.add("reopened");
// }
// stateSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, temp3));
// stateSpinner.setSelection(temp3.indexOf(Repository.selectedIssue.getState()));
// //Hack so that the onItemSelected does not get triggered the first time we create the view
// stateSpinner.post(new Runnable() {
// @Override
// public void run() {
// stateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// @Override
// public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// changeStatus();
// }
//
// @Override
// public void onNothingSelected(AdapterView<?> parent) {
// }
// });
// }
// });
//
// if(Repository.selectedIssue.getAssignee() != null) {
// ArrayList<User> temp = new ArrayList<User>();
// temp.add(Repository.selectedIssue.getAssignee());
// assigneeSpinner.setAdapter(new UserAdapter(this, temp));
// }
//
// ArrayList<Milestone> temp2 = new ArrayList<Milestone>();
// if(Repository.selectedIssue.getMilestone() != null) {
// temp2.add(Repository.selectedIssue.getMilestone());
// }
// milestoneSpinner.setAdapter(new MilestonesAdapter(this, temp2));
}
}
\ No newline at end of file
package com.commit451.gitlab.viewHolders;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.tools.Repository;
import com.squareup.picasso.Picasso;
import butterknife.Bind;
import butterknife.ButterKnife;
import fr.tkeunebr.gravatar.Gravatar;
import in.uncod.android.bypass.Bypass;
/**
* Created by Jawn on 8/6/2015.
*/
public class NoteViewHolder extends RecyclerView.ViewHolder{
public static NoteViewHolder newInstance(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_note, parent, false);
return new NoteViewHolder(view);
}
@Bind(R.id.title) TextView title;
@Bind(R.id.summary) TextView summary;
@Bind(R.id.custom) TextView custom;
@Bind(R.id.icon) ImageView icon;
public NoteViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
public void bind(Note note) {
if(note.getCreatedAt() != null) {
custom.setText(DateUtils.getRelativeTimeSpanString(note.getCreatedAt().getTime()));
}
if(note.getAuthor() != null) {
title.setText(note.getAuthor().getName());
}
String temp = "";
if(note.getBody() != null) {
temp = note.getBody();
}
Bypass bypass = new Bypass();
summary.setText(bypass.markdownToSpannable(temp));
summary.setMovementMethod(LinkMovementMethod.getInstance());
float percent = Repository.displayWidth / 720f;
int size = (int) (96f * percent);
String url = "http://www.gravatar.com/avatar/00000000000000000000000000000000?s=" + size;
if(note.getAuthor().getEmail() != null) {
url = Gravatar.init().with(note.getAuthor().getEmail()).size(size).build();
}
else if(note.getAuthor().getAvatarUrl() != null) {
url = note.getAuthor().getAvatarUrl() + "&s=" + size;
}
Picasso.with(itemView.getContext()).load(url).into(icon);
}
}
package com.commit451.gitlab.viewHolders;
 
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.Repository;
import com.squareup.picasso.Picasso;
 
import butterknife.Bind;
import butterknife.ButterKnife;
import timber.log.Timber;
 
/**
* Projects, yay!
Loading
Loading
@@ -26,6 +30,7 @@ public class ProjectViewHolder extends RecyclerView.ViewHolder {
}
 
@Bind(R.id.project_title) TextView title;
@Bind(R.id.project_image) ImageView image;
 
public ProjectViewHolder(View view) {
super(view);
Loading
Loading
@@ -35,11 +40,19 @@ public class ProjectViewHolder extends RecyclerView.ViewHolder {
public void bind(Project project) {
title.setText(project.getName());
if (project.equals(Repository.selectedProject)) {
itemView.setPressed(true);
itemView.setSelected(true);
title.setTextColor(itemView.getResources().getColor(R.color.orange));
} else {
itemView.setPressed(false);
itemView.setSelected(false);
title.setTextColor(itemView.getResources().getColor(R.color.material_blue_grey_800));
}
if (!TextUtils.isEmpty(project.getAvatarUrl())) {
Timber.d("avatar url: " + project.getAvatarUrl());
Picasso.with(itemView.getContext())
.load(project.getAvatarUrl())
.into(image);
}
}
}
app/src/main/res/drawable-hdpi/ic_project.png

450 B

app/src/main/res/drawable-mdpi/ic_project.png

268 B

app/src/main/res/drawable-xhdpi/ic_project.png

549 B

app/src/main/res/drawable-xxhdpi/ic_project.png

866 B

app/src/main/res/drawable-xxxhdpi/ic_project.png

1.25 KiB

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IssueActivity" >
 
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
</android.support.design.widget.AppBarLayout>
<ScrollView
android:id="@+id/scroll1"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/lsep2"
android:layout_alignParentTop="true"
android:paddingLeft="16dp"
android:paddingTop="@dimen/padding_normal"
android:layout_marginTop="?attr/actionBarSize" >
android:layout_marginBottom="?attr/actionBarSize"
android:orientation="vertical">
 
<LinearLayout
android:id="@+id/lin1"
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingRight="16dp" >
android:layout_height="wrap_content">
 
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/state_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/assignee_spinner"
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
 
<Spinner
android:id="@+id/milestone_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:text="Description"
android:textAppearance="?android:attr/textAppearanceMedium" />
</android.support.design.widget.AppBarLayout>
 
<com.pnikosis.materialishprogress.ProgressWheel
android:id="@+id/progressbar_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:matProg_barColor="?attr/colorAccent"
app:matProg_progressIndeterminate="true"
android:visibility="gone"/>
<com.commit451.gitlab.views.GitLabSwipeRefreshLayout
android:id="@+id/swipe_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
 
<View
android:id="@+id/lsep"
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="?android:attr/dividerHorizontal" />
android:layout_height="wrap_content"/>
 
<ListView
android:id="@+id/note_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</com.commit451.gitlab.views.GitLabSwipeRefreshLayout>
 
<View
android:id="@+id/lsep2"
android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_above="@+id/rel1"
android:background="?android:attr/dividerHorizontal" />
</LinearLayout>
<RelativeLayout
<LinearLayout
android:id="@+id/rel1"
style="?android:attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="?attr/colorPrimary"
android:layout_height="?attr/actionBarSize"
android:orientation="horizontal"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp"
android:focusable="true"
android:focusableInTouchMode="true" >
android:layout_gravity="bottom"
android:background="?attr/colorPrimary" >
 
<EditText
android:id="@+id/new_note_edit"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/new_note_button"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:hint="@string/new_note_hint"
android:inputType="text" />
 
Loading
Loading
@@ -126,13 +62,12 @@
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_gravity="right"
android:state_enabled="false"
android:focusable="true"
android:contentDescription="@string/add_note_content_description"
android:src="@drawable/ic_send" />
 
</RelativeLayout>
</LinearLayout>
 
</RelativeLayout>
\ No newline at end of file
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Title"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/state_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/assignee_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/milestone_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
tools:text="Description"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/note_list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:layout_gravity="center_vertical"
android:contentDescription="@null"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/padding_normal"
android:layout_marginRight="@dimen/padding_normal"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
tools:text="Username"
android:textStyle="italic"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorTertiary" />
<TextView
android:id="@+id/custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
tools:text="Time"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorTertiary"/>
</RelativeLayout>
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Comment"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground">
 
<ImageView
android:id="@+id/project_image"
android:layout_width="@dimen/image_size"
android:layout_height="@dimen/image_size"
android:src="@drawable/ic_project"
android:contentDescription="@null"/>
<TextView
android:id="@+id/project_title"
android:layout_width="match_parent"
Loading
Loading
Loading
Loading
@@ -5,10 +5,11 @@
 
<dimen name="padding_normal">16dp</dimen>
 
<dimen name="actionbarSize">56dp</dimen>
<dimen name="doubleActionbarSize">112dp</dimen>
<dimen name="text_size_normal">22sp</dimen>
<dimen name="text_size_large">32sp</dimen>
<dimen name="text_size_huge">42sp</dimen>
<dimen name="actionbarSize">56dp</dimen>
<dimen name="doubleActionbarSize">112dp</dimen>
<dimen name="image_size">48dp</dimen>
</resources>
\ No newline at end of file
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