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

Merge branch 'develop'

parents eb09a2b1 1e4317f3
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 843 additions and 226 deletions
package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.api.MergeRequest;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.model.api.RepositoryCommit;
import com.commit451.gitlab.navigation.NavigationManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import timber.log.Timber;
/**
* Intermediate activity when deep linking to another activity and things need to load
*/
public class LoadSomeInfoActivity extends AppCompatActivity {
private static final String EXTRA_LOAD_TYPE = "load_type";
private static final String EXTRA_PROJECT_NAMESPACE = "project_namespace";
private static final String EXTRA_PROJECT_NAME = "project_name";
private static final String EXTRA_COMMIT_SHA = "extra_commit_sha";
private static final String EXTRA_MERGE_REQUEST = "merge_request";
private static final int LOAD_TYPE_DIFF = 0;
private static final int LOAD_TYPE_MERGE_REQUEST = 1;
public static Intent newIntent(Context context, String namespace, String projectName, String commitSha) {
Intent intent = new Intent(context, LoadSomeInfoActivity.class);
intent.putExtra(EXTRA_PROJECT_NAMESPACE, namespace);
intent.putExtra(EXTRA_PROJECT_NAME, projectName);
intent.putExtra(EXTRA_COMMIT_SHA, commitSha);
intent.putExtra(EXTRA_LOAD_TYPE, LOAD_TYPE_DIFF);
return intent;
}
public static Intent newMergeRequestIntent(Context context, String namespace, String projectName, String mergeRequestId) {
Intent intent = new Intent(context, LoadSomeInfoActivity.class);
intent.putExtra(EXTRA_PROJECT_NAMESPACE, namespace);
intent.putExtra(EXTRA_PROJECT_NAME, projectName);
intent.putExtra(EXTRA_MERGE_REQUEST, mergeRequestId);
intent.putExtra(EXTRA_LOAD_TYPE, LOAD_TYPE_MERGE_REQUEST);
return intent;
}
@BindView(R.id.progress)
View mProgress;
private int mLoadType;
private Project mProject;
@OnClick(R.id.root)
void onRootClicked() {
finish();
}
private final EasyCallback<Project> mProjectCallback = new EasyCallback<Project>() {
@Override
public void onResponse(@NonNull Project response) {
mProject = response;
switch (mLoadType) {
case LOAD_TYPE_DIFF:
String sha = getIntent().getStringExtra(EXTRA_COMMIT_SHA);
GitLabClient.instance().getCommit(response.getId(), sha).enqueue(mCommitCallback);
return;
case LOAD_TYPE_MERGE_REQUEST:
String mergeRequestId = getIntent().getStringExtra(EXTRA_MERGE_REQUEST);
GitLabClient.instance().getMergeRequest(response.getId(), Long.valueOf(mergeRequestId)).enqueue(mMergeRequestCallback);
}
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
onError();
}
};
private final EasyCallback<RepositoryCommit> mCommitCallback = new EasyCallback<RepositoryCommit>() {
@Override
public void onResponse(@NonNull RepositoryCommit response) {
NavigationManager.navigateToDiffActivity(LoadSomeInfoActivity.this, mProject, response);
finish();
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
onError();
}
};
private final EasyCallback<MergeRequest> mMergeRequestCallback = new EasyCallback<MergeRequest>() {
@Override
public void onResponse(@NonNull MergeRequest response) {
NavigationManager.navigateToMergeRequest(LoadSomeInfoActivity.this, mProject, response);
finish();
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
onError();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
ButterKnife.bind(this);
mProgress.setVisibility(View.VISIBLE);
mLoadType = getIntent().getIntExtra(EXTRA_LOAD_TYPE, -1);
Timber.d("Loading some info type: %d", mLoadType);
switch (mLoadType) {
case LOAD_TYPE_DIFF:
case LOAD_TYPE_MERGE_REQUEST:
String namespace = getIntent().getStringExtra(EXTRA_PROJECT_NAMESPACE);
String project = getIntent().getStringExtra(EXTRA_PROJECT_NAME);
GitLabClient.instance().getProject(namespace, project).enqueue(mProjectCallback);
break;
}
}
private void onError() {
Toast.makeText(LoadSomeInfoActivity.this, R.string.failed_to_load, Toast.LENGTH_SHORT)
.show();
finish();
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.do_nothing, R.anim.fade_out);
}
}
Loading
Loading
@@ -40,8 +40,8 @@ import com.commit451.gitlab.ssl.CustomHostnameVerifier;
import com.commit451.gitlab.ssl.CustomKeyManager;
import com.commit451.gitlab.ssl.X509CertificateException;
import com.commit451.gitlab.ssl.X509Util;
import com.commit451.gitlab.util.KeyboardUtil;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.teleprinter.Teleprinter;
 
