Skip to content
Snippets Groups Projects
Commit e3c730d9 authored by Michi302's avatar Michi302
Browse files

Merge branch 'master' into fdroid

# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/com/commit451/gitlab/LabCoatApp.java
parents 28c09fb7 e73b1aab
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 210 additions and 177 deletions
# GitLab for Android
[![Google Play](https://gitlab.com/Commit451/GitLabAndroid/raw/master/art/google-play-badge.png)](https://play.google.com/store/apps/details?id=com.commit451.gitlab)
# LabCoat for GitLab
[![Google Play](https://gitlab.com/Commit451/LabCoat/raw/master/art/google-play-badge.png)](https://play.google.com/store/apps/details?id=com.commit451.gitlab)
 
[![build status](https://gitlab.com/ci/projects/7701/status.png?ref=master)](https://gitlab.com/ci/projects/7701?ref=master)
 
This is the source code for the unofficial GitLab Android app.
 
![Image](https://gitlab.com/Commit451/GitLabAndroid/raw/master/art/screenshot-1.png)
![Image](https://gitlab.com/Commit451/LabCoat/raw/master/art/screenshot-1.png)
 
Please see the [issues](https://gitlab.com/Commit451/GitLabAndroid/issues) section to
Please see the [issues](https://gitlab.com/Commit451/LabCoat/issues) section to
report any bugs or feature requests and to see the list of known issues.
 
## Libraries
The following 3rd party libraries and resources are the reason this app works. Rapid development is easily attainable thanks to these fine folks and the work they do:
 
Loading
Loading
@@ -29,7 +30,6 @@ The following 3rd party libraries and resources are the reason this app works. R
- Parceler (https://github.com/johncarl81/parceler)
- Bypasses (https://github.com/Commit451/bypasses)
- Easel (https://github.com/Commit451/Easel)
- CircleImageView (https://github.com/hdodenhof/CircleImageView)
- Material-ish Progress (https://github.com/pnikosis/materialish-progress)
- PhysicsLayout (https://github.com/Jawnnypoo/PhysicsLayout)
- Material Letter Icon (https://github.com/IvBaranov/MaterialLetterIcon)
Loading
Loading
@@ -43,7 +43,7 @@ Please fork this repository and contribute back! All Merge Requests should be ma
License
--------
 
Copyright 2015 Commit 451
Copyright 2016 Commit 451
 
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Loading
Loading
Loading
Loading
@@ -10,8 +10,8 @@ android {
minSdkVersion 16
targetSdkVersion 23
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
versionCode 221
versionName "2.2.1"
versionCode 222
versionName "2.2.2"
}
buildTypes {
release {
Loading
Loading
@@ -37,6 +37,7 @@ dependencies {
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.android.support:customtabs:23.1.1'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
Loading
Loading
@@ -55,11 +56,13 @@ dependencies {
apt "org.parceler:parceler:1.0.3"
compile 'com.commit451:bypasses:1.0.1'
compile 'com.commit451:easel:0.0.4'
compile 'de.hdodenhof:circleimageview:2.0.0'
compile 'com.commit451:foregroundviews:1.0.0'
compile 'com.pnikosis:materialish-progress:1.7'
compile 'com.jawnnypoo:physicslayout:1.0.1'
compile 'com.github.ivbaranov:MaterialLetterIcon:0.2.1'
compile 'com.github.johnkil.android-robototextview:robototextview:2.4.3'
compile 'com.github.alorma:diff-textview:1.1.0'
compile 'com.wdullaer:materialdatetimepicker:2.1.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}
File added
Loading
Loading
@@ -8,7 +8,7 @@
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
 
<application
android:name="com.commit451.gitlab.GitLabApp"
android:name=".LabCoatApp"
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/ic_launcher"
Loading
Loading
Loading
Loading
@@ -4,6 +4,7 @@ import android.app.Application;
import android.content.res.Configuration;
import android.content.res.Resources;
 
import com.squareup.leakcanary.LeakCanary;
import com.squareup.otto.Bus;
 
import net.danlew.android.joda.JodaTimeAndroid;
Loading
Loading
@@ -15,7 +16,7 @@ import timber.log.Timber;
/**
* App for one time init things and to house singletons
*/
public class GitLabApp extends Application {
public class LabCoatApp extends Application {
 
private static Bus sBus;
public static Bus bus() {
Loading
Loading
@@ -25,8 +26,8 @@ public class GitLabApp extends Application {
return sBus;
}
 
private static GitLabApp sInstance;
public static GitLabApp instance() {
private static LabCoatApp sInstance;
public static LabCoatApp instance() {
return sInstance;
}
 
Loading
Loading
@@ -42,6 +43,7 @@ public class GitLabApp extends Application {
}
 
JodaTimeAndroid.init(this);
LeakCanary.install(this);
}
 
private void forceLocale(Locale locale){
Loading
Loading
Loading
Loading
@@ -2,7 +2,6 @@ package com.commit451.gitlab.activity;
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
Loading
Loading
@@ -13,13 +12,16 @@ import android.support.design.widget.Snackbar;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.api.Contributor;
import com.commit451.gitlab.transformation.CircleTransformation;
import com.commit451.gitlab.util.ImageUtil;
import com.commit451.gitlab.util.IntentUtil;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.util.WindowUtil;
import com.jawnnypoo.physicslayout.Physics;
import com.jawnnypoo.physicslayout.PhysicsConfig;
Loading
Loading
@@ -32,7 +34,6 @@ import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.hdodenhof.circleimageview.CircleImageView;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;
Loading
Loading
@@ -57,7 +58,11 @@ public class AboutActivity extends BaseActivity {
@Bind(R.id.physics_layout) PhysicsFrameLayout physicsLayout;
@OnClick(R.id.sauce)
void onSauceClick() {
IntentUtil.openPage(root, Uri.parse(getString(R.string.source_url)));
if ("https://gitlab.com".equals(GitLabClient.getAccount().getServerUrl().toString())) {
NavigationManager.navigateToProject(AboutActivity.this, REPO_ID);
} else {
IntentUtil.openPage(AboutActivity.this, getString(R.string.source_url));
}
}
 
SensorManager sensorManager;
Loading
Loading
@@ -140,13 +145,11 @@ public class AboutActivity extends BaseActivity {
int imageSize = getResources().getDimensionPixelSize(R.dimen.circle_size);
for (int i=0; i<contributors.size(); i++) {
Contributor contributor = contributors.get(i);
CircleImageView imageView = new CircleImageView(this);
ImageView imageView = new ImageView(this);
FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(
imageSize,
imageSize);
imageView.setLayoutParams(llp);
imageView.setBorderWidth(borderSize);
imageView.setBorderColor(Color.BLACK);
Physics.setPhysicsConfig(imageView, config);
physicsLayout.addView(imageView);
imageView.setX(x);
Loading
Loading
@@ -161,6 +164,7 @@ public class AboutActivity extends BaseActivity {
Uri url = ImageUtil.getAvatarUrl(contributor.getEmail(), imageSize);
GitLabClient.getPicasso()
.load(url)
.transform(new CircleTransformation())
.into(imageView);
}
physicsLayout.getPhysics().onLayout(true);
Loading
Loading
Loading
Loading
@@ -3,6 +3,7 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
Loading
Loading
@@ -11,9 +12,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.AssigneeSpinnerAdapter;
import com.commit451.gitlab.adapter.MilestoneSpinnerAdapter;
Loading
Loading
@@ -147,14 +147,14 @@ public class AddIssueActivity extends MorphActivity {
@Override
public void onResponse(Response<Issue> response, Retrofit retrofit) {
if (!response.isSuccess()) {
Toast.makeText(AddIssueActivity.this, getString(R.string.failed_to_create_issue), Toast.LENGTH_SHORT)
Snackbar.make(mRoot, getString(R.string.failed_to_create_issue), Snackbar.LENGTH_SHORT)
.show();
return;
}
if (mIssue == null) {
GitLabApp.bus().post(new IssueCreatedEvent(response.body()));
LabCoatApp.bus().post(new IssueCreatedEvent(response.body()));
} else {
GitLabApp.bus().post(new IssueChangedEvent(response.body()));
LabCoatApp.bus().post(new IssueChangedEvent(response.body()));
}
dismiss();
}
Loading
Loading
@@ -162,7 +162,7 @@ public class AddIssueActivity extends MorphActivity {
@Override
public void onFailure(Throwable t) {
Timber.e(t, null);
Toast.makeText(AddIssueActivity.this, getString(R.string.connection_error), Toast.LENGTH_SHORT)
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
Loading
Loading
Loading
Loading
@@ -13,7 +13,7 @@ import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.MilestoneChangedEvent;
Loading
Loading
@@ -115,9 +115,9 @@ public class AddMilestoneActivity extends MorphActivity {
return;
}
if (mMilestone == null) {
GitLabApp.bus().post(new MilestoneCreatedEvent(response.body()));
LabCoatApp.bus().post(new MilestoneCreatedEvent(response.body()));
} else {
GitLabApp.bus().post(new MilestoneChangedEvent(response.body()));
LabCoatApp.bus().post(new MilestoneChangedEvent(response.body()));
}
finish();
}
Loading
Loading
Loading
Loading
@@ -7,7 +7,6 @@ import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
Loading
Loading
@@ -17,9 +16,8 @@ import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.UsersAdapter;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -52,7 +50,7 @@ public class AddUserActivity extends MorphActivity {
private static final String KEY_PROJECT_ID = "project_id";
private static final String KEY_GROUP = "group";
 
public static Intent newInstance(Context context, long projectId) {
public static Intent newIntent(Context context, long projectId) {
Intent intent = new Intent(context, AddUserActivity.class);
intent.putExtra(KEY_PROJECT_ID, projectId);
return intent;
Loading
Loading
@@ -70,7 +68,7 @@ public class AddUserActivity extends MorphActivity {
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mRecyclerView;
@Bind(R.id.clear) View mClearView;
LinearLayoutManager mUserLinearLayoutManager;
GridLayoutManager mUserLinearLayoutManager;
 
@OnClick(R.id.clear)
void onClearClick() {
Loading
Loading
@@ -156,12 +154,13 @@ public class AddUserActivity extends MorphActivity {
}
mAdapter.setData(response.body());
mNextPageUrl = PaginationUtil.parse(response).getNext();
Timber.d("HAHA Next page url is " + mNextPageUrl);
Timber.d("Next page url is %s", mNextPageUrl);
}
 
@Override
public void onFailure(Throwable t) {
Timber.e(t, null);
mSwipeRefreshLayout.setRefreshing(false);
mLoading = false;
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
Loading
Loading
@@ -172,18 +171,19 @@ public class AddUserActivity extends MorphActivity {
@Override
public void onResponse(Response<List<UserBasic>> response, Retrofit retrofit) {
mLoading = false;
mAdapter.setLoading(false);
if (!response.isSuccess()) {
return;
}
mAdapter.addData(response.body());
mNextPageUrl = PaginationUtil.parse(response).getNext();
}
 
@Override
public void onFailure(Throwable t) {
Timber.e(t, null);
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
mAdapter.setLoading(false);
}
};
 
Loading
Loading
@@ -219,14 +219,16 @@ public class AddUserActivity extends MorphActivity {
if (!response.isSuccess()) {
//Conflict
if (response.code() == 409) {
Toast.makeText(AddUserActivity.this, R.string.error_user_conflict, Toast.LENGTH_SHORT).show();
Snackbar.make(mRoot, R.string.error_user_conflict, Snackbar.LENGTH_SHORT)
.show();
}
return;
}
Toast.makeText(AddUserActivity.this, R.string.user_added_successfully, Toast.LENGTH_SHORT).show();
Snackbar.make(mRoot, R.string.user_added_successfully, Snackbar.LENGTH_SHORT)
.show();
mAccessDialog.dismiss();
dismiss();
GitLabApp.bus().post(new MemberAddedEvent(response.body()));
LabCoatApp.bus().post(new MemberAddedEvent(response.body()));
}
 
@Override
Loading
Loading
@@ -247,10 +249,11 @@ public class AddUserActivity extends MorphActivity {
mToolbar.setNavigationOnClickListener(mOnBackPressed);
mUserSearch.setOnEditorActionListener(mSearchEditorActionListener);
mUserSearch.addTextChangedListener(mTextWatcher);
mUserLinearLayoutManager = new GridLayoutManager(this, 2);
mRecyclerView.setLayoutManager(mUserLinearLayoutManager);
mAdapter = new UsersAdapter(mUserClickListener);
mRecyclerView.setAdapter(mAdapter);
mUserLinearLayoutManager = new GridLayoutManager(this, 2);
mUserLinearLayoutManager.setSpanSizeLookup(mAdapter.getSpanSizeLookup());
mRecyclerView.setLayoutManager(mUserLinearLayoutManager);
mRecyclerView.addOnScrollListener(mOnScrollListener);
 
morph(mRoot);
Loading
Loading
@@ -265,6 +268,7 @@ public class AddUserActivity extends MorphActivity {
 
private void loadMore() {
mLoading = true;
mAdapter.setLoading(true);
Timber.d("loadMore " + mNextPageUrl.toString() + " " + mSearchQuery);
GitLabClient.instance().searchUsers(mNextPageUrl.toString(), mSearchQuery).enqueue(mMoreUsersCallback);
}
Loading
Loading
Loading
Loading
@@ -4,10 +4,8 @@ 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;
Loading
Loading
@@ -25,8 +23,7 @@ import com.commit451.gitlab.adapter.GroupPagerAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.api.Group;
import com.commit451.gitlab.model.api.GroupDetail;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import com.commit451.gitlab.transformation.PaletteTransformation;
 
import org.parceler.Parcels;
 
Loading
Loading
@@ -65,24 +62,6 @@ public class GroupActivity extends BaseActivity {
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.backdrop) ImageView mBackdrop;
 
private final Target mImageLoadTarget = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mBackdrop.setImageBitmap(bitmap);
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
public void onGenerated(Palette p) {
bindPalette(p);
}
});
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}
};
private final Callback<GroupDetail> mGroupCallback = new Callback<GroupDetail>() {
@Override
public void onResponse(Response<GroupDetail> response, Retrofit retrofit) {
Loading
Loading
@@ -131,7 +110,16 @@ public class GroupActivity extends BaseActivity {
private void bind(Group group) {
GitLabClient.getPicasso()
.load(group.getAvatarUrl())
.into(mImageLoadTarget);
.transform(PaletteTransformation.instance())
.into(mBackdrop, new PaletteTransformation.PaletteCallback(mBackdrop) {
@Override
protected void onSuccess(Palette palette) {
bindPalette(palette);
}
@Override
public void onError() {}
});
 
mViewPager.setAdapter(new GroupPagerAdapter(this, getSupportFragmentManager(), group));
mTabLayout.setupWithViewPager(mViewPager);
Loading
Loading
Loading
Loading
@@ -15,7 +15,7 @@ import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.IssueDetailsAdapter;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -167,8 +167,8 @@ public class IssueActivity extends BaseActivity {
return;
}
mIssue = response.body();
GitLabApp.bus().post(new IssueChangedEvent(mIssue));
GitLabApp.bus().post(new IssueReloadEvent());
LabCoatApp.bus().post(new IssueChangedEvent(mIssue));
LabCoatApp.bus().post(new IssueReloadEvent());
setOpenCloseMenuStatus();
loadNotes();
}
Loading
Loading
@@ -209,7 +209,7 @@ public class IssueActivity extends BaseActivity {
setContentView(R.layout.activity_issue);
ButterKnife.bind(this);
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
LabCoatApp.bus().register(mEventReceiver);
 
mProject = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_PROJECT));
mIssue = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_SELECTED_ISSUE));
Loading
Loading
@@ -226,7 +226,7 @@ public class IssueActivity extends BaseActivity {
mOpenCloseMenuItem = mToolbar.getMenu().findItem(R.id.action_close);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
mIssueDetailsAdapter = new IssueDetailsAdapter(mIssue);
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue);
mNotesLayoutManager = new LinearLayoutManager(this);
mNotesRecyclerView.setLayoutManager(mNotesLayoutManager);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
Loading
Loading
@@ -253,7 +253,7 @@ public class IssueActivity extends BaseActivity {
@Override
protected void onDestroy() {
super.onDestroy();
GitLabApp.bus().unregister(mEventReceiver);
LabCoatApp.bus().unregister(mEventReceiver);
}
 
private void bindIssue() {
Loading
Loading
Loading
Loading
@@ -19,7 +19,7 @@ import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.data.Prefs;
Loading
Loading
@@ -39,6 +39,7 @@ import com.squareup.okhttp.HttpUrl;
 
import java.security.cert.CertificateEncodingException;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
 
import javax.net.ssl.SSLHandshakeException;
Loading
Loading
@@ -143,6 +144,12 @@ public class LoginActivity extends BaseActivity {
}
}
 
if (isAlreadySignedIn(uri.toString(), mIsNormalLogin ? mUserInput.getText().toString() : mTokenInput.getText().toString())) {
Snackbar.make(mRoot, getString(R.string.already_logged_in), Snackbar.LENGTH_LONG)
.show();
return;
}
mAccount = new Account();
mAccount.setServerUrl(uri);
mAccount.setTrustedCertificate(mTrustedCertificate);
Loading
Loading
@@ -188,9 +195,9 @@ public class LoginActivity extends BaseActivity {
mAccount.setLastUsed(new Date());
Prefs.addAccount(LoginActivity.this, mAccount);
GitLabClient.setAccount(mAccount);
GitLabApp.bus().post(new LoginEvent(mAccount));
LabCoatApp.bus().post(new LoginEvent(mAccount));
//This is mostly for if projects already exists, then we will reload the data
GitLabApp.bus().post(new ReloadDataEvent());
LabCoatApp.bus().post(new ReloadDataEvent());
NavigationManager.navigateToProjects(LoginActivity.this);
finish();
}
Loading
Loading
@@ -359,4 +366,18 @@ public class LoginActivity extends BaseActivity {
});
dialog.show();
}
private boolean isAlreadySignedIn(@NonNull String url, @NonNull String usernameOrEmailOrPrivateToken) {
List<Account> accounts = Prefs.getAccounts(this);
for (Account account : accounts) {
if (account.getServerUrl().equals(Uri.parse(url))) {
if (usernameOrEmailOrPrivateToken.equals(account.getUser().getUsername())
|| usernameOrEmailOrPrivateToken.equalsIgnoreCase(account.getUser().getEmail())
|| usernameOrEmailOrPrivateToken.equalsIgnoreCase(account.getPrivateToken())) {
return true;
}
}
}
return false;
}
}
Loading
Loading
@@ -173,7 +173,7 @@ public class MergeRequestActivity extends BaseActivity {
mToolbar.setSubtitle(mProject.getNameWithNamespace());
mMergeRequestTitle.setText(mMergeRequest.getTitle());
 
mMergeRequestDetailAdapter = new MergeRequestDetailAdapter(mMergeRequest);
mMergeRequestDetailAdapter = new MergeRequestDetailAdapter(MergeRequestActivity.this, mMergeRequest);
mNotesLinearLayoutManager = new LinearLayoutManager(this);
mNotesRecyclerView.setLayoutManager(mNotesLinearLayoutManager);
mNotesRecyclerView.setAdapter(mMergeRequestDetailAdapter);
Loading
Loading
Loading
Loading
@@ -12,7 +12,7 @@ import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.MilestoneIssuesAdapter;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -154,7 +154,7 @@ public class MilestoneActivity extends BaseActivity {
setContentView(R.layout.activity_milestone);
ButterKnife.bind(this);
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
LabCoatApp.bus().register(mEventReceiver);
 
mProject = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_PROJECT));
mMilestone = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_MILESTONE));
Loading
Loading
@@ -191,7 +191,7 @@ public class MilestoneActivity extends BaseActivity {
@Override
protected void onDestroy() {
super.onDestroy();
GitLabApp.bus().unregister(mEventReceiver);
LabCoatApp.bus().unregister(mEventReceiver);
}
 
private void bind(Milestone milestone) {
Loading
Loading
Loading
Loading
@@ -15,7 +15,7 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.SectionsPagerAdapter;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -39,6 +39,7 @@ import timber.log.Timber;
public class ProjectActivity extends BaseActivity {
 
private static final String EXTRA_PROJECT = "extra_project";
private static final String EXTRA_PROJECT_ID = "extra_project_id";
 
public static Intent newInstance(Context context, Project project) {
Intent intent = new Intent(context, ProjectActivity.class);
Loading
Loading
@@ -46,6 +47,12 @@ public class ProjectActivity extends BaseActivity {
return intent;
}
 
public static Intent newInstance(Context context, long projectId) {
Intent intent = new Intent(context, ProjectActivity.class);
intent.putExtra(EXTRA_PROJECT_ID, projectId);
return intent;
}
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.branch_spinner) Spinner mBranchSpinner;
Loading
Loading
@@ -70,14 +77,44 @@ public class ProjectActivity extends BaseActivity {
Project mProject;
String mBranchName;
 
private Callback<List<Branch>> mBranchesCallback = new Callback<List<Branch>>() {
private final Callback<Project> mProjectCallback = new Callback<Project>() {
@Override
public void onResponse(Response<Project> response, Retrofit retrofit) {
if (!response.isSuccess()) {
return;
}
mProject = response.body();
setupTabs();
loadBranches();
}
@Override
public void onFailure(Throwable t) {
Timber.e(t, null);
mProgress.animate().alpha(0.0f).withEndAction(new Runnable() {
@Override
public void run() {
mProgress.setVisibility(View.GONE);
}
});
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
private final Callback<List<Branch>> mBranchesCallback = new Callback<List<Branch>>() {
 
@Override
public void onResponse(Response<List<Branch>> response, Retrofit retrofit) {
if (!response.isSuccess()) {
return;
}
mProgress.setVisibility(View.GONE);
mProgress.animate().alpha(0.0f).withEndAction(new Runnable() {
@Override
public void run() {
mProgress.setVisibility(View.GONE);
}
});
 
if(response.body().isEmpty()) {
mBranchSpinner.setVisibility(View.GONE);
Loading
Loading
@@ -104,7 +141,12 @@ public class ProjectActivity extends BaseActivity {
@Override
public void onFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
mProgress.animate().alpha(0.0f).withEndAction(new Runnable() {
@Override
public void run() {
mProgress.setVisibility(View.GONE);
}
});
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
Loading
Loading
@@ -139,19 +181,31 @@ public class ProjectActivity extends BaseActivity {
mToolbar.inflateMenu(R.menu.menu_repository);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
if (mProject == null) {
long projectId = getIntent().getLongExtra(EXTRA_PROJECT_ID, -1);
loadProject(projectId);
} else {
setupTabs();
loadBranches();
}
}
 
mViewPager.setAdapter(sectionsPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
loadBranches();
private void loadProject(long projectId) {
mProgress.setAlpha(0.0f);
mProgress.setVisibility(View.VISIBLE);
mProgress.animate().alpha(1.0f);
GitLabClient.instance().getProject(projectId).enqueue(mProjectCallback);
}
 
private void loadBranches() {
mProgress.setAlpha(0.0f);
mProgress.setVisibility(View.VISIBLE);
mProgress.animate().alpha(1.0f);
GitLabClient.instance().getBranches(mProject.getId()).enqueue(mBranchesCallback);
}
 
private void broadcastLoad() {
GitLabApp.bus().post(new ProjectReloadEvent(mProject, mBranchName));
LabCoatApp.bus().post(new ProjectReloadEvent(mProject, mBranchName));
}
 
@Override
Loading
Loading
@@ -173,4 +227,11 @@ public class ProjectActivity extends BaseActivity {
public Project getProject() {
return mProject;
}
private void setupTabs() {
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
mViewPager.setAdapter(sectionsPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
}
Loading
Loading
@@ -12,7 +12,7 @@ import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectsPagerAdapter;
import com.commit451.gitlab.event.CloseDrawerEvent;
Loading
Loading
@@ -59,7 +59,7 @@ public class ProjectsActivity extends BaseActivity {
setContentView(R.layout.activity_projects);
ButterKnife.bind(this);
mEventReceiver = new EventReceiver();
GitLabApp.bus().register(mEventReceiver);
LabCoatApp.bus().register(mEventReceiver);
 
mToolbar.setTitle(R.string.projects);
mToolbar.setNavigationIcon(R.drawable.ic_menu_24dp);
Loading
Loading
@@ -78,7 +78,7 @@ public class ProjectsActivity extends BaseActivity {
@Override
protected void onDestroy() {
super.onDestroy();
GitLabApp.bus().unregister(mEventReceiver);
LabCoatApp.bus().unregister(mEventReceiver);
}
 
private class EventReceiver {
Loading
Loading
Loading
Loading
@@ -21,10 +21,10 @@ import com.commit451.gitlab.util.KeyboardUtil;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import timber.log.Timber;
 
/**
* Search for :allthethings:
* Created by Jawn on 9/21/2015.
*/
public class SearchActivity extends BaseActivity {
 
Loading
Loading
@@ -33,6 +33,7 @@ public class SearchActivity extends BaseActivity {
return intent;
}
 
@Bind(R.id.root) View mRoot;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.pager) ViewPager mViewPager;
SearchPagerAdapter mSearchPagerAdapter;
Loading
Loading
@@ -47,18 +48,22 @@ public class SearchActivity extends BaseActivity {
public void run() {
mClearView.setVisibility(View.GONE);
mSearchView.getText().clear();
KeyboardUtil.showKeyboard(SearchActivity.this, mSearchView);
}
});
}
 
private SearchDebouncer mSearchDebouncer;
private final TextView.OnEditorActionListener mOnSearchEditorActionListener = new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (TextUtils.isEmpty(mSearchView.getText())) {
mSearchView.setText("unicorns");
}
mSearchPagerAdapter.searchQuery(mSearchView.getText().toString());
search();
KeyboardUtil.hideKeyboard(SearchActivity.this);
mRoot.removeCallbacks(mSearchDebouncer);
return false;
}
};
Loading
Loading
@@ -76,10 +81,20 @@ public class SearchActivity extends BaseActivity {
mClearView.setVisibility(View.GONE);
}
});
} else {
} else if (count == 1) {
mClearView.setVisibility(View.VISIBLE);
mClearView.animate().alpha(1.0f);
}
if (s != null && s.length() > 3) {
Timber.d("Posting new future search");
mRoot.removeCallbacks(mSearchDebouncer);
mRoot.postDelayed(mSearchDebouncer, 500);
}
//This means they are backspacing
if (before > count) {
Timber.d("Removing future search");
mRoot.removeCallbacks(mSearchDebouncer);
}
}
 
@Override
Loading
Loading
@@ -103,5 +118,18 @@ public class SearchActivity extends BaseActivity {
mTabLayout.setupWithViewPager(mViewPager);
mSearchView.setOnEditorActionListener(mOnSearchEditorActionListener);
mSearchView.addTextChangedListener(mTextWatcher);
mSearchDebouncer = new SearchDebouncer();
}
private void search() {
Timber.d("Searching");
mSearchPagerAdapter.searchQuery(mSearchView.getText().toString());
}
private class SearchDebouncer implements Runnable{
@Override
public void run() {
search();
}
}
}
package com.commit451.gitlab.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.commit451.easel.Easel;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.Member;
import com.commit451.gitlab.model.api.UserBasic;
import com.commit451.gitlab.viewHolder.AssigneeViewHolder;
import java.util.ArrayList;
import java.util.Collection;
/**
* Shows the possible assignees
* Created by Jawn on 12/18/2015.
*/
public class AssigneeAdapter extends RecyclerView.Adapter<AssigneeViewHolder> {
private static final int HEADER_COUNT = 1;
private int mColorControlHighlight;
private ArrayList<Member> mUsers;
private UserBasic mSelectedAssignee;
private View.OnClickListener mOnItemClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
if (position > 0) {
mSelectedAssignee = getUser(position);
} else {
mSelectedAssignee = null;
}
notifyDataSetChanged();
}
};
public AssigneeAdapter(Context context, UserBasic currentAssignee) {
mUsers = new ArrayList<>();
mSelectedAssignee = currentAssignee;
mColorControlHighlight = Easel.getThemeAttrColor(context, R.attr.colorControlHighlight);
}
public void setUsers(Collection<Member> users) {
mUsers.clear();
if (users != null) {
mUsers.addAll(users);
}
notifyDataSetChanged();
}
@Override
public AssigneeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
AssigneeViewHolder holder = AssigneeViewHolder.inflate(parent);
holder.itemView.setOnClickListener(mOnItemClickListener);
return holder;
}
@Override
public void onBindViewHolder(AssigneeViewHolder holder, int position) {
if (position == 0) {
holder.bind(null, mColorControlHighlight, mSelectedAssignee == null);
} else {
UserBasic user = getUser(position);
holder.bind(user, mColorControlHighlight, mSelectedAssignee == null ? false : mSelectedAssignee.equals(user));
}
holder.itemView.setTag(R.id.list_position, position);
}
@Override
public int getItemCount() {
return mUsers.size() + HEADER_COUNT;
}
private Member getUser(int position) {
return mUsers.get(position - HEADER_COUNT);
}
}
Loading
Loading
@@ -13,7 +13,6 @@ import java.util.Collection;
 
/**
* Adapts the feeds
* Created by John on 10/8/15.
*/
public class FeedAdapter extends RecyclerView.Adapter<FeedEntryViewHolder> {
 
Loading
Loading
package com.commit451.gitlab.adapter;
 
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
 
Loading
Loading
@@ -12,6 +13,8 @@ import com.commit451.gitlab.viewHolder.NoteViewHolder;
import java.util.ArrayList;
import java.util.List;
 
import in.uncod.android.bypass.Bypass;
/**
* Nice notes
* Created by Jawn on 8/6/2015.
Loading
Loading
@@ -28,10 +31,12 @@ public class IssueDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
private ArrayList<Note> mNotes;
private Issue mIssue;
private boolean mLoading = false;
private Bypass mBypass;
 
public IssueDetailsAdapter(Issue issue) {
public IssueDetailsAdapter(Context context, Issue issue) {
mIssue = issue;
mNotes = new ArrayList<>();
mBypass = new Bypass(context);
}
 
@Override
Loading
Loading
@@ -53,7 +58,7 @@ public class IssueDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
((IssueHeaderViewHolder) holder).bind(mIssue);
} else if (holder instanceof NoteViewHolder) {
Note note = getNoteAt(position);
((NoteViewHolder) holder).bind(note);
((NoteViewHolder) holder).bind(note, mBypass);
} else if (holder instanceof LoadingFooterViewHolder) {
((LoadingFooterViewHolder) holder).bind(mLoading);
}
Loading
Loading
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