diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 71032fc..3d6d60f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -50,7 +50,14 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="com.bd.gitlab.MainActivity" />
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/bd/gitlab/IssueActivity.java b/app/src/main/java/com/bd/gitlab/IssueActivity.java
index 7b2e67c..fdc23e6 100644
--- a/app/src/main/java/com/bd/gitlab/IssueActivity.java
+++ b/app/src/main/java/com/bd/gitlab/IssueActivity.java
@@ -44,270 +44,280 @@
import de.keyboardsurfer.android.widget.crouton.Style;
public class IssueActivity extends Activity {
-
- @InjectView(R.id.scroll1) ScrollView scroll;
-
- @InjectView(R.id.title) TextView title;
- @InjectView(R.id.state_spinner) Spinner stateSpinner;
- @InjectView(R.id.assignee_spinner) Spinner assigneeSpinner;
- @InjectView(R.id.milestone_spinner) Spinner milestoneSpinner;
- @InjectView(R.id.description) TextView description;
- @InjectView(R.id.note_list) ListView noteList;
-
- @InjectView(R.id.progressbar_loading) ProgressBar progressBar;
- @InjectView(R.id.new_note_edit) EditText newNoteEdit;
-
- private ProgressDialog pd;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_issue);
- ButterKnife.inject(this);
-
- if(Repository.selectedIssue != null) {
- setupUI();
- loadNotes();
- }
- else
- finish();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
-
- Crouton.cancelAllCroutons();
- }
-
- /**
- * Set up the {@link android.app.ActionBar}.
- */
- private void setupUI() {
- long tempId = Repository.selectedIssue.getIid();
- if(tempId < 1)
- tempId = Repository.selectedIssue.getId();
-
- getActionBar().setDisplayHomeAsUpEnabled(true);
+
+ @InjectView(R.id.scroll1)
+ ScrollView scroll;
+
+ @InjectView(R.id.title)
+ TextView title;
+ @InjectView(R.id.state_spinner)
+ Spinner stateSpinner;
+ @InjectView(R.id.assignee_spinner)
+ Spinner assigneeSpinner;
+ @InjectView(R.id.milestone_spinner)
+ Spinner milestoneSpinner;
+ @InjectView(R.id.description)
+ TextView description;
+ @InjectView(R.id.note_list)
+ ListView noteList;
+
+ @InjectView(R.id.progressbar_loading)
+ ProgressBar progressBar;
+ @InjectView(R.id.new_note_edit)
+ EditText newNoteEdit;
+
+ private ProgressDialog pd;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_issue);
+ ButterKnife.inject(this);
+
+ if (Repository.selectedIssue != null) {
+ setupUI();
+ loadNotes();
+ } else
+ finish();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ Crouton.cancelAllCroutons();
+ }
+
+ /**
+ * Set up the {@link android.app.ActionBar}.
+ */
+ private void setupUI() {
+ long tempId = Repository.selectedIssue.getIid();
+ if (tempId < 1)
+ tempId = Repository.selectedIssue.getId();
+
+ getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setTitle("Issue #" + tempId);
getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_launcher));
-
- title.setText(Repository.selectedIssue.getTitle());
-
- ArrayList 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()));
-
- if(Repository.userAdapter != null) {
- assigneeSpinner.setAdapter(Repository.userAdapter);
- if(Repository.selectedIssue.getAssignee() != null)
- assigneeSpinner.setSelection(Repository.userAdapter.getPosition(Repository.selectedIssue.getAssignee()), true);
- }
- else {
- if(Repository.selectedIssue.getAssignee() != null) {
- ArrayList temp = new ArrayList();
- temp.add(Repository.selectedIssue.getAssignee());
- assigneeSpinner.setAdapter(new UserAdapter(this, temp));
- }
-
- Repository.getService().getUsersFallback(Repository.selectedProject.getId(), usersCallback);
- }
-
- ArrayList temp2 = new ArrayList();
- if(Repository.selectedIssue.getMilestone() != null)
- temp2.add(Repository.selectedIssue.getMilestone());
- milestoneSpinner.setAdapter(new MilestonesAdapter(this, temp2));
-
- Repository.getService().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);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.issue, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- case R.id.action_save:
- save();
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
-
- private void loadNotes() {
- progressBar.setVisibility(View.VISIBLE);
- Repository.getService().getIssueNotes(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), notesCallback);
- }
-
- private Callback> notesCallback = new Callback>() {
-
- @Override
- public void success(List notes, Response resp) {
- progressBar.setVisibility(View.GONE);
-
- NoteAdapter noteAdapter = new NoteAdapter(IssueActivity.this, notes);
- noteList.setAdapter(noteAdapter);
-
- Repository.setListViewSize(noteList);
- }
-
- @Override
- public void failure(RetrofitError e) {
- RetrofitHelper.printDebugInfo(IssueActivity.this, e);
-
- progressBar.setVisibility(View.GONE);
- Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
- }
- };
-
- @OnClick(R.id.new_note_button)
- public void onNewNoteClick() {
- String body = newNoteEdit.getText().toString();
-
- if(body.length() < 1)
- return;
-
- pd = ProgressDialog.show(IssueActivity.this, "", getResources().getString(R.string.progress_dialog), true);
-
- // Clear text & collapse keyboard
- InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(newNoteEdit.getWindowToken(), 0);
- newNoteEdit.setText("");
-
- Repository.getService().postIssueNote(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), body, noteCallback);
- }
-
- private Callback noteCallback = new Callback() {
-
- @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);
- }
- });
- }
-
- @Override
- public void failure(RetrofitError e) {
- RetrofitHelper.printDebugInfo(IssueActivity.this, e);
-
- if(pd != null && pd.isShowing())
- pd.cancel();
-
- Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
- }
- };
-
- private void save() {
- pd = ProgressDialog.show(IssueActivity.this, "", getResources().getString(R.string.progress_dialog), true);
-
- 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";
-
- Repository.getService().editIssue(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), value, assigneeSpinner.getSelectedItemId(), milestoneSpinner.getSelectedItemId(), issueCallback);
- }
-
- private Callback issueCallback = new Callback() {
-
- @Override
- public void success(Issue issue, Response resp) {
- 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());
-
- if(Repository.issueAdapter != null)
- Repository.issueAdapter.notifyDataSetChanged();
- }
-
- @Override
- public void failure(RetrofitError e) {
- RetrofitHelper.printDebugInfo(IssueActivity.this, e);
-
- if(pd != null && pd.isShowing())
- pd.cancel();
-
- Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
- }
- };
-
- private Callback> usersCallback = new Callback>() {
-
- @Override
- public void success(List 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);
- }
-
- @Override
- public void failure(RetrofitError e) {
- RetrofitHelper.printDebugInfo(IssueActivity.this, e);
-
- progressBar.setVisibility(View.GONE);
- Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
- }
- };
-
- private Callback> milestonesCallback = new Callback>() {
-
- @Override
- public void success(List 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);
- }
-
- @Override
- public void failure(RetrofitError e) {
- RetrofitHelper.printDebugInfo(IssueActivity.this, e);
-
- progressBar.setVisibility(View.GONE);
- Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
- }
- };
+
+ title.setText(Repository.selectedIssue.getTitle());
+
+ ArrayList 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()));
+
+ if (Repository.userAdapter != null) {
+ assigneeSpinner.setAdapter(Repository.userAdapter);
+ if (Repository.selectedIssue.getAssignee() != null)
+ assigneeSpinner.setSelection(Repository.userAdapter.getPosition(Repository.selectedIssue.getAssignee()), true);
+ } else {
+ if (Repository.selectedIssue.getAssignee() != null) {
+ ArrayList temp = new ArrayList();
+ temp.add(Repository.selectedIssue.getAssignee());
+ assigneeSpinner.setAdapter(new UserAdapter(this, temp));
+ }
+
+ Repository.getService().getUsersFallback(Repository.selectedProject.getId(), usersCallback);
+ }
+
+ ArrayList temp2 = new ArrayList();
+ if (Repository.selectedIssue.getMilestone() != null)
+ temp2.add(Repository.selectedIssue.getMilestone());
+ milestoneSpinner.setAdapter(new MilestonesAdapter(this, temp2));
+
+ if (milestoneSpinner.getAdapter().getCount() == 0) {
+ milestoneSpinner.setVisibility(View.GONE);
+ }
+
+ Repository.getService().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);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.issue, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ case R.id.action_save:
+ save();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void loadNotes() {
+ progressBar.setVisibility(View.VISIBLE);
+ Repository.getService().getIssueNotes(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), notesCallback);
+ }
+
+ private Callback> notesCallback = new Callback>() {
+
+ @Override
+ public void success(List notes, Response resp) {
+ progressBar.setVisibility(View.GONE);
+
+ NoteAdapter noteAdapter = new NoteAdapter(IssueActivity.this, notes);
+ noteList.setAdapter(noteAdapter);
+
+ Repository.setListViewSize(noteList);
+ }
+
+ @Override
+ public void failure(RetrofitError e) {
+ RetrofitHelper.printDebugInfo(IssueActivity.this, e);
+
+ progressBar.setVisibility(View.GONE);
+ Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
+ }
+ };
+
+ @OnClick(R.id.new_note_button)
+ public void onNewNoteClick() {
+ String body = newNoteEdit.getText().toString();
+
+ if (body.length() < 1)
+ return;
+
+ pd = ProgressDialog.show(IssueActivity.this, "", getResources().getString(R.string.progress_dialog), true);
+
+ // Clear text & collapse keyboard
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(newNoteEdit.getWindowToken(), 0);
+ newNoteEdit.setText("");
+
+ Repository.getService().postIssueNote(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), body, noteCallback);
+ }
+
+ private Callback noteCallback = new Callback() {
+
+ @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);
+ }
+ });
+ }
+
+ @Override
+ public void failure(RetrofitError e) {
+ RetrofitHelper.printDebugInfo(IssueActivity.this, e);
+
+ if (pd != null && pd.isShowing())
+ pd.cancel();
+
+ Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
+ }
+ };
+
+ private void save() {
+ pd = ProgressDialog.show(IssueActivity.this, "", getResources().getString(R.string.progress_dialog), true);
+
+ 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";
+
+ Repository.getService().editIssue(Repository.selectedProject.getId(), Repository.selectedIssue.getId(), value, assigneeSpinner.getSelectedItemId(), milestoneSpinner.getSelectedItemId(), issueCallback);
+ }
+
+ private Callback issueCallback = new Callback() {
+
+ @Override
+ public void success(Issue issue, Response resp) {
+ 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());
+
+ if (Repository.issueAdapter != null)
+ Repository.issueAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void failure(RetrofitError e) {
+ RetrofitHelper.printDebugInfo(IssueActivity.this, e);
+
+ if (pd != null && pd.isShowing())
+ pd.cancel();
+
+ Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
+ }
+ };
+
+ private Callback> usersCallback = new Callback>() {
+
+ @Override
+ public void success(List 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);
+ }
+
+ @Override
+ public void failure(RetrofitError e) {
+ RetrofitHelper.printDebugInfo(IssueActivity.this, e);
+
+ progressBar.setVisibility(View.GONE);
+ Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
+ }
+ };
+
+ private Callback> milestonesCallback = new Callback>() {
+
+ @Override
+ public void success(List 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);
+ }
+
+ @Override
+ public void failure(RetrofitError e) {
+ RetrofitHelper.printDebugInfo(IssueActivity.this, e);
+
+ progressBar.setVisibility(View.GONE);
+ Crouton.makeText(IssueActivity.this, R.string.connection_error, Style.ALERT).show();
+ }
+ };
}
diff --git a/app/src/main/java/com/bd/gitlab/MainActivity.java b/app/src/main/java/com/bd/gitlab/MainActivity.java
index 995947f..725c854 100644
--- a/app/src/main/java/com/bd/gitlab/MainActivity.java
+++ b/app/src/main/java/com/bd/gitlab/MainActivity.java
@@ -188,6 +188,10 @@ public boolean onOptionsItemSelected(MenuItem item) {
else
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
return true;
+ case R.id.profile:
+ Intent i = new Intent(MainActivity.this,ProfileActivity.class);
+ startActivity(i);
+ return true;
default:
return super.onOptionsItemSelected(item);
}
diff --git a/app/src/main/java/com/bd/gitlab/ProfileActivity.java b/app/src/main/java/com/bd/gitlab/ProfileActivity.java
new file mode 100644
index 0000000..6a9cab5
--- /dev/null
+++ b/app/src/main/java/com/bd/gitlab/ProfileActivity.java
@@ -0,0 +1,92 @@
+package com.bd.gitlab;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.EditText;
+import android.widget.ImageView;
+
+import com.bd.gitlab.model.User;
+import com.bd.gitlab.tools.Repository;
+import com.bd.gitlab.views.CircleTransform;
+import com.squareup.picasso.Picasso;
+
+import java.nio.Buffer;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
+
+/**
+ * Created by lenovo on 2016/7/14.
+ */
+public class ProfileActivity extends Activity{
+ @InjectView(R.id.avatar)
+ ImageView mAvatar;
+ @InjectView(R.id.nickname)
+ EditText mNickname;
+ @InjectView(R.id.email_text)
+ EditText mEmail;
+ @InjectView(R.id.public_email_text)
+ EditText mPublicEmail;
+ @InjectView(R.id.skype_text)
+ EditText mSkype;
+ @InjectView(R.id.linkidin_text)
+ EditText mLinkedin;
+ @InjectView(R.id.twitter_text)
+ EditText mTwitter;
+ @InjectView(R.id.website_text)
+ EditText mWebsite;
+ @InjectView(R.id.bio_text)
+ EditText mBio;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_profile);
+ ButterKnife.inject(this);
+ Repository.getService().getUser(userCallback);
+ }
+
+ private Callback userCallback = new Callback() {
+ @Override
+ public void success(User user, Response response) {
+ Picasso.with(ProfileActivity.this).load(user.getAvatarUrl()).placeholder(R.drawable.default_avatar).transform(new CircleTransform()).into(mAvatar);
+ if(!TextUtils.isEmpty(user.getName())){
+ mNickname.setText(user.getName());
+ }
+
+ if(!TextUtils.isEmpty(user.getEmail())){
+ mEmail.setText(user.getEmail());
+ }
+
+ if(!TextUtils.isEmpty(user.getSkype())){
+ mSkype.setText(user.getSkype());
+ }
+
+ if(!TextUtils.isEmpty(user.getTwitter())){
+ mTwitter.setText(user.getTwitter());
+ }
+
+ if(!TextUtils.isEmpty(user.getLinkedin())){
+ mLinkedin.setText(user.getLinkedin());
+ }
+
+ if(!TextUtils.isEmpty(user.getWebsite_url())){
+ mWebsite.setText(user.getWebsite_url());
+ }
+
+ if(!TextUtils.isEmpty(user.getBio())){
+ mBio.setText(user.getBio());
+ }
+ }
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ };
+}
diff --git a/app/src/main/java/com/bd/gitlab/adapter/IssuesAdapter.java b/app/src/main/java/com/bd/gitlab/adapter/IssuesAdapter.java
index 3c8f433..9374fa5 100644
--- a/app/src/main/java/com/bd/gitlab/adapter/IssuesAdapter.java
+++ b/app/src/main/java/com/bd/gitlab/adapter/IssuesAdapter.java
@@ -14,6 +14,7 @@
import com.bd.gitlab.R;
import com.bd.gitlab.model.Issue;
import com.bd.gitlab.tools.Repository;
+import com.bd.gitlab.views.CircleTransform;
import com.bd.gitlab.views.CompoundTextView;
import com.squareup.picasso.Picasso;
@@ -91,7 +92,7 @@ else if(issues.get(position).getAssignee().getAvatarUrl() != null)
}
summary.setText(assigneeName);
- Picasso.with(convertView.getContext()).load(assigneeAvatarUrl).into(summary);
+ Picasso.with(convertView.getContext()).load(assigneeAvatarUrl).placeholder(R.drawable.default_avatar).transform(new CircleTransform()).into(summary);
return convertView;
}
diff --git a/app/src/main/java/com/bd/gitlab/adapter/NoteAdapter.java b/app/src/main/java/com/bd/gitlab/adapter/NoteAdapter.java
index dd74d57..e5c3682 100644
--- a/app/src/main/java/com/bd/gitlab/adapter/NoteAdapter.java
+++ b/app/src/main/java/com/bd/gitlab/adapter/NoteAdapter.java
@@ -19,6 +19,7 @@
import com.bd.gitlab.R;
import com.bd.gitlab.model.Note;
import com.bd.gitlab.tools.Repository;
+import com.bd.gitlab.views.CircleTransform;
import com.squareup.picasso.Picasso;
public class NoteAdapter extends BaseAdapter {
@@ -90,7 +91,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
else if(notes.get(position).getAuthor().getAvatarUrl() != null)
url = notes.get(position).getAuthor().getAvatarUrl() + "&s=" + size;
- Picasso.with(convertView.getContext()).load(url).into(icon);
+ Picasso.with(convertView.getContext()).load(url).placeholder(R.drawable.default_avatar).transform(new CircleTransform()).into(icon);
return convertView;
}
diff --git a/app/src/main/java/com/bd/gitlab/adapter/UserAdapter.java b/app/src/main/java/com/bd/gitlab/adapter/UserAdapter.java
index 9edcedf..2064a20 100644
--- a/app/src/main/java/com/bd/gitlab/adapter/UserAdapter.java
+++ b/app/src/main/java/com/bd/gitlab/adapter/UserAdapter.java
@@ -14,6 +14,7 @@
import com.bd.gitlab.R;
import com.bd.gitlab.model.User;
import com.bd.gitlab.tools.Repository;
+import com.bd.gitlab.views.CircleTransform;
import com.squareup.picasso.Picasso;
import fr.tkeunebr.gravatar.Gravatar;
@@ -96,7 +97,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
else if(users.get(position).getAvatarUrl() != null)
url = users.get(position).getAvatarUrl() + "&s=" + size;
- Picasso.with(convertView.getContext()).load(url).into(icon);
+ Picasso.with(convertView.getContext()).load(url).placeholder(R.drawable.default_avatar).transform(new CircleTransform()).into(icon);
return convertView;
}
diff --git a/app/src/main/java/com/bd/gitlab/model/User.java b/app/src/main/java/com/bd/gitlab/model/User.java
index 7d5e7c8..c3b03f2 100644
--- a/app/src/main/java/com/bd/gitlab/model/User.java
+++ b/app/src/main/java/com/bd/gitlab/model/User.java
@@ -12,6 +12,19 @@ public class User {
private boolean blocked;
private Date created_at;
private int access_level;
+ private String private_token;
+ private String state;
+ private String bio;
+ private String skype;
+ private String linkedin;
+ private String twitter;
+ private String website_url;
+ private int theme_id;
+ private int color_scheme_id;
+ private boolean is_admin;
+ private boolean can_create_group;
+ private boolean can_create_project;
+ private int projects_limit;
public long getId() {
return id;
@@ -82,4 +95,133 @@ public boolean equals(Object obj) {
return rhs.id == id;
}
+
+
+ public String getAvatar_url() {
+ return avatar_url;
+ }
+
+ public void setAvatar_url(String avatar_url) {
+ this.avatar_url = avatar_url;
+ }
+
+ public Date getCreated_at() {
+ return created_at;
+ }
+
+ public void setCreated_at(Date created_at) {
+ this.created_at = created_at;
+ }
+
+ public int getAccess_level() {
+ return access_level;
+ }
+
+ public void setAccess_level(int access_level) {
+ this.access_level = access_level;
+ }
+
+ public String getPrivate_token() {
+ return private_token;
+ }
+
+ public void setPrivate_token(String private_token) {
+ this.private_token = private_token;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getBio() {
+ return bio;
+ }
+
+ public void setBio(String bio) {
+ this.bio = bio;
+ }
+
+ public String getSkype() {
+ return skype;
+ }
+
+ public void setSkype(String skype) {
+ this.skype = skype;
+ }
+
+ public String getLinkedin() {
+ return linkedin;
+ }
+
+ public void setLinkedin(String linkedin) {
+ this.linkedin = linkedin;
+ }
+
+ public String getTwitter() {
+ return twitter;
+ }
+
+ public void setTwitter(String twitter) {
+ this.twitter = twitter;
+ }
+
+ public String getWebsite_url() {
+ return website_url;
+ }
+
+ public void setWebsite_url(String website_url) {
+ this.website_url = website_url;
+ }
+
+ public int getTheme_id() {
+ return theme_id;
+ }
+
+ public void setTheme_id(int theme_id) {
+ this.theme_id = theme_id;
+ }
+
+ public int getColor_scheme_id() {
+ return color_scheme_id;
+ }
+
+ public void setColor_scheme_id(int color_scheme_id) {
+ this.color_scheme_id = color_scheme_id;
+ }
+
+ public boolean is_admin() {
+ return is_admin;
+ }
+
+ public void setIs_admin(boolean is_admin) {
+ this.is_admin = is_admin;
+ }
+
+ public boolean isCan_create_group() {
+ return can_create_group;
+ }
+
+ public void setCan_create_group(boolean can_create_group) {
+ this.can_create_group = can_create_group;
+ }
+
+ public boolean isCan_create_project() {
+ return can_create_project;
+ }
+
+ public void setCan_create_project(boolean can_create_project) {
+ this.can_create_project = can_create_project;
+ }
+
+ public int getProjects_limit() {
+ return projects_limit;
+ }
+
+ public void setProjects_limit(int projects_limit) {
+ this.projects_limit = projects_limit;
+ }
}
diff --git a/app/src/main/java/com/bd/gitlab/tools/GitLabAPI.java b/app/src/main/java/com/bd/gitlab/tools/GitLabAPI.java
index 9a45a42..c14176c 100644
--- a/app/src/main/java/com/bd/gitlab/tools/GitLabAPI.java
+++ b/app/src/main/java/com/bd/gitlab/tools/GitLabAPI.java
@@ -93,7 +93,9 @@ public interface GitLabAPI {
void getBlob(@Path("id") long projectId, @Path("sha") String commitId, @Query("filepath") String path, Callback cb);
/* --- USER --- */
-
+ @GET("/user")
+ void getUser(Callback cb);
+
@GET("/groups/{id}/members?per_page=100")
void getGroupMembers(@Path("id") long groupId, Callback> cb);
diff --git a/app/src/main/java/com/bd/gitlab/util/BitmapUtil.java b/app/src/main/java/com/bd/gitlab/util/BitmapUtil.java
new file mode 100644
index 0000000..90b0eb9
--- /dev/null
+++ b/app/src/main/java/com/bd/gitlab/util/BitmapUtil.java
@@ -0,0 +1,41 @@
+package com.bd.gitlab.util;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+
+/**
+ * Created by yangguang on 2016/7/7.
+ */
+public class BitmapUtil {
+ public static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成 bitmap
+ {
+ int width = drawable.getIntrinsicWidth(); // 取 drawable 的长宽
+ int height = drawable.getIntrinsicHeight();
+ Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 取 drawable 的颜色格式
+ Bitmap bitmap = Bitmap.createBitmap(width, height, config); // 建立对应 bitmap
+ Canvas canvas = new Canvas(bitmap); // 建立对应 bitmap 的画布
+ drawable.setBounds(0, 0, width, height);
+ drawable.draw(canvas); // 把 drawable 内容画到画布中
+ return bitmap;
+ }
+
+ public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
+ if(drawable == null){
+ return drawable;
+ }
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ Bitmap oldbmp = drawableToBitmap(drawable); // drawable 转换成 bitmap
+ Matrix matrix = new Matrix(); // 创建操作图片用的 Matrix 对象
+ float scaleWidth = ((float) w / width); // 计算缩放比例
+ float scaleHeight = ((float) h / height);
+ matrix.postScale(scaleWidth, scaleHeight); // 设置缩放比例
+ Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true); // 建立新的 bitmap ,其内容是对原 bitmap 的缩放后的图
+ return new BitmapDrawable(newbmp); // 把 bitmap 转换成 drawable 并返回
+ }
+
+}
diff --git a/app/src/main/java/com/bd/gitlab/util/DensityUtil.java b/app/src/main/java/com/bd/gitlab/util/DensityUtil.java
new file mode 100644
index 0000000..960167c
--- /dev/null
+++ b/app/src/main/java/com/bd/gitlab/util/DensityUtil.java
@@ -0,0 +1,24 @@
+package com.bd.gitlab.util;
+
+import android.content.Context;
+
+/**
+ * Created by yangguang on 2016/7/7.
+ */
+public class DensityUtil {
+ /**
+ * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
+ */
+ public static int dip2px(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+
+ /**
+ * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
+ */
+ public static int px2dip(Context context, float pxValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (pxValue / scale + 0.5f);
+ }
+}
diff --git a/app/src/main/java/com/bd/gitlab/views/CircleTransform.java b/app/src/main/java/com/bd/gitlab/views/CircleTransform.java
new file mode 100644
index 0000000..6a9c148
--- /dev/null
+++ b/app/src/main/java/com/bd/gitlab/views/CircleTransform.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2014 Julian Shen
+ *
+ * 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.bd.gitlab.views;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import com.squareup.picasso.Transformation;
+
+/**
+ * Created by julian on 13/6/21.
+ */
+public class CircleTransform implements Transformation {
+ @Override
+ public Bitmap transform(Bitmap source) {
+ int size = Math.min(source.getWidth(), source.getHeight());
+
+ int x = (source.getWidth() - size) / 2;
+ int y = (source.getHeight() - size) / 2;
+
+ Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
+ if (squaredBitmap != source) {
+ source.recycle();
+ }
+
+ Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
+
+ Canvas canvas = new Canvas(bitmap);
+ Paint paint = new Paint();
+ BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
+ paint.setShader(shader);
+ paint.setAntiAlias(true);
+
+ float r = size/2f;
+ canvas.drawCircle(r, r, r, paint);
+
+ squaredBitmap.recycle();
+ return bitmap;
+ }
+
+ @Override
+ public String key() {
+ return "circle";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/bd/gitlab/views/CompoundTextView.java b/app/src/main/java/com/bd/gitlab/views/CompoundTextView.java
index d37721c..2c3b62d 100644
--- a/app/src/main/java/com/bd/gitlab/views/CompoundTextView.java
+++ b/app/src/main/java/com/bd/gitlab/views/CompoundTextView.java
@@ -7,6 +7,8 @@
import android.util.AttributeSet;
import android.widget.TextView;
+import com.bd.gitlab.util.BitmapUtil;
+import com.bd.gitlab.util.DensityUtil;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
@@ -40,6 +42,7 @@ public void onPrepareLoad(Drawable placeHolderDrawable) {
}
private void setImage(Drawable drawable) {
+ drawable = BitmapUtil.zoomDrawable(drawable, DensityUtil.dip2px(getContext(),90), DensityUtil.dip2px(getContext(),90));
this.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
}
}
diff --git a/app/src/main/res/drawable-xhdpi/default_avatar.png b/app/src/main/res/drawable-xhdpi/default_avatar.png
new file mode 100644
index 0000000..4b63c89
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/default_avatar.png differ
diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml
new file mode 100644
index 0000000..5fedfed
--- /dev/null
+++ b/app/src/main/res/layout/activity_profile.xml
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
index faf258e..cfa3b02 100644
--- a/app/src/main/res/layout/list_item.xml
+++ b/app/src/main/res/layout/list_item.xml
@@ -6,7 +6,9 @@
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingRight="?android:attr/scrollbarSize"
- android:paddingLeft="8dp" >
+ android:paddingLeft="8dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
+ android:orientation="horizontal"
+ android:paddingTop="15dp">
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
index 2a9e4c1..cca2a1d 100644
--- a/app/src/main/res/menu/main.xml
+++ b/app/src/main/res/menu/main.xml
@@ -1,6 +1,12 @@
+ Profile
Lock orientation
Logout
Save
@@ -84,6 +85,16 @@
Add user to group
Add user
+
+ Email
+ Public email
+ Skype
+ Linkedin
+ Twitter
+ Website
+ Location
+ Bio
+
- Guest
- Reporter
diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml
new file mode 100644
index 0000000..662b1f3
--- /dev/null
+++ b/app/src/main/res/values/style.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/gitlab-android.iml b/gitlab-android.iml
new file mode 100644
index 0000000..a745aa7
--- /dev/null
+++ b/gitlab-android.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file