import java.net.ConnectException;
import java.security.cert.CertificateEncodingException;
Loading
Loading
@@ -56,7 +56,7 @@ import java.util.regex.Pattern;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLPeerUnverifiedException;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.Credentials;
Loading
Loading
@@ -73,45 +73,46 @@ public class LoginActivity extends BaseActivity {
private static final int PERMISSION_REQUEST_GET_ACCOUNTS = 1337;
private static Pattern sTokenPattern = Pattern.compile("^[A-Za-z0-9-_]*$");
 
public static Intent newInstance(Context context) {
return newInstance(context, false);
public static Intent newIntent(Context context) {
return newIntent(context, false);
}
 
public static Intent newInstance(Context context, boolean showClose) {
public static Intent newIntent(Context context, boolean showClose) {
Intent intent = new Intent(context, LoginActivity.class);
intent.putExtra(EXTRA_SHOW_CLOSE, showClose);
return intent;
}
 
@Bind(R.id.root)
@BindView(R.id.root)
View mRoot;
@Bind(R.id.close)
@BindView(R.id.close)
View mClose;
@Bind(R.id.url_hint)
@BindView(R.id.url_hint)
TextInputLayout mUrlHint;
@Bind(R.id.url_input)
@BindView(R.id.url_input)
TextView mUrlInput;
@Bind(R.id.user_input_hint)
@BindView(R.id.user_input_hint)
TextInputLayout mUserHint;
@Bind(R.id.user_input)
@BindView(R.id.user_input)
AppCompatAutoCompleteTextView mUserInput;
@Bind(R.id.password_hint)
@BindView(R.id.password_hint)
TextInputLayout mPasswordHint;
@Bind(R.id.password_input)
@BindView(R.id.password_input)
TextView mPasswordInput;
@Bind(R.id.token_hint)
@BindView(R.id.token_hint)
TextInputLayout mTokenHint;
@Bind(R.id.token_input)
@BindView(R.id.token_input)
TextView mTokenInput;
@Bind(R.id.normal_login)
@BindView(R.id.normal_login)
View mNormalLogin;
@Bind(R.id.token_login)
@BindView(R.id.token_login)
View mTokenLogin;
@Bind(R.id.progress)
@BindView(R.id.progress)
View mProgress;
 
private boolean mIsNormalLogin = true;
private Account mAccount;
private Teleprinter mTeleprinter;
 
private final TextView.OnEditorActionListener onEditorActionListener = new TextView.OnEditorActionListener() {
@Override
Loading
Loading
@@ -143,15 +144,15 @@ public class LoginActivity extends BaseActivity {
 
@OnClick(R.id.login_button)
public void onLoginClick() {
KeyboardUtil.hideKeyboard(this);
mTeleprinter.hideKeyboard();
 
if (hasEmptyFields(mUrlHint)) {
return;
}
 
String url = mUrlInput.getText().toString();
Uri uri = null;
try {
String url = mUrlInput.getText().toString();
if (HttpUrl.parse(url) != null) {
uri = Uri.parse(url);
}
Loading
Loading
@@ -165,6 +166,12 @@ public class LoginActivity extends BaseActivity {
} else {
mUrlHint.setError(null);
}
if (url.charAt(url.length()-1) != '/') {
mUrlHint.setError(getString(R.string.please_end_your_url_with_a_slash));
return;
} else {
mUrlHint.setError(null);
}
 
if (mIsNormalLogin) {
if (hasEmptyFields(mUrlHint, mUserHint, mPasswordHint)) {
Loading
Loading
@@ -255,7 +262,7 @@ public class LoginActivity extends BaseActivity {
 
@Override
public void onResponse(Call<UserLogin> call, Response<UserLogin> response) {
if (!response.isSuccessful()) {
if (!response.isSuccessful() || response.body() == null) {
handleConnectionResponse(response);
return;
}
Loading
Loading
@@ -276,7 +283,7 @@ public class LoginActivity extends BaseActivity {
@Override
public void onResponse(Call<UserFull> call, Response<UserFull> response) {
mProgress.setVisibility(View.GONE);
if (!response.isSuccessful()) {
if (!response.isSuccessful() || response.body() == null) {
handleConnectionResponse(response);
return;
}
Loading
Loading
@@ -287,7 +294,7 @@ public class LoginActivity extends BaseActivity {
LabCoatApp.bus().post(new LoginEvent(mAccount));
//This is mostly for if projects already exists, then we will reload the data
LabCoatApp.bus().post(new ReloadDataEvent());
NavigationManager.navigateToProjects(LoginActivity.this);
NavigationManager.navigateToStartingActivity(LoginActivity.this);
finish();
}
 
Loading
Loading
@@ -304,6 +311,7 @@ public class LoginActivity extends BaseActivity {
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
 
mTeleprinter = new Teleprinter(this);
boolean showClose = getIntent().getBooleanExtra(EXTRA_SHOW_CLOSE, false);
 
mClose.setVisibility(showClose ? View.VISIBLE : View.GONE);
Loading
Loading
Loading
Loading
@@ -3,21 +3,29 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
 
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.MergeRequestSectionsPagerAdapter;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.MergeRequestChangedEvent;
import com.commit451.gitlab.model.api.MergeRequest;
import com.commit451.gitlab.model.api.Project;
 
import org.parceler.Parcels;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import timber.log.Timber;
 
/**
* Shows the details of a merge request
Loading
Loading
@@ -27,25 +35,58 @@ 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) {
public static Intent newIntent(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.root)
@BindView(R.id.root)
ViewGroup mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.tabs)
@BindView(R.id.tabs)
TabLayout mTabLayout;
@Bind(R.id.pager)
@BindView(R.id.pager)
ViewPager mViewPager;
@BindView(R.id.progress)
View mProgress;
 
Project mProject;
MergeRequest mMergeRequest;
 
private final EasyCallback<MergeRequest> mMergeRequestCallback = new EasyCallback<MergeRequest>() {
@Override
public void onResponse(@NonNull MergeRequest response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.merge_request_accepted, Snackbar.LENGTH_LONG)
.show();
LabCoatApp.bus().post(new MergeRequestChangedEvent(response));
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_merge, Snackbar.LENGTH_LONG)
.show();
}
};
private final Toolbar.OnMenuItemClickListener mOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_merge:
mProgress.setVisibility(View.VISIBLE);
GitLabClient.instance().acceptMergeRequest(mProject.getId(), mMergeRequest.getId()).enqueue(mMergeRequestCallback);
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Loading
Loading
@@ -64,6 +105,8 @@ public class MergeRequestActivity extends BaseActivity {
}
});
mToolbar.setSubtitle(mProject.getNameWithNamespace());
mToolbar.inflateMenu(R.menu.menu_merge_request);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
setupTabs();
}
 
Loading
Loading
Loading
Loading
@@ -25,7 +25,7 @@ import com.commit451.gitlab.event.MilestoneChangedEvent;
import com.commit451.gitlab.model.api.Issue;
import com.commit451.gitlab.model.api.Milestone;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.gitlab.util.PaginationUtil;
import com.squareup.otto.Subscribe;
 
Loading
Loading
@@ -33,7 +33,7 @@ import org.parceler.Parcels;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
Loading
Loading
@@ -44,26 +44,26 @@ public class MilestoneActivity extends BaseActivity {
private static final String EXTRA_PROJECT = "extra_project";
private static final String EXTRA_MILESTONE = "extra_milestone";
 
public static Intent newInstance(Context context, Project project, Milestone milestone) {
public static Intent newIntent(Context context, Project project, Milestone milestone) {
Intent intent = new Intent(context, MilestoneActivity.class);
intent.putExtra(EXTRA_PROJECT, Parcels.wrap(project));
intent.putExtra(EXTRA_MILESTONE, Parcels.wrap(milestone));
return intent;
}
 
@Bind(R.id.root)
@BindView(R.id.root)
View mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.swipe_layout)
@BindView(R.id.swipe_layout)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list)
@BindView(R.id.list)
RecyclerView mIssuesRecyclerView;
MilestoneIssuesAdapter mMilestoneIssuesAdapter;
LinearLayoutManager mIssuesLayoutManager;
@Bind(R.id.message_text)
@BindView(R.id.message_text)
TextView mMessageText;
@Bind(R.id.progress)
@BindView(R.id.progress)
View mProgress;
 
MenuItem mOpenCloseMenuItem;
Loading
Loading
Loading
Loading
@@ -10,12 +10,10 @@ import android.view.View;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
 
import com.afollestad.appthemeengine.Config;
import com.commit451.easel.Easel;
import com.commit451.gitlab.R;
import com.commit451.gitlab.transition.MorphDialogToFab;
import com.commit451.gitlab.transition.MorphFabToDialog;
import com.commit451.gitlab.util.AppThemeUtil;
 
/**
* Activity that morphs from a FAB. Make sure the view you want to morph has the view id R.id.mRoot and
Loading
Loading
@@ -29,7 +27,7 @@ public class MorphActivity extends BaseActivity {
throw new IllegalStateException("Cannot pass an empty view");
}
if (Build.VERSION.SDK_INT >= 21) {
int fabColor = Config.accentColor(this, AppThemeUtil.resolveThemeKey(this));
int fabColor = Easel.getThemeAttrColor(this, R.attr.colorAccent);
int dialogColor = Easel.getThemeAttrColor(this, android.R.attr.windowBackground);
setupSharedElementTransitionsFab(this, root,
fabColor,
Loading
Loading
package com.commit451.gitlab.activity;
 
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
Loading
Loading
@@ -13,13 +15,14 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
 
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.SectionsPagerAdapter;
import com.commit451.gitlab.adapter.ThemedArrayAdapter;
import com.commit451.gitlab.animation.HideRunnable;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
Loading
Loading
@@ -33,7 +36,7 @@ import org.parceler.Parcels;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import timber.log.Timber;
Loading
Loading
@@ -43,29 +46,29 @@ 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) {
public static Intent newIntent(Context context, Project project) {
Intent intent = new Intent(context, ProjectActivity.class);
intent.putExtra(EXTRA_PROJECT, Parcels.wrap(project));
return intent;
}
 
public static Intent newInstance(Context context, long projectId) {
public static Intent newIntent(Context context, String projectId) {
Intent intent = new Intent(context, ProjectActivity.class);
intent.putExtra(EXTRA_PROJECT_ID, projectId);
return intent;
}
 
@Bind(R.id.root)
@BindView(R.id.root)
ViewGroup mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.tabs)
@BindView(R.id.tabs)
TabLayout mTabLayout;
@Bind(R.id.branch_spinner)
@BindView(R.id.branch_spinner)
Spinner mBranchSpinner;
@Bind(R.id.progress)
@BindView(R.id.progress)
View mProgress;
@Bind(R.id.pager)
@BindView(R.id.pager)
ViewPager mViewPager;
 
private final AdapterView.OnItemSelectedListener mSpinnerItemSelectedListener = new AdapterView.OnItemSelectedListener() {
Loading
Loading
@@ -121,7 +124,7 @@ public class ProjectActivity extends BaseActivity {
mBranchSpinner.setAlpha(0.0f);
mBranchSpinner.animate().alpha(1.0f);
// Set up the dropdown list navigation in the action bar.
mBranchSpinner.setAdapter(new ThemedArrayAdapter<>(ProjectActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, response));
mBranchSpinner.setAdapter(new ArrayAdapter<>(ProjectActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, response));
}
for (int i = 0; i < response.size(); i++) {
if (response.get(i).getName().equals(mProject.getDefaultBranch())) {
Loading
Loading
@@ -152,7 +155,25 @@ public class ProjectActivity extends BaseActivity {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_share:
IntentUtil.share(mRoot, mProject.getWebUrl());
if (mProject != null) {
IntentUtil.share(mRoot, mProject.getWebUrl());
}
return true;
case R.id.action_copy_git_https:
if (mProject == null || mProject.getHttpUrlToRepo() == null) {
Toast.makeText(ProjectActivity.this, R.string.failed_to_copy_to_clipboard, Toast.LENGTH_SHORT)
.show();
} else {
copyToClipboard(mProject.getHttpUrlToRepo());
}
return true;
case R.id.action_copy_git_ssh:
if (mProject == null || mProject.getHttpUrlToRepo() == null) {
Toast.makeText(ProjectActivity.this, R.string.failed_to_copy_to_clipboard, Toast.LENGTH_SHORT)
.show();
} else {
copyToClipboard(mProject.getSshUrlToRepo());
}
return true;
}
return false;
Loading
Loading
@@ -173,11 +194,11 @@ public class ProjectActivity extends BaseActivity {
finish();
}
});
mToolbar.inflateMenu(R.menu.menu_repository);
mToolbar.inflateMenu(R.menu.menu_project);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
if (mProject == null) {
long projectId = getIntent().getLongExtra(EXTRA_PROJECT_ID, -1);
String projectId = getIntent().getStringExtra(EXTRA_PROJECT_ID);
loadProject(projectId);
} else {
setupTabs();
Loading
Loading
@@ -185,7 +206,7 @@ public class ProjectActivity extends BaseActivity {
}
}
 
private void loadProject(long projectId) {
private void loadProject(String projectId) {
mProgress.setAlpha(0.0f);
mProgress.setVisibility(View.VISIBLE);
mProgress.animate().alpha(1.0f);
Loading
Loading
@@ -229,4 +250,14 @@ public class ProjectActivity extends BaseActivity {
mViewPager.setAdapter(sectionsPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
private void copyToClipboard(String url) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
// Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText(mProject.getName(), url);
clipboard.setPrimaryClip(clip);
Snackbar.make(mRoot, R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT)
.show();
}
}
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.view.GravityCompat;
Loading
Loading
@@ -13,39 +12,31 @@ import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
 
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectsPagerAdapter;
import com.commit451.gitlab.event.CloseDrawerEvent;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.navigation.NavigationManager;
import com.squareup.otto.Subscribe;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
 
/**
* Shows the projects
* Created by Jawn on 9/21/2015.
*/
public class ProjectsActivity extends BaseActivity implements ATEActivityThemeCustomizer {
public class ProjectsActivity extends BaseActivity {
 
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_Projects : R.style.ActivityLight_Projects;
}
public static Intent newInstance(Context context) {
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, ProjectsActivity.class);
return intent;
}
 
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.pager) ViewPager mViewPager;
@Bind(R.id.navigation_view) NavigationView mNavigationView;
@Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.tabs) TabLayout mTabLayout;
@BindView(R.id.pager) ViewPager mViewPager;
@BindView(R.id.navigation_view) NavigationView mNavigationView;
@BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout;
 
EventReceiver mEventReceiver;
 
Loading
Loading
package com.commit451.gitlab.activity;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;
import com.commit451.gitlab.R;
import com.commit451.gitlab.navigation.DeepLinker;
import com.commit451.gitlab.util.IntentUtil;
import com.commit451.gitlab.navigation.NavigationManager;
import timber.log.Timber;
/**
* The easy way to do deep links. Just route everything here, and it does all the work.
*/
public class RoutingActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (intent == null || intent.getData() == null) {
Timber.e("No url was passed. How did that happen?");
finish();
return;
}
//If it has an original uri, this means that it is an internal deep link and we
//can still fall back to what the original uri was and just show it
Uri originalUri = intent.getParcelableExtra(DeepLinker.EXTRA_ORIGINAL_URI);
Uri link = intent.getData();
Timber.d("Received deep link %s", link);
Timber.d("Original link was %s", originalUri);
boolean handled = false;
if (link.getPath().contains("issues")) {
Timber.d("Parsing as issue uri");
if (link.getLastPathSegment().equals("issues")) {
//this means it was just a link to something like
//gitlab.com/Commit451/LabCoat/issues
launchProject(link);
handled = true;
} else {
int indexOfIssuesPathSegment = -1;
for (int i=0; i<link.getPathSegments().size(); i++) {
if (link.getPathSegments().get(i).equals("issues")) {
indexOfIssuesPathSegment = i;
break;
}
}
//this is good, it means it is a link to an actual issue
String projectNamespace = link.getPathSegments().get(0);
String projectName = link.getPathSegments().get(1);
String lastSegment = link.getPathSegments().get(3);
//We have to do this cause there can be args on the url, such as
//https://gitlab.com/Commit451/LabCoat/issues/158#note_4560580
String[] stuff = lastSegment.split("#");
String issueIid = stuff[0];
Timber.d("Navigating to project %s with issue number %s", projectName, issueIid);
NavigationManager.navigateToIssue(this, projectNamespace, projectName, issueIid);
handled = true;
}
} else if (link.getPath().contains("commit")) {
if (link.getPathSegments().size() == 4) {
String projectNamespace = link.getPathSegments().get(0);
String projectName = link.getPathSegments().get(1);
String commitSha = link.getPathSegments().get(3);
startActivity(LoadSomeInfoActivity.newIntent(this, projectNamespace, projectName, commitSha));
overridePendingTransition(R.anim.fade_in, R.anim.do_nothing);
handled = true;
}
} else if (link.getPath().contains("commits")) {
launchProject(link);
handled = true;
} else if (link.getPath().contains("compare")) {
//comparing two commit shas
String[] shas = link.getLastPathSegment().split("...");
//TODO do the rest
} else if (link.getPath().contains("merge_requests")) {
for (int i=0; i<link.getPathSegments().size(); i++) {
if (link.getPathSegments().get(i).equals("merge_requests")) {
if (i < link.getPathSegments().size() - 1) {
String projectNamespace = link.getPathSegments().get(i-2);
String projectName = link.getPathSegments().get(i-1);
String mergeRequestId = link.getPathSegments().get(i+1);
startActivity(LoadSomeInfoActivity.newMergeRequestIntent(this, projectNamespace, projectName, mergeRequestId));
overridePendingTransition(R.anim.fade_in, R.anim.do_nothing);
handled = true;
break;
} else {
launchProject(link);
handled = true;
break;
}
}
}
}
if (!handled) {
if (originalUri != null) {
launchOriginalUri(originalUri);
} else {
showError();
}
}
finish();
}
private void launchProject(Uri uri) {
String projectId = uri.getPathSegments().get(2);
NavigationManager.navigateToProject(this, projectId);
}
private void launchOriginalUri(Uri uri) {
IntentUtil.openPage(this, uri.toString());
}
private void showError() {
Toast.makeText(RoutingActivity.this, R.string.deeplink_navigate_error, Toast.LENGTH_SHORT)
.show();
}
}
Loading
Loading
@@ -16,9 +16,10 @@ import android.widget.TextView;
 
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.SearchPagerAdapter;
import com.commit451.gitlab.util.KeyboardUtil;
import com.commit451.jounce.Debouncer;
import com.commit451.teleprinter.Teleprinter;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import timber.log.Timber;
Loading
Loading
@@ -28,18 +29,18 @@ import timber.log.Timber;
*/
public class SearchActivity extends BaseActivity {
 
public static Intent newInstance(Context context) {
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, SearchActivity.class);
return intent;
}
 
@Bind(R.id.root) View mRoot;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.pager) ViewPager mViewPager;
@BindView(R.id.root) View mRoot;
@BindView(R.id.tabs) TabLayout mTabLayout;
@BindView(R.id.pager) ViewPager mViewPager;
SearchPagerAdapter mSearchPagerAdapter;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.search) EditText mSearchView;
@Bind(R.id.clear) View mClearView;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.search) EditText mSearchView;
@BindView(R.id.clear) View mClearView;
 
@OnClick(R.id.clear)
void onClearClick() {
Loading
Loading
@@ -47,13 +48,22 @@ public class SearchActivity extends BaseActivity {
@Override
public void run() {
mClearView.setVisibility(View.GONE);
mSearchView.getText().clear();
KeyboardUtil.showKeyboard(SearchActivity.this, mSearchView);
}
});
mSearchView.getText().clear();
mTeleprinter.showKeyboard(mSearchView);
mSearchDebouncer.cancel();
}
 
private SearchDebouncer mSearchDebouncer;
private Teleprinter mTeleprinter;
private Debouncer<CharSequence> mSearchDebouncer = new Debouncer<CharSequence>() {
@Override
public void onValueSet(CharSequence value) {
search();
}
};
 
private final TextView.OnEditorActionListener mOnSearchEditorActionListener = new TextView.OnEditorActionListener() {
@Override
Loading
Loading
@@ -62,8 +72,7 @@ public class SearchActivity extends BaseActivity {
mSearchView.setText("unicorns");
}
search();
KeyboardUtil.hideKeyboard(SearchActivity.this);
mRoot.removeCallbacks(mSearchDebouncer);
mTeleprinter.hideKeyboard();
return false;
}
};
Loading
Loading
@@ -87,13 +96,12 @@ public class SearchActivity extends BaseActivity {
}
if (s != null && s.length() > 3) {
Timber.d("Posting new future search");
mRoot.removeCallbacks(mSearchDebouncer);
mRoot.postDelayed(mSearchDebouncer, 500);
mSearchDebouncer.setValue(s);
}
//This means they are backspacing
if (before > count) {
Timber.d("Removing future search");
mRoot.removeCallbacks(mSearchDebouncer);
mSearchDebouncer.cancel();
}
}
 
Loading
Loading
@@ -106,6 +114,7 @@ public class SearchActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
ButterKnife.bind(this);
mTeleprinter = new Teleprinter(this);
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
Loading
Loading
@@ -118,18 +127,10 @@ 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();
}
}
}
Loading
Loading
@@ -2,131 +2,95 @@ package com.commit451.gitlab.activity;
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
 
import com.afollestad.appthemeengine.ATE;
import com.afollestad.appthemeengine.Config;
import com.afollestad.appthemeengine.prefs.ATEColorPreference;
import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.afollestad.materialdialogs.MaterialDialog;
import com.commit451.gitlab.R;
import com.commit451.gitlab.data.Prefs;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
 
/**
* Settings screens are fun!
* Settings
*/
public class SettingsActivity extends BaseActivity
implements ColorChooserDialog.ColorCallback {
public class SettingsActivity extends BaseActivity {
 
public static Intent newInstance(Context context) {
private static final int REQUEST_COUNTRY = 1;
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, SettingsActivity.class);
return intent;
}
 
@Bind(R.id.toolbar) Toolbar toolbar;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.text_launch_activity)
TextView mTextLaunchActivity;
@OnClick(R.id.root_launch_activity)
void onLaunchActivityClicked() {
new MaterialDialog.Builder(this)
.title(R.string.setting_starting_view)
.items(R.array.setting_starting_view_choices)
.itemsCallbackSingleChoice(getSelectedIndex(), new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
Prefs.setStartingView(SettingsActivity.this, which);
bindPrefs();
/**
* If you use alwaysCallSingleChoiceCallback(), which is discussed below,
* returning false here won't allow the newly selected radio button to actually be selected.
**/
return true;
}
})
.show();
}
 
@Override
protected void onCreate(Bundle savedInstanceState) {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
ButterKnife.bind(this);
toolbar.setNavigationIcon(R.drawable.ic_back_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
mToolbar.setTitle(R.string.settings);
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
toolbar.setTitle(R.string.settings);
bindPrefs();
}
 
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().replace(R.id.settings_container, new SettingsFragment()).commit();
} else {
SettingsFragment frag = (SettingsFragment) getFragmentManager().findFragmentById(R.id.settings_container);
if (frag != null) {
frag.invalidateSettings();
}
}
private void bindPrefs() {
setStartingViewSelection();
}
 
@Override
public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {
final Config config = ATE.config(this, getATEKey());
switch (dialog.getTitle()) {
case R.string.primary_color:
config.primaryColor(selectedColor);
private void setStartingViewSelection() {
int startinView = Prefs.getStartingView(this);
switch (startinView) {
case Prefs.STARTING_VIEW_PROJECTS:
mTextLaunchActivity.setText(R.string.setting_starting_view_projects);
break;
case Prefs.STARTING_VIEW_GROUPS:
mTextLaunchActivity.setText(R.string.setting_starting_view_groups);
break;
case R.string.accent_color:
config.accentColor(selectedColor);
case Prefs.STARTING_VIEW_ACTIVITY:
mTextLaunchActivity.setText(R.string.setting_starting_view_activity);
break;
}
config.commit();
recreate(); // recreation needed to reach the checkboxes in the preferences layout
}
 
public static class SettingsFragment extends PreferenceFragment {
String mAteKey;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
invalidateSettings();
}
public void invalidateSettings() {
mAteKey = ((SettingsActivity) getActivity()).getATEKey();
ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color");
primaryColorPref.setColor(Config.primaryColor(getActivity(), mAteKey), Color.BLACK);
primaryColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new ColorChooserDialog.Builder((SettingsActivity) getActivity(), R.string.primary_color)
.preselect(Config.primaryColor(getActivity(), mAteKey))
.show();
return true;
}
});
ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color");
accentColorPref.setColor(Config.accentColor(getActivity(), mAteKey), Color.BLACK);
accentColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new ColorChooserDialog.Builder((SettingsActivity) getActivity(), R.string.accent_color)
.preselect(Config.accentColor(getActivity(), mAteKey))
.show();
return true;
}
});
findPreference("dark_theme").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Marks both theme configs as changed so MainActivity restarts itself on return
Config.markChanged(getActivity(), "light_theme");
Config.markChanged(getActivity(), "dark_theme");
// The dark_theme preference value gets saved by Android in the default PreferenceManager.
// It's used in getATEKey() of both the Activities.
getActivity().recreate();
return true;
}
});
}
private int getSelectedIndex() {
return Prefs.getStartingView(this);
}
}
Loading
Loading
@@ -5,11 +5,9 @@ import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.graphics.Palette;
Loading
Loading
@@ -17,46 +15,35 @@ import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ImageView;
 
