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

Merge branch 'master' into fdroid

# Conflicts:
#	.magnum.yml
#	.travis.yml
#	README.md
#	app/build.gradle
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/com/commit451/gitlab/LabCoatApp.java
#	build.gradle
parents 1b90c181 16caa78a
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 846 additions and 229 deletions
Loading
Loading
@@ -6,9 +6,8 @@ import android.os.Bundle;
import com.commit451.gitlab.BuildConfig;
import com.commit451.gitlab.data.Prefs;
import com.commit451.gitlab.model.Account;
import com.commit451.gitlab.util.AppThemeUtil;
import com.commit451.gitlab.ssl.CustomKeyManager;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.navigation.NavigationManager;
 
import java.util.List;
 
Loading
Loading
@@ -18,11 +17,10 @@ import timber.log.Timber;
* This activity acts as switching platform for the application directing the user to the appropriate
* activity based on their logged in state
*/
public class GitlabActivity extends Activity {
public class LaunchActivity extends Activity {
 
@Override
protected void onCreate(Bundle savedInstanceState) {
AppThemeUtil.setupDefaultConfigs(this);
super.onCreate(savedInstanceState);
 
int savedVersion = Prefs.getSavedVersion(this);
Loading
Loading
@@ -48,7 +46,7 @@ public class GitlabActivity extends Activity {
runOnUiThread(new Runnable() {
@Override
public void run() {
NavigationManager.navigateToProjects(GitlabActivity.this);
NavigationManager.navigateToStartingActivity(LaunchActivity.this);
finish();
}
});
Loading
Loading
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
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