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 667 additions and 240 deletions
Loading
Loading
@@ -4,14 +4,14 @@ apply plugin: 'com.neenbedankt.android-apt'
 
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
buildToolsVersion "23.0.2"
 
defaultConfig {
applicationId "com.commit451.gitlab"
minSdkVersion 16
targetSdkVersion 23
versionCode 212
versionName "2.1.2"
versionCode 213
versionName "2.1.3"
}
buildTypes {
release {
Loading
Loading
@@ -34,11 +34,11 @@ android {
 
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.android.support:cardview-v7:23.1.0'
compile 'com.android.support:palette-v7:23.1.0'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:palette-v7:23.1.1'
compile 'com.google.code.gson:gson:2.3.1'
compile 'net.danlew:android.joda:2.8.2'
compile 'com.squareup.picasso:picasso:2.5.2'
Loading
Loading
@@ -52,14 +52,16 @@ dependencies {
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup:otto:1.3.8'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.jakewharton.timber:timber:4.0.1'
compile 'com.jakewharton.timber:timber:4.1.0'
compile 'de.hdodenhof:circleimageview:2.0.0'
compile 'com.pnikosis:materialish-progress:1.7'
compile "org.parceler:parceler-api:1.0.3"
apt "org.parceler:parceler:1.0.3"
compile 'com.jawnnypoo:physicslayout:1.0.0'
compile 'com.commit451:bypasses:1.0.1'
compile 'com.github.ivbaranov:MaterialLetterIcon:0.2.0'
compile 'com.commit451:easel:0.0.4'
compile 'com.github.ivbaranov:MaterialLetterIcon:0.2.1'
compile 'com.github.johnkil.android-robototextview:robototextview:2.4.3'
compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') {
transitive = true;
}
Loading
Loading
Loading
Loading
@@ -28,9 +28,11 @@
 
<activity android:name=".activities.LoginActivity" />
 
<activity android:name=".activities.ProjectsActivity" />
<activity android:name=".activities.ProjectsActivity"
android:theme="@style/Activity.Projects"/>
 
<activity android:name=".activities.GroupsActivity"/>
<activity android:name=".activities.GroupsActivity"
android:theme="@style/Activity.Groups"/>
 
<activity
android:name=".activities.FileActivity"
Loading
Loading
@@ -47,9 +49,12 @@
 
<activity android:name=".activities.AboutActivity"/>
<activity android:name=".activities.AddUserActivity"/>
<activity android:name=".activities.UserActivity"/>
<activity android:name=".activities.UserActivity"
android:theme="@style/Activity.User"/>
<activity android:name=".activities.SearchActivity"/>
<activity android:name=".activities.GroupActivity"/>
<activity android:name=".activities.GroupActivity"
android:theme="@style/Activity.Group"/>
<activity android:name=".activities.MergeRequestActivity"/>
 
<meta-data
android:name="io.fabric.ApiKey"
Loading
Loading
Loading
Loading
@@ -2,7 +2,6 @@ package com.commit451.gitlab;
 
import android.app.Application;
 
import com.commit451.gitlab.tools.Repository;
import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Bus;
 
Loading
Loading
@@ -39,7 +38,6 @@ public class GitLabApp extends Application {
} else {
Fabric.with(this, new Crashlytics());
}
Repository.init();
JodaTimeAndroid.init(this);
}
}
Loading
Loading
@@ -23,6 +23,7 @@ import com.commit451.gitlab.dialogs.UserRoleDialog;
import com.commit451.gitlab.events.UserAddedEvent;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.KeyboardUtil;
import com.commit451.gitlab.viewHolders.MemberViewHolder;
 
import java.util.List;
 
Loading
Loading
@@ -39,8 +40,11 @@ import timber.log.Timber;
*/
public class AddUserActivity extends BaseActivity {
 
public static Intent newInstance(Context context) {
private static final String KEY_GROUP = "key_group";
public static Intent newInstance(Context context, long groupId) {
Intent intent = new Intent(context, AddUserActivity.class);
intent.putExtra(KEY_GROUP, groupId);
return intent;
}
 
Loading
Loading
@@ -51,6 +55,8 @@ public class AddUserActivity extends BaseActivity {
MemberAdapter mAdapter;
UserRoleDialog mUserRoleDialog;
User mSelectedUser;
long mGroupId;
private final View.OnClickListener mOnBackPressed = new View.OnClickListener() {
@Override
public void onClick(View v) {
Loading
Loading
@@ -90,7 +96,7 @@ public class AddUserActivity extends BaseActivity {
 
private final MemberAdapter.Listener mUserClickListener = new MemberAdapter.Listener() {
@Override
public void onUserClicked(User user) {
public void onUserClicked(User user, MemberViewHolder memberViewHolder) {
mSelectedUser = user;
mUserRoleDialog.show();
}
Loading
Loading
@@ -100,10 +106,10 @@ public class AddUserActivity extends BaseActivity {
@Override
public void onAccessLevelClicked(String accessLevel) {
//TODO fix this cause yeah...
// GitLabClient.instance().addGroupMember(
// GitLabApp.instance().getSelectedProject().getGroup().getId(),
// mSelectedUser.getId(),
// accessLevel).enqueue(mAddGroupMemeberCallback);
GitLabClient.instance().addGroupMember(
mGroupId,
mSelectedUser.getId(),
accessLevel).enqueue(mAddGroupMemeberCallback);
}
};
 
Loading
Loading
@@ -134,6 +140,7 @@ public class AddUserActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_user);
ButterKnife.bind(this);
mGroupId = getIntent().getLongExtra(KEY_GROUP, -1);
mUserRoleDialog = new UserRoleDialog(this, mUserRoleDialogListener);
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(mOnBackPressed);
Loading
Loading
Loading
Loading
@@ -4,7 +4,7 @@ import android.app.Activity;
import android.os.Bundle;
 
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.tools.Prefs;
import com.commit451.gitlab.data.Prefs;
 
/**
* This activity acts as switching platform for the application directing the user to the appropriate
Loading
Loading
package com.commit451.gitlab.activities;
 
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.graphics.Palette;
import android.support.v7.internal.widget.ThemeUtils;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
Loading
Loading
@@ -16,13 +19,14 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.commit451.easel.Easel;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectsAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.Group;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.ColorUtil;
import com.commit451.gitlab.tools.NavigationManager;
import com.pnikosis.materialishprogress.ProgressWheel;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
 
Loading
Loading
@@ -30,6 +34,7 @@ import org.parceler.Parcels;
 
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;
Loading
Loading
@@ -53,8 +58,12 @@ public class GroupActivity extends BaseActivity {
@Bind(R.id.backdrop) ImageView mBackdrop;
@Bind(R.id.list) RecyclerView mProjectsRecyclerView;
ProjectsAdapter mProjectsAdapter;
@Bind(R.id.progress) View mProgress;
@Bind(R.id.progress) ProgressWheel mProgress;
@Bind(R.id.message) TextView mMessageView;
@OnClick(R.id.fab_add_user)
public void onClickAddUser() {
startActivity(AddUserActivity.newInstance(this, mGroup.getId()));
}
 
private final Target mImageLoadTarget = new Target() {
@Override
Loading
Loading
@@ -119,7 +128,7 @@ public class GroupActivity extends BaseActivity {
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
onBackPressed();
}
});
Picasso.with(this)
Loading
Loading
@@ -131,13 +140,41 @@ public class GroupActivity extends BaseActivity {
load();
}
 
@Override
public void onBackPressed() {
supportFinishAfterTransition();
}
private void bindPalette(Palette palette) {
int vibrantColor = palette.getVibrantColor(ThemeUtils.getThemeAttrColor(this, R.attr.colorPrimary));
int animationTime = 1000;
int vibrantColor = palette.getVibrantColor(Easel.getThemeAttrColor(this, R.attr.colorPrimary));
int darkerColor = Easel.getDarkerColor(vibrantColor);
if (Build.VERSION.SDK_INT >= 21) {
Easel.getNavigationBarColorAnimator(getWindow(), darkerColor)
.setDuration(animationTime)
.start();
}
 
ColorUtil.animateStatusBarAndNavBarColors(getWindow(), ColorUtil.getDarkerColor(vibrantColor));
//TODO animate this too
mCollapsingToolbarLayout.setContentScrimColor(vibrantColor);
mToolbar.setTitleTextColor(palette.getDarkMutedColor(Color.BLACK));
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "contentScrimColor", new ArgbEvaluator(),
((ColorDrawable) mCollapsingToolbarLayout.getContentScrim()).getColor(), vibrantColor)
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "statusBarScrimColor", new ArgbEvaluator(),
((ColorDrawable) mCollapsingToolbarLayout.getStatusBarScrim()).getColor(), darkerColor)
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mToolbar, "titleTextColor", new ArgbEvaluator(),
Color.WHITE, palette.getDarkMutedColor(Color.BLACK))
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mProgress, "barColor", new ArgbEvaluator(),
mProgress.getBarColor(), vibrantColor)
.setDuration(animationTime)
.start();
}
 
private void load() {
Loading
Loading
Loading
Loading
@@ -17,6 +17,7 @@ import com.commit451.gitlab.adapter.GroupAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.Group;
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.viewHolders.GroupViewHolder;
 
import java.util.List;
 
Loading
Loading
@@ -73,8 +74,8 @@ public class GroupsActivity extends BaseActivity {
 
private final GroupAdapter.Listener mGroupAdapterListener = new GroupAdapter.Listener() {
@Override
public void onGroupClicked(Group group) {
NavigationManager.navigateToGroup(GroupsActivity.this, group);
public void onGroupClicked(Group group, GroupViewHolder groupViewHolder) {
NavigationManager.navigateToGroup(GroupsActivity.this, groupViewHolder.image, group);
}
};
 
Loading
Loading
Loading
Loading
@@ -11,13 +11,12 @@ import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.NotesAdapter;
import com.commit451.gitlab.adapter.IssueDetailsAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.dialogs.NewIssueDialog;
import com.commit451.gitlab.events.IssueChangedEvent;
Loading
Loading
@@ -25,10 +24,12 @@ import com.commit451.gitlab.model.Issue;
import com.commit451.gitlab.model.Note;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.IntentUtil;
import com.commit451.gitlab.tools.KeyboardUtil;
import com.squareup.otto.Subscribe;
 
import org.parceler.Parcels;
 
import java.util.Collections;
import java.util.List;
 
import butterknife.Bind;
Loading
Loading
@@ -73,7 +74,7 @@ public class IssueActivity extends BaseActivity {
 
MenuItem mOpenCloseMenuItem;
 
NotesAdapter mNotesAdapter;
IssueDetailsAdapter mIssueDetailsAdapter;
Project mProject;
Issue mIssue;
 
Loading
Loading
@@ -94,7 +95,7 @@ public class IssueActivity extends BaseActivity {
}
};
 
private Callback<List<Note>> notesCallback = new Callback<List<Note>>() {
private Callback<List<Note>> mNotesCallback = new Callback<List<Note>>() {
 
@Override
public void onResponse(Response<List<Note>> response, Retrofit retrofit) {
Loading
Loading
@@ -102,7 +103,9 @@ public class IssueActivity extends BaseActivity {
return;
}
mSwipeRefreshLayout.setRefreshing(false);
mNotesAdapter.addNotes(response.body());
//Annoying that this is not API controlled...
Collections.reverse(response.body());
mIssueDetailsAdapter.addNotes(response.body());
}
 
@Override
Loading
Loading
@@ -138,7 +141,7 @@ public class IssueActivity extends BaseActivity {
}
};
 
private Callback<Note> noteCallback = new Callback<Note>() {
private Callback<Note> mPostNoteCallback = new Callback<Note>() {
 
@Override
public void onResponse(Response<Note> response, Retrofit retrofit) {
Loading
Loading
@@ -146,7 +149,8 @@ public class IssueActivity extends BaseActivity {
return;
}
mProgress.setVisibility(View.GONE);
mNotesAdapter.addNote(response.body());
mIssueDetailsAdapter.addNote(response.body());
mListView.smoothScrollToPosition(mIssueDetailsAdapter.getItemCount());
}
 
@Override
Loading
Loading
@@ -181,9 +185,9 @@ public class IssueActivity extends BaseActivity {
mOpenCloseMenuItem = mToolbar.getMenu().findItem(R.id.action_close);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
mNotesAdapter = new NotesAdapter(mIssue);
mIssueDetailsAdapter = new IssueDetailsAdapter(mIssue);
mListView.setLayoutManager(new LinearLayoutManager(this));
mListView.setAdapter(mNotesAdapter);
mListView.setAdapter(mIssueDetailsAdapter);
 
mNewNoteEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
Loading
Loading
@@ -210,10 +214,10 @@ public class IssueActivity extends BaseActivity {
}
 
private void bindIssue() {
mToolbar.setTitle(getString(R.string.issue_number) + mIssue.getId());
mToolbar.setTitle(getString(R.string.issue_number) + mIssue.getIid());
setOpenCloseMenuStatus();
mIssueTitle.setText(mIssue.getTitle());
mNotesAdapter.updateIssue(mIssue);
mIssueDetailsAdapter.updateIssue(mIssue);
}
 
private void loadNotes() {
Loading
Loading
@@ -226,7 +230,7 @@ public class IssueActivity extends BaseActivity {
}
});
mSwipeRefreshLayout.setRefreshing(true);
GitLabClient.instance().getIssueNotes(mProject.getId(), mIssue.getId()).enqueue(notesCallback);
GitLabClient.instance().getIssueNotes(mProject.getId(), mIssue.getId()).enqueue(mNotesCallback);
}
 
private void postNote() {
Loading
Loading
@@ -240,11 +244,10 @@ public class IssueActivity extends BaseActivity {
mProgress.setAlpha(0.0f);
mProgress.animate().alpha(1.0f);
// Clear text & collapse keyboard
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mNewNoteEdit.getWindowToken(), 0);
KeyboardUtil.hideKeyboard(this);
mNewNoteEdit.setText("");
 
GitLabClient.instance().postIssueNote(mProject.getId(), mIssue.getId(), body).enqueue(noteCallback);
GitLabClient.instance().postIssueNote(mProject.getId(), mIssue.getId(), body).enqueue(mPostNoteCallback);
}
 
private void closeIssue() {
Loading
Loading
Loading
Loading
@@ -10,13 +10,14 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v4.content.ContextCompat;
import android.text.method.LinkMovementMethod;
import android.util.Patterns;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
 
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -24,9 +25,11 @@ import com.commit451.gitlab.model.Session;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.KeyboardUtil;
import com.commit451.gitlab.tools.NavigationManager;
import com.commit451.gitlab.tools.Prefs;
import com.commit451.gitlab.data.Prefs;
import com.commit451.gitlab.views.EmailAutoCompleteTextView;
 
import java.util.regex.Pattern;
import javax.net.ssl.SSLHandshakeException;
 
import butterknife.Bind;
Loading
Loading
@@ -47,19 +50,20 @@ public class LoginActivity extends BaseActivity {
}
 
@Bind(R.id.root) View mRoot;
@Bind(R.id.url_hint) TextInputLayout urlHint;
@Bind(R.id.url_input) TextView urlInput;
@Bind(R.id.user_input_hint) TextInputLayout userHint;
@Bind(R.id.user_input) EmailAutoCompleteTextView userInput;
@Bind(R.id.password_hint) TextInputLayout passwordHint;
@Bind(R.id.password_input) TextView passwordInput;
@Bind(R.id.token_hint) TextInputLayout tokenHint;
@Bind(R.id.token_input) TextView tokenInput;
@Bind(R.id.normal_login) View normalLogin;
@Bind(R.id.token_login) View tokenLogin;
@Bind(R.id.progress) View progress;
@Bind(R.id.url_hint) TextInputLayout mUrlHint;
@Bind(R.id.url_input) TextView mUrlInput;
@Bind(R.id.user_input_hint) TextInputLayout mUserHint;
@Bind(R.id.user_input) EmailAutoCompleteTextView mUserInput;
@Bind(R.id.password_hint) TextInputLayout mPasswordHint;
@Bind(R.id.password_input) TextView mPasswordInput;
@Bind(R.id.token_hint) TextInputLayout mTokenHint;
@Bind(R.id.token_input) TextView mTokenInput;
@Bind(R.id.normal_login) View mNormalLogin;
@Bind(R.id.token_login) View mTokenLogin;
@Bind(R.id.progress) View mProgress;
private boolean isNormalLogin = true;
private boolean mIsNormalLogin = true;
private Pattern mUrlPattern = Patterns.WEB_URL;
 
private final TextView.OnEditorActionListener onEditorActionListener = new TextView.OnEditorActionListener() {
@Override
Loading
Loading
@@ -69,14 +73,115 @@ public class LoginActivity extends BaseActivity {
}
};
 
@OnClick(R.id.show_normal_link)
public void showNormalLogin(TextView loginTypeTextView) {
if (mNormalLogin.getVisibility() == View.VISIBLE) {
mNormalLogin.setVisibility(View.GONE);
mTokenLogin.setVisibility(View.VISIBLE);
loginTypeTextView.setText(R.string.normal_link);
mIsNormalLogin = false;
} else {
mNormalLogin.setVisibility(View.VISIBLE);
mTokenLogin.setVisibility(View.GONE);
loginTypeTextView.setText(R.string.token_link);
mIsNormalLogin = true;
}
}
@OnClick(R.id.login_button)
public void onLoginClick() {
KeyboardUtil.hideKeyboard(this);
if (hasEmptyFields(mUrlHint)) {
return;
}
if (mIsNormalLogin) {
if (hasEmptyFields(mUrlHint, mUserHint, mPasswordHint)) {
return;
}
if (!mUrlPattern.matcher(mUrlInput.getText()).matches()) {
mUrlHint.setError(getString(R.string.not_a_valid_url));
return;
} else {
mUrlHint.setError(null);
}
}
if (!mIsNormalLogin && hasEmptyFields(mTokenHint)) {
return;
}
GitLabClient.reset();
String url = mUrlInput.getText().toString();
if(url.startsWith("http://") && url.endsWith(".git")) {
mUrlInput.setText(url.substring(0, nthOccurrence(url, '/', 2)));
}
else if(url.startsWith("git@") && url.endsWith(".git")) {
mUrlInput.setText("http://" + url.substring(4, url.indexOf(':')));
}
else if(!url.startsWith("http://") && !url.startsWith("https://")) {
mUrlInput.setText("http://" + mUrlInput.getText().toString());
}
if(mIsNormalLogin) {
connect(true);
}
else {
connect(false);
}
}
private Callback<Session> mSessionCallback = new Callback<Session>() {
@Override
public void onResponse(Response<Session> response, Retrofit retrofit) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccess()) {
handleConnectionResponse(response.code());
return;
}
Prefs.setLoggedIn(LoginActivity.this, true);
Prefs.setPrivateToken(LoginActivity.this, response.body().getPrivateToken());
Intent i = new Intent(LoginActivity.this, GitlabActivity.class);
startActivity(i);
finish();
}
@Override
public void onFailure(Throwable t) {
handleConnectionError(t);
}
};
private Callback<User> mTestUserCallback = new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccess()) {
handleConnectionResponse(response.code());
return;
}
Prefs.setLoggedIn(LoginActivity.this, true);
NavigationManager.navigateToProjects(LoginActivity.this);
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
Snackbar.make(mRoot, getString(R.string.login_error), Snackbar.LENGTH_LONG)
.show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
passwordInput.setOnEditorActionListener(onEditorActionListener);
tokenInput.setOnEditorActionListener(onEditorActionListener);
userInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
mPasswordInput.setOnEditorActionListener(onEditorActionListener);
mTokenInput.setOnEditorActionListener(onEditorActionListener);
mUserInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
Loading
Loading
@@ -90,7 +195,7 @@ public class LoginActivity extends BaseActivity {
@TargetApi(23)
private void checkAccountPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) {
userInput.retrieveAccounts();
mUserInput.retrieveAccounts();
} else {
requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSION_REQUEST_GET_ACCOUNTS);
}
Loading
Loading
@@ -101,60 +206,11 @@ public class LoginActivity extends BaseActivity {
switch (requestCode) {
case PERMISSION_REQUEST_GET_ACCOUNTS: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
userInput.retrieveAccounts();
mUserInput.retrieveAccounts();
}
}
}
}
@OnClick(R.id.show_normal_link)
public void showNormalLogin() {
if (normalLogin.getVisibility() == View.VISIBLE) {
normalLogin.setVisibility(View.GONE);
tokenLogin.setVisibility(View.VISIBLE);
isNormalLogin = false;
} else {
normalLogin.setVisibility(View.VISIBLE);
tokenLogin.setVisibility(View.GONE);
isNormalLogin = true;
}
}
@OnClick(R.id.login_button)
public void onLoginClick() {
KeyboardUtil.hideKeyboard(this);
if (hasEmptyFields(urlHint)) {
return;
}
if (isNormalLogin && hasEmptyFields(urlHint, userHint, passwordHint)) {
return;
}
if (!isNormalLogin && hasEmptyFields(tokenHint)) {
return;
}
GitLabClient.reset();
String url = urlInput.getText().toString();
if(url.length() == 0) {
Toast.makeText(this, getString(R.string.login_error), Toast.LENGTH_SHORT)
.show();
return;
}
else if(url.startsWith("http://") && url.endsWith(".git"))
urlInput.setText(url.substring(0, nthOccurrence(url, '/', 2)));
else if(url.startsWith("git@") && url.endsWith(".git"))
urlInput.setText("http://" + url.substring(4, url.indexOf(':')));
else if(!url.startsWith("http://") && !url.startsWith("https://"))
urlInput.setText("http://" + urlInput.getText().toString());
if(isNormalLogin) {
connect(true);
}
else {
connect(false);
}
}
 
public static int nthOccurrence(String str, char c, int n) {
int pos = str.indexOf(c, 0);
Loading
Loading
@@ -169,13 +225,13 @@ public class LoginActivity extends BaseActivity {
}
private void connect(boolean byAuth) {
progress.setVisibility(View.VISIBLE);
progress.setAlpha(0.0f);
progress.animate().alpha(1.0f);
mProgress.setVisibility(View.VISIBLE);
mProgress.setAlpha(0.0f);
mProgress.animate().alpha(1.0f);
 
Prefs.setPrivateToken(this, "");
Prefs.setLoggedIn(this, false);
Prefs.setServerUrl(this, urlInput.getText().toString());
Prefs.setServerUrl(this, mUrlInput.getText().toString());
if(byAuth) {
connectByAuth();
Loading
Loading
@@ -186,67 +242,23 @@ public class LoginActivity extends BaseActivity {
}
private void connectByAuth() {
if(userInput.getText().toString().contains("@")) {
GitLabClient.instance().getSessionByEmail(userInput.getText().toString(), passwordInput.getText().toString()).enqueue(sessionCallback);
if(mUserInput.getText().toString().contains("@")) {
GitLabClient.instance().getSessionByEmail(mUserInput.getText().toString(), mPasswordInput.getText().toString()).enqueue(mSessionCallback);
}
else {
GitLabClient.instance().getSessionByUsername(userInput.getText().toString(), passwordInput.getText().toString()).enqueue(sessionCallback);
GitLabClient.instance().getSessionByUsername(mUserInput.getText().toString(), mPasswordInput.getText().toString()).enqueue(mSessionCallback);
}
}
private Callback<Session> sessionCallback = new Callback<Session>() {
@Override
public void onResponse(Response<Session> response, Retrofit retrofit) {
if (!response.isSuccess()) {
Timber.d("onResponse failed");
return;
}
progress.setVisibility(View.GONE);
Prefs.setLoggedIn(LoginActivity.this, true);
Prefs.setPrivateToken(LoginActivity.this, response.body().getPrivateToken());
Intent i = new Intent(LoginActivity.this, GitlabActivity.class);
startActivity(i);
finish();
}
@Override
public void onFailure(Throwable t) {
handleConnectionError(t, true);
}
};
private void connectByToken() {
Prefs.setPrivateToken(this, tokenInput.getText().toString());
Prefs.setPrivateToken(this, mTokenInput.getText().toString());
GitLabClient.instance().getUser().enqueue(mTestUserCallback);
}
 
private Callback<User> mTestUserCallback = new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
if (!response.isSuccess()) {
return;
}
progress.setVisibility(View.GONE);
Prefs.setLoggedIn(LoginActivity.this, true);
NavigationManager.navigateToProjects(LoginActivity.this);
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
Toast.makeText(LoginActivity.this, R.string.error_creating_account, Toast.LENGTH_SHORT)
.show();
}
};
private void handleConnectionError(Throwable e, boolean auth) {
private void handleConnectionError(Throwable e) {
Timber.e(e.toString());
 
progress.setVisibility(View.GONE);
mProgress.setVisibility(View.GONE);
 
if(e instanceof SSLHandshakeException) {
Dialog d = new AlertDialog.Builder(this)
Loading
Loading
@@ -262,8 +274,20 @@ public class LoginActivity extends BaseActivity {
 
((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
} else {
Toast.makeText(this, getString(R.string.login_error), Toast.LENGTH_SHORT)
.show();
Snackbar.make(mRoot, getString(R.string.login_error), Snackbar.LENGTH_LONG)
.show();
}
}
private void handleConnectionResponse(int responseCode) {
switch (responseCode) {
case 401:
Snackbar.make(mRoot, getString(R.string.login_unauthorized), Snackbar.LENGTH_LONG)
.show();
return;
default:
Snackbar.make(mRoot, getString(R.string.login_error), Snackbar.LENGTH_LONG)
.show();
}
}
}
package com.commit451.gitlab.activities;
import android.content.Context;
import android.content.Intent;
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.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.MergeRequestDetailAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.MergeRequest;
import com.commit451.gitlab.model.MergeRequestComment;
import com.commit451.gitlab.model.Project;
import com.commit451.gitlab.tools.KeyboardUtil;
import org.parceler.Parcels;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;
import timber.log.Timber;
/**
* Shows the details of a merge request
* Created by John on 11/16/15.
*/
public class MergeRequestActivity extends BaseActivity {
private static final String KEY_PROJECT = "key_project";
private static final String KEY_MERGE_REQUEST = "key_merge_request";
public static Intent newInstance(Context context, Project project, MergeRequest mergeRequest) {
Intent intent = new Intent(context, MergeRequestActivity.class);
intent.putExtra(KEY_PROJECT, Parcels.wrap(project));
intent.putExtra(KEY_MERGE_REQUEST, Parcels.wrap(mergeRequest));
return intent;
}
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.merge_request_title) TextView mMergeRequestTitle;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mListView;
@Bind(R.id.new_note_edit) EditText mNewNoteEdit;
@Bind(R.id.progress) View mProgress;
@OnClick(R.id.new_note_button)
public void onNewNoteClick() {
postNote();
}
MergeRequestDetailAdapter mMergeRequestDetailAdapter;
Project mProject;
MergeRequest mMergeRequest;
private Callback<List<MergeRequestComment>> mNotesCallback = new Callback<List<MergeRequestComment>>() {
@Override
public void onResponse(Response<List<MergeRequestComment>> response, Retrofit retrofit) {
mSwipeRefreshLayout.setRefreshing(false);
if (!response.isSuccess()) {
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
return;
}
mMergeRequestDetailAdapter.addNotes(response.body());
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<MergeRequestComment> mPostNoteCallback = new Callback<MergeRequestComment>() {
@Override
public void onResponse(Response<MergeRequestComment> response, Retrofit retrofit) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccess()) {
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
return;
}
mMergeRequestDetailAdapter.addNote(response.body());
mListView.smoothScrollToPosition(mMergeRequestDetailAdapter.getItemCount());
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
mProgress.setVisibility(View.GONE);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_merge_request);
ButterKnife.bind(this);
mProject = Parcels.unwrap(getIntent().getParcelableExtra(KEY_PROJECT));
mMergeRequest = Parcels.unwrap(getIntent().getParcelableExtra(KEY_MERGE_REQUEST));
mToolbar.setTitle(getString(R.string.merge_request_number) + mMergeRequest.getIid());
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
mToolbar.setSubtitle(mProject.getNameWithNamespace());
mMergeRequestTitle.setText(mMergeRequest.getTitle());
mMergeRequestDetailAdapter = new MergeRequestDetailAdapter(mMergeRequest);
mListView.setLayoutManager(new LinearLayoutManager(this));
mListView.setAdapter(mMergeRequestDetailAdapter);
mNewNoteEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
postNote();
return true;
}
});
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadNotes();
}
});
loadNotes();
}
private void loadNotes() {
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setRefreshing(true);
}
}
});
mSwipeRefreshLayout.setRefreshing(true);
GitLabClient.instance().getMergeRequestNotes(mProject.getId(), mMergeRequest.getId()).enqueue(mNotesCallback);
}
private void postNote() {
String body = mNewNoteEdit.getText().toString();
if(body.length() < 1) {
return;
}
mProgress.setVisibility(View.VISIBLE);
mProgress.setAlpha(0.0f);
mProgress.animate().alpha(1.0f);
// Clear text & collapse keyboard
KeyboardUtil.hideKeyboard(this);
mNewNoteEdit.setText("");
GitLabClient.instance().postMergeRequestComment(mProject.getId(), mMergeRequest.getId(), body).enqueue(mPostNoteCallback);
}
}
Loading
Loading
@@ -22,7 +22,7 @@ import com.commit451.gitlab.events.ProjectReloadEvent;
import com.commit451.gitlab.fragments.CommitsFragment;
import com.commit451.gitlab.fragments.FilesFragment;
import com.commit451.gitlab.fragments.IssuesFragment;
import com.commit451.gitlab.fragments.MergeRequestFragment;
import com.commit451.gitlab.fragments.MergeRequestsFragment;
import com.commit451.gitlab.fragments.MembersFragment;
import com.commit451.gitlab.fragments.OverviewFragment;
import com.commit451.gitlab.model.Branch;
Loading
Loading
@@ -50,13 +50,13 @@ public class ProjectActivity extends BaseActivity {
return intent;
}
 
@Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.tabs) TabLayout tabs;
@Bind(R.id.branch_spinner) Spinner branchSpinner;
@Bind(R.id.progress) View progress;
@Bind(R.id.pager) ViewPager viewPager;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.branch_spinner) Spinner mBranchSpinner;
@Bind(R.id.progress) View mProgress;
@Bind(R.id.pager) ViewPager mViewPager;
 
private final AdapterView.OnItemSelectedListener spinnerItemSelectedListener = new AdapterView.OnItemSelectedListener() {
private final AdapterView.OnItemSelectedListener mSpinnerItemSelectedListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mBranchName = ((TextView)view).getText().toString();
Loading
Loading
@@ -77,20 +77,24 @@ public class ProjectActivity extends BaseActivity {
if (!response.isSuccess()) {
return;
}
progress.setVisibility(View.GONE);
mProgress.setVisibility(View.GONE);
 
branchSpinner.setVisibility(View.VISIBLE);
branchSpinner.setAlpha(0.0f);
branchSpinner.animate().alpha(1.0f);
// Set up the dropdown list navigation in the action bar.
branchSpinner.setAdapter(new ArrayAdapter<>(ProjectActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, response.body()));
if(response.body().isEmpty()) {
mBranchSpinner.setVisibility(View.GONE);
} else {
mBranchSpinner.setVisibility(View.VISIBLE);
mBranchSpinner.setAlpha(0.0f);
mBranchSpinner.animate().alpha(1.0f);
// Set up the dropdown list navigation in the action bar.
mBranchSpinner.setAdapter(new ArrayAdapter<>(ProjectActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, response.body()));
}
for (int i=0; i<response.body().size(); i++) {
if (response.body().get(i).getName().equals(mProject.getDefaultBranch())) {
branchSpinner.setSelection(i);
mBranchSpinner.setSelection(i);
}
}
 
branchSpinner.setOnItemSelectedListener(spinnerItemSelectedListener);
mBranchSpinner.setOnItemSelectedListener(mSpinnerItemSelectedListener);
 
if(response.body().isEmpty()) {
broadcastLoad();
Loading
Loading
@@ -99,7 +103,7 @@ public class ProjectActivity extends BaseActivity {
 
@Override
public void onFailure(Throwable t) {
progress.setVisibility(View.GONE);
mProgress.setVisibility(View.GONE);
Timber.e(t.toString());
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
Loading
Loading
@@ -125,20 +129,20 @@ public class ProjectActivity extends BaseActivity {
ButterKnife.bind(this);
mProject = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_PROJECT));
 
toolbar.setNavigationIcon(R.drawable.ic_back_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
toolbar.inflateMenu(R.menu.menu_repository);
toolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mToolbar.inflateMenu(R.menu.menu_repository);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
 
viewPager.setAdapter(sectionsPagerAdapter);
tabs.setupWithViewPager(viewPager);
mViewPager.setAdapter(sectionsPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
loadBranches();
}
 
Loading
Loading
@@ -154,7 +158,7 @@ public class ProjectActivity extends BaseActivity {
public void onBackPressed() {
boolean handled = false;
switch(viewPager.getCurrentItem()) {
switch(mViewPager.getCurrentItem()) {
case 0:
OverviewFragment overviewFragment = (OverviewFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":0");
handled = overviewFragment.onBackPressed();
Loading
Loading
@@ -172,8 +176,8 @@ public class ProjectActivity extends BaseActivity {
handled = filesFragment.onBackPressed();
break;
case 4:
MergeRequestFragment mergeRequestFragment = (MergeRequestFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":4");
handled = mergeRequestFragment.onBackPressed();
MergeRequestsFragment mergeRequestsFragment = (MergeRequestsFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":4");
handled = mergeRequestsFragment.onBackPressed();
break;
case 5:
MembersFragment membersFragment = (MembersFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":5");
Loading
Loading
Loading
Loading
@@ -2,8 +2,6 @@ package com.commit451.gitlab.activities;
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
Loading
Loading
@@ -13,8 +11,6 @@ import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
Loading
Loading
@@ -43,7 +39,7 @@ public class ProjectsActivity extends BaseActivity {
@Bind(R.id.navigation_view) NavigationView mNavigationView;
@Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout;
 
EventReceiver eventReceiver;
EventReceiver mEventReceiver;
 
private final Toolbar.OnMenuItemClickListener mOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
Loading
Loading
@@ -62,15 +58,8 @@ public class ProjectsActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_projects);
ButterKnife.bind(this);
eventReceiver = new EventReceiver();
GitLabApp.bus().register(eventReceiver);
// Setup window flags if Lollipop
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
 
mToolbar.setTitle(R.string.projects);
mToolbar.setNavigationIcon(R.drawable.ic_menu_24dp);
Loading
Loading
@@ -89,7 +78,7 @@ public class ProjectsActivity extends BaseActivity {
@Override
protected void onDestroy() {
super.onDestroy();
GitLabApp.bus().unregister(eventReceiver);
GitLabApp.bus().unregister(mEventReceiver);
}
 
private class EventReceiver {
Loading
Loading
package com.commit451.gitlab.activities;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.commit451.gitlab.R;
import butterknife.ButterKnife;
/**
* Settings screens are fun!
* Created by John on 11/10/15.
*/
public class SettingsActivity extends BaseActivity {
public static Intent newInstance(Context context) {
Intent intent = new Intent(context, SettingsActivity.class);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
ButterKnife.bind(this);
}
}
package com.commit451.gitlab.activities;
 
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.graphics.Palette;
import android.support.v7.internal.widget.ThemeUtils;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
Loading
Loading
@@ -16,16 +19,17 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.commit451.easel.Easel;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.FeedAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.data.Prefs;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.model.rss.Entry;
import com.commit451.gitlab.model.rss.UserFeed;
import com.commit451.gitlab.tools.ColorUtil;
import com.commit451.gitlab.tools.ImageUtil;
import com.commit451.gitlab.tools.IntentUtil;
import com.commit451.gitlab.tools.Prefs;
import com.pnikosis.materialishprogress.ProgressWheel;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
 
Loading
Loading
@@ -57,7 +61,7 @@ public class UserActivity extends BaseActivity {
@Bind(R.id.backdrop) ImageView mBackdrop;
@Bind(R.id.list) RecyclerView mActivityRecyclerView;
FeedAdapter mFeedAdapter;
@Bind(R.id.progress) View mProgress;
@Bind(R.id.progress) ProgressWheel mProgress;
@Bind(R.id.message) TextView mMessageView;
 
User mUser;
Loading
Loading
@@ -136,13 +140,42 @@ public class UserActivity extends BaseActivity {
load();
}
 
@Override
public void onBackPressed() {
supportFinishAfterTransition();
}
private void bindPalette(Palette palette) {
int vibrantColor = palette.getVibrantColor(ThemeUtils.getThemeAttrColor(this, R.attr.colorPrimary));
int animationTime = 1000;
int vibrantColor = palette.getVibrantColor(Easel.getThemeAttrColor(this, R.attr.colorPrimary));
int darkerColor = Easel.getDarkerColor(vibrantColor);
if (Build.VERSION.SDK_INT >= 21) {
Easel.getNavigationBarColorAnimator(getWindow(), darkerColor)
.setDuration(animationTime)
.start();
getWindow().setStatusBarColor(darkerColor);
}
 
ColorUtil.animateStatusBarAndNavBarColors(getWindow(), ColorUtil.getDarkerColor(vibrantColor));
//TODO animate this too
mCollapsingToolbarLayout.setContentScrimColor(vibrantColor);
mToolbar.setTitleTextColor(palette.getDarkMutedColor(Color.BLACK));
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "contentScrimColor", new ArgbEvaluator(),
((ColorDrawable)mCollapsingToolbarLayout.getContentScrim()).getColor(), vibrantColor)
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "statusBarScrimColor", new ArgbEvaluator(),
((ColorDrawable) mCollapsingToolbarLayout.getStatusBarScrim()).getColor(), darkerColor)
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mToolbar, "titleTextColor", new ArgbEvaluator(),
Color.WHITE, palette.getDarkMutedColor(Color.BLACK))
.setDuration(animationTime)
.start();
ObjectAnimator.ofObject(mProgress, "barColor", new ArgbEvaluator(),
mProgress.getBarColor(), vibrantColor)
.setDuration(animationTime)
.start();
}
 
private void load() {
Loading
Loading
Loading
Loading
@@ -18,7 +18,7 @@ import java.util.Collection;
public class GroupAdapter extends RecyclerView.Adapter<GroupViewHolder> {
 
public interface Listener {
void onGroupClicked(Group group);
void onGroupClicked(Group group, GroupViewHolder groupViewHolder);
}
private Listener mListener;
 
Loading
Loading
@@ -33,7 +33,8 @@ public class GroupAdapter extends RecyclerView.Adapter<GroupViewHolder> {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onGroupClicked(getEntry(position));
GroupViewHolder holder = (GroupViewHolder) v.getTag(R.id.list_view_holder);
mListener.onGroupClicked(getEntry(position), holder);
}
};
 
Loading
Loading
@@ -55,6 +56,7 @@ public class GroupAdapter extends RecyclerView.Adapter<GroupViewHolder> {
@Override
public void onBindViewHolder(final GroupViewHolder holder, int position) {
holder.itemView.setTag(R.id.list_position, position);
holder.itemView.setTag(R.id.list_view_holder, holder);
holder.bind(getEntry(position));
}
 
Loading
Loading
Loading
Loading
@@ -17,7 +17,7 @@ import java.util.List;
* Nice notes
* Created by Jawn on 8/6/2015.
*/
public class NotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public class IssueDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 
private static final int TYPE_HEADER = 0;
private static final int TYPE_COMMENT = 1;
Loading
Loading
@@ -29,7 +29,7 @@ public class NotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private ArrayList<Milestone> mMilestones;
private Issue mIssue;
 
public NotesAdapter(Issue issue) {
public IssueDetailsAdapter(Issue issue) {
mIssue = issue;
mNotes = new ArrayList<>();
mUsers = new ArrayList<>();
Loading
Loading
@@ -39,7 +39,7 @@ public class NotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return IssueHeaderViewHolder.create(parent);
return IssueHeaderViewHolder.newInstance(parent);
} else if (viewType == TYPE_COMMENT) {
RecyclerView.ViewHolder holder = NoteViewHolder.newInstance(parent);
return holder;
Loading
Loading
@@ -88,8 +88,8 @@ public class NotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
 
public void addNote(Note note) {
mNotes.add(0, note);
notifyItemInserted(0);
mNotes.add(note);
notifyItemInserted(mNotes.size() + HEADER_COUNT);
}
 
public void addUsers(List<User> users) {
Loading
Loading
Loading
Loading
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.Collection;
 
/**
* Issues adapter
* Created by Jawn on 7/28/2015.
*/
public class IssuesAdapter extends RecyclerView.Adapter<IssueViewHolder> {
Loading
Loading
Loading
Loading
@@ -17,7 +17,7 @@ import java.util.Collection;
public class MemberAdapter extends RecyclerView.Adapter<MemberViewHolder> {
 
public interface Listener {
void onUserClicked(User user);
void onUserClicked(User user, MemberViewHolder memberViewHolder);
}
 
private Listener mListener;
Loading
Loading
@@ -28,7 +28,8 @@ public class MemberAdapter extends RecyclerView.Adapter<MemberViewHolder> {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onUserClicked(getValueAt(position));
MemberViewHolder memberViewHolder = (MemberViewHolder) v.getTag(R.id.list_view_holder);
mListener.onUserClicked(getValueAt(position), memberViewHolder);
}
};
 
Loading
Loading
@@ -61,6 +62,7 @@ public class MemberAdapter extends RecyclerView.Adapter<MemberViewHolder> {
User user = getValueAt(position);
holder.bind(user);
holder.itemView.setTag(R.id.list_position, position);
holder.itemView.setTag(R.id.list_view_holder, holder);
}
 
@Override
Loading
Loading
package com.commit451.gitlab.adapter;
 
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
 
import com.commit451.gitlab.R;
Loading
Loading
@@ -12,16 +13,26 @@ import java.util.Collection;
import java.util.List;
 
/**
* Merge request adapter!
* Created by Jawn on 9/20/2015.
*/
public class MergeRequestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
public interface Listener {
void onMergeRequestClicked(MergeRequest mergeRequest);
}
private Listener mListener;
private List<MergeRequest> mValues;
 
public MergeRequest getValueAt(int position) {
return mValues.get(position);
}
private final View.OnClickListener mOnItemClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onMergeRequestClicked(getValueAt(position));
}
};
 
public MergeRequestAdapter() {
public MergeRequestAdapter(Listener listener) {
mListener = listener;
mValues = new ArrayList<>();
}
 
Loading
Loading
@@ -36,6 +47,7 @@ public class MergeRequestAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MergeRequestViewHolder holder = MergeRequestViewHolder.newInstance(parent);
holder.itemView.setOnClickListener(mOnItemClickListener);
return holder;
}
 
Loading
Loading
@@ -52,4 +64,8 @@ public class MergeRequestAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
public int getItemCount() {
return mValues.size();
}
public MergeRequest getValueAt(int position) {
return mValues.get(position);
}
}
package com.commit451.gitlab.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import com.commit451.gitlab.model.MergeRequest;
import com.commit451.gitlab.model.MergeRequestComment;
import com.commit451.gitlab.viewHolders.MergeRequestCommentViewHolder;
import com.commit451.gitlab.viewHolders.MergeRequestHeaderViewHolder;
import java.util.ArrayList;
import java.util.List;
/**
* Shows the comments and details of a merge request
* Created by John on 11/16/15.
*/
public class MergeRequestDetailAdapter 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<MergeRequestComment> mNotes;
private MergeRequest mMergeRequest;
public MergeRequestDetailAdapter(MergeRequest mergeRequest) {
mMergeRequest = mergeRequest;
mNotes = new ArrayList<>();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return MergeRequestHeaderViewHolder.newInstance(parent);
} else if (viewType == TYPE_COMMENT) {
RecyclerView.ViewHolder holder = MergeRequestCommentViewHolder.newInstance(parent);
return holder;
}
throw new IllegalArgumentException("No view type matches");
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MergeRequestHeaderViewHolder) {
((MergeRequestHeaderViewHolder) holder).bind(mMergeRequest);
} else if (holder instanceof MergeRequestCommentViewHolder) {
MergeRequestComment note = getNoteAt(position);
((MergeRequestCommentViewHolder) 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 MergeRequestComment getNoteAt(int position) {
return mNotes.get(position-1);
}
public void addNote(MergeRequestComment note) {
mNotes.add(note);
notifyItemInserted(mNotes.size() + HEADER_COUNT);
}
public void addNotes(List<MergeRequestComment> notes) {
if (!notes.isEmpty()) {
mNotes.clear();
mNotes.addAll(notes);
}
notifyDataSetChanged();
}
public void updateMergeRequest(MergeRequest mergeRequest) {
mMergeRequest = mergeRequest;
notifyItemChanged(0);
}
}
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