import com.afollestad.appthemeengine.Config;
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.afollestad.appthemeengine.util.ATEUtil;
import com.commit451.easel.Easel;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.fragment.FeedFragment;
import com.commit451.gitlab.model.api.UserBasic;
import com.commit451.gitlab.util.AppThemeUtil;
import com.commit451.gitlab.transformation.PaletteTransformation;
import com.commit451.gitlab.util.ImageUtil;
 
import org.parceler.Parcels;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
 
/**
* User activity, which shows the user!
* Created by Jawn on 9/21/2015.
*/
public class UserActivity extends BaseActivity implements ATEActivityThemeCustomizer {
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_User : R.style.ActivityLight_User;
}
public class UserActivity extends BaseActivity {
 
private static final String KEY_USER = "user";
 
public static Intent newInstance(Context context, UserBasic user) {
public static Intent newIntent(Context context, UserBasic user) {
Intent intent = new Intent(context, UserActivity.class);
intent.putExtra(KEY_USER, Parcels.wrap(user));
return intent;
}
 
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbarLayout;
@Bind(R.id.backdrop) ImageView mBackdrop;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbarLayout;
@BindView(R.id.backdrop) ImageView mBackdrop;
 
UserBasic mUser;
 
Loading
Loading
@@ -68,10 +55,6 @@ public class UserActivity extends BaseActivity implements ATEActivityThemeCustom
mUser = Parcels.unwrap(getIntent().getParcelableExtra(KEY_USER));
 
// Default content and scrim colors
mCollapsingToolbarLayout.setContentScrimColor(
Config.primaryColor(this, AppThemeUtil.resolveThemeKey(this)));
mCollapsingToolbarLayout.setStatusBarScrimColor(
Config.primaryColorDark(this, AppThemeUtil.resolveThemeKey(this)));
mCollapsingToolbarLayout.setCollapsedTitleTextColor(Color.WHITE);
mCollapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);
 
Loading
Loading
@@ -111,8 +94,8 @@ public class UserActivity extends BaseActivity implements ATEActivityThemeCustom
 
private void bindPalette(Palette palette) {
int animationTime = 1000;
int vibrantColor = palette.getVibrantColor(AppThemeUtil.resolvePrimaryColor(this));
int darkerColor = ATEUtil.darkenColor(vibrantColor);
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)
Loading
Loading
@@ -122,12 +105,12 @@ public class UserActivity extends BaseActivity implements ATEActivityThemeCustom
}
 
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "contentScrimColor", new ArgbEvaluator(),
((ColorDrawable)mCollapsingToolbarLayout.getContentScrim()).getColor(), vibrantColor)
Easel.getThemeAttrColor(this, R.attr.colorPrimary), vibrantColor)
.setDuration(animationTime)
.start();
 
ObjectAnimator.ofObject(mCollapsingToolbarLayout, "statusBarScrimColor", new ArgbEvaluator(),
((ColorDrawable) mCollapsingToolbarLayout.getStatusBarScrim()).getColor(), darkerColor)
Easel.getThemeAttrColor(this, R.attr.colorPrimaryDark), darkerColor)
.setDuration(animationTime)
.start();
 
Loading
Loading
Loading
Loading
@@ -12,7 +12,6 @@ import com.commit451.gitlab.viewHolder.AccessViewHolder;
 
/**
* Adapter to show the access levels
* Created by Jawn on 9/16/2015.
*/
public class AccessAdapter extends RecyclerView.Adapter<AccessViewHolder> {
 
Loading
Loading
Loading
Loading
@@ -19,7 +19,6 @@ import java.util.Collection;
 
/**
* Adapter to show all the accounts
* Created by Jawn on 12/6/2015.
*/
public class AccountsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_ACCOUNT = 0;
Loading
Loading
package com.commit451.gitlab.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import com.commit451.gitlab.model.api.Label;
import com.commit451.gitlab.viewHolder.AddLabelViewHolder;
import java.util.ArrayList;
import java.util.Collection;
/**
* So many labels
*/
public class AddIssueLabelAdapter extends RecyclerView.Adapter<AddLabelViewHolder> {
private ArrayList<Label> mValues;
public AddIssueLabelAdapter() {
mValues = new ArrayList<>();
}
public void setLabels(Collection<Label> labels) {
mValues.clear();
addLabels(labels);
}
public void addLabels(Collection<Label> labels) {
if (labels != null) {
mValues.addAll(labels);
}
notifyDataSetChanged();
}
@Override
public AddLabelViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return AddLabelViewHolder.inflate(parent);
}
@Override
public void onBindViewHolder(final AddLabelViewHolder holder, int position) {
holder.bind(getEntry(position));
}
@Override
public int getItemCount() {
return mValues.size();
}
private Label getEntry(int position) {
return mValues.get(position);
}
}
Loading
Loading
@@ -13,7 +13,6 @@ import java.util.List;
 
/**
* Shows the current file path
* Created by Jawnnypoo on 11/22/2015.
*/
public class BreadcrumbAdapter extends RecyclerView.Adapter<BreadcrumbViewHolder> {
private List<Breadcrumb> mValues;
Loading
Loading
package com.commit451.gitlab.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupMenu;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.Artifact;
import com.commit451.gitlab.viewHolder.BuildArtifactViewHolder;
import java.util.ArrayList;
import java.util.Collection;
/**
* Show the build artifacts
*/
public class BuildArtifactsAdapter extends RecyclerView.Adapter<BuildArtifactViewHolder> {
public interface Listener {
void onFolderClicked(Artifact treeItem);
void onFileClicked(Artifact treeItem);
void onCopyClicked(Artifact treeItem);
void onShareClicked(Artifact treeItem);
void onOpenInBrowserClicked(Artifact treeItem);
}
private Listener mListener;
private ArrayList<Artifact> mValues;
private final View.OnClickListener onProjectClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
Artifact treeItem = getValueAt(position);
}
};
public BuildArtifactsAdapter(Listener listener) {
mListener = listener;
mValues = new ArrayList<>();
}
@Override
public BuildArtifactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
BuildArtifactViewHolder holder = BuildArtifactViewHolder.inflate(parent);
holder.itemView.setOnClickListener(onProjectClickListener);
return holder;
}
@Override
public void onBindViewHolder(final BuildArtifactViewHolder holder, int position) {
final Artifact treeItem = getValueAt(position);
holder.bind(treeItem);
holder.itemView.setTag(R.id.list_position, position);
holder.popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_copy:
mListener.onCopyClicked(treeItem);
return true;
case R.id.action_share:
mListener.onShareClicked(treeItem);
return true;
case R.id.action_open:
mListener.onOpenInBrowserClicked(treeItem);
return true;
}
return false;
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
public void setData(Collection<Artifact> values) {
mValues.clear();
if (values != null) {
mValues.addAll(values);
}
notifyDataSetChanged();
}
public void clear() {
mValues.clear();
notifyDataSetChanged();
}
public Artifact getValueAt(int position) {
return mValues.get(position);
}
}
package com.commit451.gitlab.adapter;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.commit451.gitlab.R;
import com.commit451.gitlab.fragment.BuildArtifactsFragment;
import com.commit451.gitlab.fragment.BuildDescriptionFragment;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.model.api.Project;
/**
* Build sections
*/
public class BuildSectionsPagerAdapter extends FragmentPagerAdapter {
private static final int SECTION_COUNT = 2;
private Project mProject;
private Build mBuild;
private String[] mTitles;
public BuildSectionsPagerAdapter(Context context, FragmentManager fm, Project project, Build build) {
super(fm);
mProject = project;
mBuild = build;
mTitles = context.getResources().getStringArray(R.array.build_tabs);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return BuildDescriptionFragment.newInstance(mProject, mBuild);
case 1:
return BuildArtifactsFragment.newInstance(mProject, mBuild);
}
throw new IllegalStateException("Position exceeded on view pager");
}
@Override
public int getCount() {
return SECTION_COUNT;
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
}
package com.commit451.gitlab.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.viewHolder.BuildViewHolder;
import com.commit451.gitlab.viewHolder.LoadingFooterViewHolder;
import java.util.ArrayList;
import java.util.Collection;
/**
* Builds adapter
*/
public class BuildsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int FOOTER_COUNT = 1;
private static final int TYPE_ITEM = 0;
private static final int TYPE_FOOTER = 1;
public interface Listener {
void onBuildClicked(Build issue);
}
private Listener mListener;
private ArrayList<Build> mValues;
private boolean mLoading = false;
public BuildsAdapter(Listener listener) {
mListener = listener;
mValues = new ArrayList<>();
}
private final View.OnClickListener onProjectClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onBuildClicked(getValueAt(position));
}
};
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_ITEM:
BuildViewHolder holder = BuildViewHolder.inflate(parent);
holder.itemView.setOnClickListener(onProjectClickListener);
return holder;
case TYPE_FOOTER:
return LoadingFooterViewHolder.inflate(parent);
}
throw new IllegalStateException("No holder for view type " + viewType);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof BuildViewHolder) {
Build build = getValueAt(position);
((BuildViewHolder) holder).bind(build);
holder.itemView.setTag(R.id.list_position, position);
} else if (holder instanceof LoadingFooterViewHolder) {
((LoadingFooterViewHolder) holder).bind(mLoading);
} else {
throw new IllegalStateException("What is this holder?");
}
}
@Override
public int getItemCount() {
return mValues.size() + FOOTER_COUNT;
}
@Override
public int getItemViewType(int position) {
if (position == mValues.size()) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
public void setValues(Collection<Build> values) {
mValues.clear();
addValues(values);
}
public void addValues(Collection<Build> values) {
if (values != null) {
mValues.addAll(values);
}
notifyDataSetChanged();
}
public void updateBuild(Build build) {
int indexToDelete = -1;
for (int i=0; i<mValues.size(); i++) {
if (mValues.get(i).getId() == build.getId()) {
indexToDelete = i;
break;
}
}
if (indexToDelete != -1) {
mValues.remove(indexToDelete);
mValues.add(indexToDelete, build);
}
notifyItemChanged(indexToDelete);
}
public Build getValueAt(int position) {
return mValues.get(position);
}
public void setLoading(boolean loading) {
mLoading = loading;
notifyItemChanged(mValues.size());
}
}
Loading
Loading
@@ -14,7 +14,6 @@ import java.util.Collection;
 
/**
* Shows a list of commits to a project, seen in a project overview
* Created by Jawn on 7/28/2015.
*/
public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 
Loading
Loading
Loading
Loading
@@ -44,8 +44,6 @@ public class DiffAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
mValues.clear();
if (diffs != null) {
mValues.addAll(diffs);
notifyItemRangeInserted(HEADER_COUNT, diffs.size());
return;
}
notifyDataSetChanged();
}
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