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 699 additions and 286 deletions
Loading
Loading
@@ -8,7 +8,7 @@ before_script:
- tar xzf android-sdk_r24.4.1-linux.tgz
- wget -q https://raw.githubusercontent.com/journeyapps/android-sdk-installer/master/accept-licenses
- chmod +x accept-licenses
- ./accept-licenses "android-sdk-linux/tools/android -s update sdk --no-ui --all --filter tools,platform-tools,build-tools-23.0.2,android-23,extra-android-m2repository" "android-sdk-license-5be876d5|android-sdk-license-ed0d0a5b"
- ./accept-licenses "android-sdk-linux/tools/android -s update sdk --no-ui --all --filter tools,platform-tools,build-tools-23.0.3,android-23,extra-android-m2repository" "android-sdk-license-5be876d5|android-sdk-license-c81a61d9"
- export ANDROID_HOME=$PWD/android-sdk-linux
- chmod +x gradlew
 
Loading
Loading
before_script:
- unset DISPLAY
- export TERM=dumb
- export _JAVA_OPTIONS="-Djava.awt.headless=true"
- sudo apt-get -q -y update
- sudo apt-get -q -y install wget tar openjdk-7-jdk lib32stdc++6 lib32z1
- wget -q http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
- tar xzf android-sdk_r24.4.1-linux.tgz
- wget -q https://raw.githubusercontent.com/journeyapps/android-sdk-installer/master/accept-licenses
- chmod +x accept-licenses
- ./accept-licenses "android-sdk-linux/tools/android -s update sdk --no-ui --all --filter tools,platform-tools,build-tools-23.0.2,android-23,extra-android-m2repository" "android-sdk-license-5be876d5|android-sdk-license-ed0d0a5b"
- export ANDROID_HOME=$PWD/android-sdk-linux
- chmod +x gradlew
script:
- ./gradlew build --stacktrace
language: android
android:
components:
- tools
- platform-tools
- build-tools-23.0.2
- android-23
- extra-android-m2repository
before_script:
- chmod +x gradlew
script: "./gradlew build --stacktrace"
Loading
Loading
@@ -3,12 +3,10 @@
 
[![build status](https://gitlab.com/ci/projects/7701/status.png?ref=master)](https://gitlab.com/ci/projects/7701?ref=master)
 
This is the source code for the unofficial GitLab Android app.
![Image](https://gitlab.com/Commit451/LabCoat/raw/master/art/screenshot-1.png)
 
Please see the [issues](https://gitlab.com/Commit451/LabCoat/issues) section to
report any bugs or feature requests and to see the list of known issues.
## Issues
Please see the [issues](https://gitlab.com/Commit451/LabCoat/issues) section to report any bugs or feature requests and to see the list of known issues.
 
 
## Libraries
Loading
Loading
@@ -23,19 +21,31 @@ The following 3rd party libraries and resources are the reason this app works. R
- Retrofit (http://square.github.io/retrofit/)
- OkHttp (http://square.github.io/okhttp/)
- Otto (http://square.github.io/otto/)
- RxJava (https://github.com/ReactiveX/RxJava)
- RxAndroid (https://github.com/ReactiveX/RxAndroid)
- Butter Knife (http://jakewharton.github.io/butterknife/)
- Timber (https://github.com/JakeWharton/timber)
- GSON (https://github.com/google/gson)
- Gson (https://github.com/google/gson)
- Joda Time Android (https://github.com/dlew/joda-time-android)
- Parceler (https://github.com/johncarl81/parceler)
- Bypasses (https://github.com/Commit451/bypasses)
- Easel (https://github.com/Commit451/Easel)
- ForegroundViews (https://github.com/Commit451/ForegroundViews)
- ElasticDragDismissLayout (https://github.com/Commit451/ElasticDragDismissLayout)
- AdapterLayout (https://github.com/Commit451/AdapterLayout)
- Gimbal (https://github.com/Commit451/Gimbal)
- Teleprinter (https://github.com/Commit451/Teleprinter)
- BypassPicassoImageGetter (https://github.com/Commit451/BypassPicassoImageGetter)
- Jounce (https://github.com/Commit451/Jounce)
- Material-ish Progress (https://github.com/pnikosis/materialish-progress)
- PhysicsLayout (https://github.com/Jawnnypoo/PhysicsLayout)
- Material Letter Icon (https://github.com/IvBaranov/MaterialLetterIcon)
- RobotoTextView (https://github.com/johnkil/Android-RobotoTextView)
- GitDiffTextView (https://github.com/alorma/GitDiffTextView)
- MaterialDateTimePicker (https://github.com/wdullaer/MaterialDateTimePicker)
- FlowLayout (https://github.com/blazsolar/FlowLayout)
- SimpleChromeCustomTabs (https://github.com/novoda/simple-chrome-custom-tabs)
- Material Dialogs (https://github.com/afollestad/material-dialogs)
- highlight.js (https://highlightjs.org/)
 
## Contributing
Loading
Loading
Loading
Loading
@@ -3,15 +3,15 @@ apply plugin: 'com.neenbedankt.android-apt'
 
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
buildToolsVersion "23.0.3"
 
defaultConfig {
applicationId "com.commit451.gitlab"
minSdkVersion 16
targetSdkVersion 23
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
versionCode 225
versionName "2.2.5"
versionCode 226
versionName "2.2.6"
}
buildTypes {
release {
Loading
Loading
@@ -35,29 +35,31 @@ dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
 
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:recyclerview-v7:23.2.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.android.support:palette-v7:23.2.1'
compile 'com.android.support:customtabs:23.2.1'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile('com.squareup.retrofit2:converter-simplexml:2.0.0') {
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'
compile 'com.android.support:palette-v7:23.4.0'
compile 'com.android.support:customtabs:23.4.0'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile('com.squareup.retrofit2:converter-simplexml:2.0.2') {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'
compile 'com.squareup:otto:1.3.8'
compile 'io.reactivex:rxjava:1.1.2'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.jakewharton.timber:timber:4.1.1'
compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'
compile 'com.jakewharton.timber:timber:4.1.2'
compile 'com.google.code.gson:gson:2.6.2'
compile 'net.danlew:android.joda:2.9.2'
compile 'net.danlew:android.joda:2.9.3'
compile "org.parceler:parceler-api:1.0.4"
apt "org.parceler:parceler:1.0.4"
compile 'com.commit451:bypasses:1.0.1'
Loading
Loading
@@ -65,20 +67,23 @@ dependencies {
compile 'com.commit451:foregroundviews:1.0.0'
compile 'com.commit451:elasticdragdismisslayout:1.0.2'
compile 'com.commit451:adapterlayout:1.0.1'
compile 'com.github.Commit451:Gimbal:1.0.0'
compile 'com.github.Commit451:Teleprinter:1.0.1'
compile 'com.github.Commit451:BypassPicassoImageGetter:1.0.0'
compile 'com.github.Commit451:Jounce:1.0.1'
compile 'com.pnikosis:materialish-progress:1.7'
compile 'com.jawnnypoo:physicslayout:1.0.1'
compile 'com.github.ivbaranov:materiallettericon:0.2.1'
compile 'com.github.ivbaranov:materiallettericon:0.2.2'
compile 'com.github.johnkil.android-robototextview:robototextview:2.5.0'
compile 'com.github.alorma:diff-textview:1.3.0'
compile 'com.wdullaer:materialdatetimepicker:2.3.0'
compile "com.wefika:flowlayout:0.4.1"
compile('com.github.afollestad:app-theme-engine:1.0.1@aar') {
transitive = true
}
compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') {
compile 'com.novoda:simple-chrome-custom-tabs:0.1.3-rc1'
compile('com.github.afollestad.material-dialogs:core:0.8.5.8@aar') {
transitive = true
}
compile('com.github.afollestad.material-dialogs:commons:0.8.5.7@aar') {
compile('com.github.afollestad.material-dialogs:commons:0.8.5.8@aar') {
transitive = true
}
}
File deleted
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commit451.gitlab" >
package="com.commit451.gitlab">
 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
 
<application
android:name=".LabCoatApp"
Loading
Loading
@@ -13,38 +13,32 @@
android:fullBackupContent="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:theme="@style/AppTheme">
 
<activity
android:name=".activity.GitlabActivity"
android:theme="@android:style/Theme.NoDisplay"
android:noHistory="true" >
android:name=".activity.LaunchActivity"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
 
<activity android:name=".activity.ProjectActivity" />
<activity android:name=".activity.LoginActivity" />
<activity android:name=".activity.ProjectsActivity"
android:launchMode="singleTask"/>
<activity android:name=".activity.GroupsActivity"
android:launchMode="singleTask"/>
<activity
android:name=".activity.FileActivity">
</activity>
android:name=".activity.ProjectsActivity"
android:launchMode="singleTask"/>
<activity
android:name=".activity.IssueActivity" >
</activity>
android:name=".activity.GroupsActivity"
android:launchMode="singleTask"/>
<activity
android:name=".activity.DiffActivity" >
</activity>
android:name=".activity.ActivityActivity"
android:launchMode="singleTask"/>
<activity android:name=".activity.ProjectActivity"/>
<activity android:name=".activity.LoginActivity"/>
<activity android:name=".activity.FileActivity"/>
<activity android:name=".activity.IssueActivity"/>
<activity android:name=".activity.DiffActivity"/>
<activity android:name=".activity.AboutActivity"/>
<activity android:name=".activity.AddUserActivity"/>
<activity android:name=".activity.UserActivity"/>
Loading
Loading
@@ -54,7 +48,27 @@
<activity android:name=".activity.AddIssueActivity"/>
<activity android:name=".activity.MilestoneActivity"/>
<activity android:name=".activity.AddMilestoneActivity"/>
<activity android:name=".activity.BuildActivity"/>
<activity android:name=".activity.LoadSomeInfoActivity"
android:theme="@style/Activity.Translucent"/>
<activity android:name=".activity.SettingsActivity"/>
<activity
android:name=".activity.RoutingActivity"
android:launchMode="singleTask"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<!-- Standard Url -->
<intent-filter android:label="@string/deeplink_text">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:scheme="@string/deeplink_scheme"/>
</intent-filter>
</activity>
</application>
 
</manifest>
\ No newline at end of file
Loading
Loading
@@ -5,6 +5,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.support.annotation.VisibleForTesting;
 
import com.novoda.simplechromecustomtabs.SimpleChromeCustomTabs;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.otto.Bus;
 
Loading
Loading
@@ -45,6 +46,7 @@ public class LabCoatApp extends Application {
}
 
JodaTimeAndroid.init(this);
SimpleChromeCustomTabs.initialize(this);
}
 
@VisibleForTesting
Loading
Loading
Loading
Loading
@@ -17,15 +17,15 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.commit451.gitbal.Gimbal;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.api.Contributor;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.gitlab.transformation.CircleTransformation;
import com.commit451.gitlab.util.ImageUtil;
import com.commit451.gitlab.util.IntentUtil;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.util.WindowUtil;
import com.jawnnypoo.physicslayout.Physics;
import com.jawnnypoo.physicslayout.PhysicsConfig;
import com.jawnnypoo.physicslayout.PhysicsFrameLayout;
Loading
Loading
@@ -34,7 +34,7 @@ import org.jbox2d.common.Vec2;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
Loading
Loading
@@ -42,28 +42,29 @@ import timber.log.Timber;
 
/**
* Thats what its all about
* Created by Jawn on 8/25/2015.
*/
public class AboutActivity extends BaseActivity {
private static final long REPO_ID = 473568;
private static final String REPO_ID = "473568";
 
public static Intent newInstance(Context context) {
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, AboutActivity.class);
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.contributors)
@BindView(R.id.contributors)
TextView mContributors;
@Bind(R.id.physics_layout)
@BindView(R.id.physics_layout)
PhysicsFrameLayout mPhysicsLayout;
@BindView(R.id.progress)
View mProgress;
 
@OnClick(R.id.sauce)
void onSauceClick() {
if ("https://gitlab.com".equals(GitLabClient.getAccount().getServerUrl().toString())) {
if (getString(R.string.url_gitlab).equals(GitLabClient.getAccount().getServerUrl().toString())) {
NavigationManager.navigateToProject(AboutActivity.this, REPO_ID);
} else {
IntentUtil.openPage(AboutActivity.this, getString(R.string.source_url));
Loading
Loading
@@ -72,13 +73,14 @@ public class AboutActivity extends BaseActivity {
 
SensorManager sensorManager;
Sensor gravitySensor;
Gimbal mGimbal;
 
private final SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
if (mPhysicsLayout.getPhysics().getWorld() != null) {
WindowUtil.normalizeForOrientation(getWindow(), event);
mGimbal.normalizeGravityEvent(event);
mPhysicsLayout.getPhysics().getWorld().setGravity(new Vec2(-event.values[0], event.values[1]));
}
}
Loading
Loading
@@ -92,12 +94,14 @@ public class AboutActivity extends BaseActivity {
private Callback<List<Contributor>> mContributorResponseCallback = new EasyCallback<List<Contributor>>() {
@Override
public void onResponse(@NonNull List<Contributor> response) {
mProgress.setVisibility(View.GONE);
addContributors(Contributor.groupContributors(response));
}
 
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.failed_to_load_contributors, Snackbar.LENGTH_SHORT)
.show();
}
Loading
Loading
@@ -106,7 +110,8 @@ public class AboutActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowUtil.lockToCurrentOrientation(this);
mGimbal = new Gimbal(this);
mGimbal.lock();
setContentView(R.layout.activity_about);
ButterKnife.bind(this);
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
Loading
Loading
@@ -121,6 +126,7 @@ public class AboutActivity extends BaseActivity {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
GitLabClient.instance().getContributors(REPO_ID).enqueue(mContributorResponseCallback);
mProgress.setVisibility(View.VISIBLE);
}
 
@Override
Loading
Loading
package com.commit451.gitlab.activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.view.View;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.CloseDrawerEvent;
import com.commit451.gitlab.fragment.FeedFragment;
import com.squareup.otto.Subscribe;
import butterknife.BindView;
import butterknife.ButterKnife;
import timber.log.Timber;
/**
* Displays the current users projects feed
*/
public class ActivityActivity extends BaseActivity {
private static final String TAG_FEED_FRAGMENT = "feed_fragment";
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, ActivityActivity.class);
return intent;
}
@BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout;
@BindView(R.id.toolbar) Toolbar mToolbar;
EventReceiver mEventReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity);
ButterKnife.bind(this);
mEventReceiver = new EventReceiver();
LabCoatApp.bus().register(mEventReceiver);
mToolbar.setTitle(R.string.nav_activity);
mToolbar.setNavigationIcon(R.drawable.ic_menu_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDrawerLayout.openDrawer(GravityCompat.START);
}
});
FeedFragment feedFragment = (FeedFragment) getSupportFragmentManager().findFragmentByTag(TAG_FEED_FRAGMENT);
if (feedFragment == null) {
Uri feedUri = GitLabClient.getAccount().getServerUrl();
feedUri = feedUri.buildUpon()
.appendPath("dashboard")
.appendPath("projects.atom")
.build();
Timber.d("Showing activity feed for: %s", feedUri.toString());
feedFragment = FeedFragment.newInstance(feedUri);
getSupportFragmentManager().beginTransaction()
.replace(R.id.root_fragment, feedFragment, TAG_FEED_FRAGMENT)
.commit();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
LabCoatApp.bus().unregister(mEventReceiver);
}
private class EventReceiver {
@Subscribe
public void onCloseDrawerEvent(CloseDrawerEvent event) {
mDrawerLayout.closeDrawers();
}
}
}
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.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
Loading
Loading
@@ -12,23 +11,28 @@ import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.commit451.elasticdragdismisslayout.ElasticDragDismissFrameLayout;
import com.commit451.elasticdragdismisslayout.ElasticDragDismissListener;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.AddIssueLabelAdapter;
import com.commit451.gitlab.adapter.AssigneeSpinnerAdapter;
import com.commit451.gitlab.adapter.MilestoneSpinnerAdapter;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.api.exception.NullBodyException;
import com.commit451.gitlab.event.IssueChangedEvent;
import com.commit451.gitlab.event.IssueCreatedEvent;
import com.commit451.gitlab.model.api.Issue;
import com.commit451.gitlab.model.api.Label;
import com.commit451.gitlab.model.api.Member;
import com.commit451.gitlab.model.api.Milestone;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.gitlab.view.AdapterFlowLayout;
import com.commit451.teleprinter.Teleprinter;
 
import org.parceler.Parcels;
 
Loading
Loading
@@ -36,21 +40,16 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import timber.log.Timber;
 
/**
* Activity to input new issues, but not really a dialog at all wink wink
*/
public class AddIssueActivity extends MorphActivity implements ATEActivityThemeCustomizer {
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_Translucent : R.style.ActivityLight_Translucent;
}
public class AddIssueActivity extends MorphActivity {
 
private static final String KEY_PROJECT = "project";
private static final String KEY_ISSUE = "issue";
Loading
Loading
@@ -64,30 +63,45 @@ public class AddIssueActivity extends MorphActivity implements ATEActivityThemeC
return intent;
}
 
@Bind(R.id.root)
ElasticDragDismissFrameLayout mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.root)
FrameLayout mRoot;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.title_text_input_layout)
@BindView(R.id.title_text_input_layout)
TextInputLayout mTitleInputLayout;
@Bind(R.id.title)
@BindView(R.id.title)
EditText mTitleInput;
@Bind(R.id.description)
@BindView(R.id.description)
EditText mDescriptionInput;
@Bind(R.id.progress)
@BindView(R.id.progress)
View mProgress;
@Bind(R.id.assignee_progress)
@BindView(R.id.assignee_progress)
View mAssigneeProgress;
@Bind(R.id.assignee_spinner)
@BindView(R.id.assignee_spinner)
Spinner mAssigneeSpinner;
@Bind(R.id.milestone_progress)
@BindView(R.id.milestone_progress)
View mMilestoneProgress;
@Bind(R.id.milestone_spinner)
@BindView(R.id.milestone_spinner)
Spinner mMilestoneSpinner;
@BindView(R.id.label_label)
TextView mLabelLabel;
@BindView(R.id.labels_progress)
View mLabelsProgress;
@BindView(R.id.list_labels)
AdapterFlowLayout mListLabels;
@BindView(R.id.text_add_labels)
TextView mTextAddLabels;
 
private Project mProject;
private Issue mIssue;
private HashSet<Member> mMembers;
private AddIssueLabelAdapter mLabelsAdapter;
private Teleprinter mTeleprinter;
@OnClick({R.id.text_add_labels, R.id.list_labels})
void onAddLabelsClick() {
NavigationManager.navigateToAddLabels(AddIssueActivity.this, mProject, mIssue);
}
 
private final Callback<List<Milestone>> mMilestonesCallback = new EasyCallback<List<Milestone>>() {
@Override
Loading
Loading
@@ -144,6 +158,28 @@ public class AddIssueActivity extends MorphActivity implements ATEActivityThemeC
}
};
 
private final Callback<List<Label>> mLabelCallback = new EasyCallback<List<Label>>() {
@Override
public void onResponse(@NonNull List<Label> response) {
mLabelsProgress.setVisibility(View.GONE);
mListLabels.setVisibility(View.VISIBLE);
setLabels(response);
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
//null body could just mean no labels have been created for this project
if (t instanceof NullBodyException) {
setLabels(new ArrayList<Label>());
} else {
mListLabels.setVisibility(View.GONE);
mLabelsProgress.setVisibility(View.GONE);
mLabelLabel.setVisibility(View.GONE);
}
}
};
private final Callback<Issue> mIssueCreatedCallback = new EasyCallback<Issue>() {
 
@Override
Loading
Loading
@@ -170,10 +206,13 @@ public class AddIssueActivity extends MorphActivity implements ATEActivityThemeC
setContentView(R.layout.activity_add_issue);
ButterKnife.bind(this);
morph(mRoot);
mTeleprinter = new Teleprinter(this);
 
mProject = Parcels.unwrap(getIntent().getParcelableExtra(KEY_PROJECT));
mIssue = Parcels.unwrap(getIntent().getParcelableExtra(KEY_ISSUE));
mMembers = new HashSet<>();
mLabelsAdapter = new AddIssueLabelAdapter();
mListLabels.setAdapter(mLabelsAdapter);
 
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
Loading
Loading
@@ -201,23 +240,13 @@ public class AddIssueActivity extends MorphActivity implements ATEActivityThemeC
} else {
mToolbar.inflateMenu(R.menu.menu_add_milestone);
}
mRoot.addListener(new ElasticDragDismissListener() {
@Override
public void onDrag(float elasticOffset, float elasticOffsetPixels, float rawOffset, float rawOffsetPixels) {
}
@Override
public void onDragDismissed() {
onBackPressed();
}
});
load();
}
 
private void load() {
GitLabClient.instance().getMilestones(mProject.getId()).enqueue(mMilestonesCallback);
GitLabClient.instance().getProjectMembers(mProject.getId()).enqueue(mAssigneeCallback);
GitLabClient.instance().getLabels(mProject.getId()).enqueue(mLabelCallback);
}
 
private void showLoading() {
Loading
Loading
@@ -245,8 +274,27 @@ public class AddIssueActivity extends MorphActivity implements ATEActivityThemeC
}
}
 
private void setLabels(List<Label> projectLabels) {
if (projectLabels != null && !projectLabels.isEmpty() && mIssue != null && mIssue.getLabels() != null) {
ArrayList<Label> currentLabels = new ArrayList<>();
for (Label label : projectLabels) {
for (String labelName : mIssue.getLabels()) {
if (labelName.equals(label.getName())) {
currentLabels.add(label);
}
}
}
if (!currentLabels.isEmpty()) {
mLabelsAdapter.setLabels(currentLabels);
}
} else {
mTextAddLabels.setVisibility(View.VISIBLE);
}
}
private void save() {
if (!TextUtils.isEmpty(mTitleInput.getText())) {
mTeleprinter.hideKeyboard();
mTitleInputLayout.setError(null);
showLoading();
Long assigneeId = null;
Loading
Loading
Loading
Loading
@@ -4,7 +4,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.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
Loading
Loading
@@ -14,10 +13,9 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
 
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.commit451.elasticdragdismisslayout.ElasticDragDismissFrameLayout;
import com.commit451.elasticdragdismisslayout.ElasticDragDismissListener;
import com.commit451.easel.Easel;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.api.EasyCallback;
Loading
Loading
@@ -25,7 +23,6 @@ import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.MilestoneChangedEvent;
import com.commit451.gitlab.event.MilestoneCreatedEvent;
import com.commit451.gitlab.model.api.Milestone;
import com.commit451.gitlab.util.AppThemeUtil;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
 
import org.parceler.Parcels;
Loading
Loading
@@ -33,28 +30,22 @@ import org.parceler.Parcels;
import java.util.Calendar;
import java.util.Date;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Callback;
import timber.log.Timber;
 
public class AddMilestoneActivity extends MorphActivity implements ATEActivityThemeCustomizer {
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_Translucent : R.style.ActivityLight_Translucent;
}
public class AddMilestoneActivity extends MorphActivity {
 
private static final String KEY_PROJECT_ID = "project_id";
private static final String KEY_MILESTONE = "milestone";
 
public static Intent newInstance(Context context, long projectId) {
return newInstance(context, projectId, null);
public static Intent newIntent(Context context, long projectId) {
return newIntent(context, projectId, null);
}
 
public static Intent newInstance(Context context, long projectId, Milestone milestone) {
public static Intent newIntent(Context context, long projectId, Milestone milestone) {
Intent intent = new Intent(context, AddMilestoneActivity.class);
intent.putExtra(KEY_PROJECT_ID, projectId);
if (milestone != null) {
Loading
Loading
@@ -63,19 +54,19 @@ public class AddMilestoneActivity extends MorphActivity implements ATEActivityTh
return intent;
}
 
@Bind(R.id.root)
ElasticDragDismissFrameLayout mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.root)
FrameLayout mRoot;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.title_text_input_layout)
@BindView(R.id.title_text_input_layout)
TextInputLayout mTitleTextInputLayout;
@Bind(R.id.title)
@BindView(R.id.title)
EditText mTitle;
@Bind(R.id.description)
@BindView(R.id.description)
EditText mDescription;
@Bind(R.id.due_date)
@BindView(R.id.due_date)
Button mDueDate;
@Bind(R.id.progress)
@BindView(R.id.progress)
View mProgress;
 
@OnClick(R.id.due_date)
Loading
Loading
@@ -90,7 +81,7 @@ public class AddMilestoneActivity extends MorphActivity implements ATEActivityTh
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH)
);
dpd.setAccentColor(AppThemeUtil.resolveAccentColor(this));
dpd.setAccentColor(Easel.getThemeAttrColor(this, R.attr.colorAccent));
dpd.show(getFragmentManager(), "date_picker");
}
 
Loading
Loading
@@ -166,15 +157,6 @@ public class AddMilestoneActivity extends MorphActivity implements ATEActivityTh
return false;
}
});
mRoot.addListener(new ElasticDragDismissListener() {
@Override
public void onDrag(float elasticOffset, float elasticOffsetPixels, float rawOffset, float rawOffsetPixels) {}
@Override
public void onDragDismissed() {
onBackPressed();
}
});
}
 
private void createMilestone() {
Loading
Loading
Loading
Loading
@@ -31,15 +31,15 @@ import com.commit451.gitlab.event.MemberAddedEvent;
import com.commit451.gitlab.model.api.Group;
import com.commit451.gitlab.model.api.Member;
import com.commit451.gitlab.model.api.UserBasic;
import com.commit451.gitlab.util.KeyboardUtil;
import com.commit451.gitlab.util.PaginationUtil;
import com.commit451.gitlab.viewHolder.UserViewHolder;
import com.commit451.teleprinter.Teleprinter;
 
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
@@ -65,17 +65,17 @@ public class AddUserActivity extends MorphActivity {
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.search)
@BindView(R.id.search)
EditText mUserSearch;
@Bind(R.id.swipe_layout)
@BindView(R.id.swipe_layout)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list)
@BindView(R.id.list)
RecyclerView mRecyclerView;
@Bind(R.id.clear)
@BindView(R.id.clear)
View mClearView;
GridLayoutManager mUserLinearLayoutManager;
 
Loading
Loading
@@ -86,7 +86,7 @@ public class AddUserActivity extends MorphActivity {
public void run() {
mClearView.setVisibility(View.GONE);
mUserSearch.getText().clear();
KeyboardUtil.showKeyboard(AddUserActivity.this, mUserSearch);
mTeleprinter.showKeyboard(mUserSearch);
}
});
}
Loading
Loading
@@ -99,6 +99,8 @@ public class AddUserActivity extends MorphActivity {
String mSearchQuery;
Uri mNextPageUrl;
boolean mLoading = false;
Teleprinter mTeleprinter;
 
private final View.OnClickListener mOnBackPressed = new View.OnClickListener() {
@Override
Loading
Loading
@@ -246,6 +248,7 @@ public class AddUserActivity extends MorphActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_user);
ButterKnife.bind(this);
mTeleprinter = new Teleprinter(this);
mProjectId = getIntent().getLongExtra(KEY_PROJECT_ID, -1);
mGroup = Parcels.unwrap(getIntent().getParcelableExtra(KEY_GROUP));
mAccessDialog = new AccessDialog(this, mOnAccessAppliedListener);
Loading
Loading
@@ -264,7 +267,7 @@ public class AddUserActivity extends MorphActivity {
}
 
private void loadData() {
KeyboardUtil.hideKeyboard(AddUserActivity.this);
mTeleprinter.hideKeyboard();
mSwipeRefreshLayout.setRefreshing(true);
mLoading = true;
GitLabClient.instance().searchUsers(mSearchQuery).enqueue(mUserCallback);
Loading
Loading
Loading
Loading
@@ -6,20 +6,12 @@ import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
 
import com.afollestad.appthemeengine.ATEActivity;
import com.commit451.gitlab.R;
 
/**
* Created by Jawn on 7/27/2015.
* Base activity for others to derive from
*/
public class BaseActivity extends ATEActivity {
@Nullable
@Override
public final String getATEKey() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
"dark_theme" : "light_theme";
}
public class BaseActivity extends AppCompatActivity {
 
public boolean hasEmptyFields(TextInputLayout... textInputLayouts) {
boolean hasEmptyField = false;
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.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.BuildSectionsPagerAdapter;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.BuildChangedEvent;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.model.api.Project;
import org.parceler.Parcels;
import butterknife.BindView;
import butterknife.ButterKnife;
import timber.log.Timber;
/**
* Shows the details of a merge request
*/
public class BuildActivity extends BaseActivity {
private static final String KEY_PROJECT = "key_project";
private static final String KEY_BUILD = "key_merge_request";
public static Intent newIntent(Context context, Project project, Build build) {
Intent intent = new Intent(context, BuildActivity.class);
intent.putExtra(KEY_PROJECT, Parcels.wrap(project));
intent.putExtra(KEY_BUILD, Parcels.wrap(build));
return intent;
}
@BindView(R.id.root)
ViewGroup mRoot;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.tabs)
TabLayout mTabLayout;
@BindView(R.id.pager)
ViewPager mViewPager;
@BindView(R.id.progress)
View mProgress;
Project mProject;
Build mBuild;
private final EasyCallback<Build> mRetryCallback = new EasyCallback<Build>() {
@Override
public void onResponse(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_started, Snackbar.LENGTH_LONG)
.show();
LabCoatApp.bus().post(new BuildChangedEvent(response));
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_retry_build, Snackbar.LENGTH_LONG)
.show();
}
};
private final EasyCallback<Build> mEraseCallback = new EasyCallback<Build>() {
@Override
public void onResponse(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_erased, Snackbar.LENGTH_LONG)
.show();
LabCoatApp.bus().post(new BuildChangedEvent(response));
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_erase_build, Snackbar.LENGTH_LONG)
.show();
}
};
private final EasyCallback<Build> mCancelCallback = new EasyCallback<Build>() {
@Override
public void onResponse(@NonNull Build response) {
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.build_canceled, Snackbar.LENGTH_LONG)
.show();
LabCoatApp.bus().post(new BuildChangedEvent(response));
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, R.string.unable_to_cancel_build, 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_retry:
mProgress.setVisibility(View.VISIBLE);
GitLabClient.instance().retryBuild(mProject.getId(), mBuild.getId()).enqueue(mRetryCallback);
return true;
case R.id.action_erase:
mProgress.setVisibility(View.VISIBLE);
GitLabClient.instance().eraseBuild(mProject.getId(), mBuild.getId()).enqueue(mEraseCallback);
return true;
case R.id.action_cancel:
mProgress.setVisibility(View.VISIBLE);
GitLabClient.instance().cancelBuild(mProject.getId(), mBuild.getId()).enqueue(mCancelCallback);
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_build);
ButterKnife.bind(this);
mProject = Parcels.unwrap(getIntent().getParcelableExtra(KEY_PROJECT));
mBuild = Parcels.unwrap(getIntent().getParcelableExtra(KEY_BUILD));
mToolbar.setTitle(getString(R.string.build_number) + mBuild.getId());
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
mToolbar.setSubtitle(mProject.getNameWithNamespace());
mToolbar.inflateMenu(R.menu.menu_build);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
setupTabs();
}
private void setupTabs() {
BuildSectionsPagerAdapter sectionsPagerAdapter = new BuildSectionsPagerAdapter(
this,
getSupportFragmentManager(),
mProject,
mBuild);
mViewPager.setAdapter(sectionsPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
}
Loading
Loading
@@ -24,7 +24,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
@@ -37,19 +37,19 @@ public class DiffActivity extends BaseActivity {
private static final String EXTRA_PROJECT = "extra_project";
private static final String EXTRA_COMMIT = "extra_commit";
 
public static Intent newInstance(Context context, Project project, RepositoryCommit commit) {
public static Intent newIntent(Context context, Project project, RepositoryCommit commit) {
Intent intent = new Intent(context, DiffActivity.class);
intent.putExtra(EXTRA_PROJECT, Parcels.wrap(project));
intent.putExtra(EXTRA_COMMIT, Parcels.wrap(commit));
return intent;
}
 
@Bind(R.id.root) ViewGroup mRoot;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mDiffRecyclerView;
@BindView(R.id.root) ViewGroup mRoot;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@BindView(R.id.list) RecyclerView mDiffRecyclerView;
DiffAdapter mDiffAdapter;
@Bind(R.id.message_text) TextView mMessageText;
@BindView(R.id.message_text) TextView mMessageText;
 
private Project mProject;
private RepositoryCommit mCommit;
Loading
Loading
Loading
Loading
@@ -34,7 +34,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.charset.Charset;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import rx.Subscriber;
Loading
Loading
@@ -65,10 +65,10 @@ public class FileActivity extends BaseActivity {
return intent;
}
 
@Bind(R.id.root) ViewGroup mRoot;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.file_blob) WebView mFileBlobView;
@Bind(R.id.progress) View mProgressView;
@BindView(R.id.root) ViewGroup mRoot;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.file_blob) WebView mFileBlobView;
@BindView(R.id.progress) View mProgressView;
 
private long mProjectId;
private String mPath;
Loading
Loading
Loading
Loading
@@ -5,10 +5,8 @@ import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.Snackbar;
Loading
Loading
@@ -19,9 +17,6 @@ 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.adapter.GroupPagerAdapter;
Loading
Loading
@@ -30,11 +25,10 @@ import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.model.api.Group;
import com.commit451.gitlab.model.api.GroupDetail;
import com.commit451.gitlab.transformation.PaletteTransformation;
import com.commit451.gitlab.util.AppThemeUtil;
 
import org.parceler.Parcels;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import timber.log.Timber;
Loading
Loading
@@ -42,45 +36,42 @@ import timber.log.Timber;
/**
* See the things about the group
*/
public class GroupActivity extends BaseActivity implements ATEActivityThemeCustomizer {
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_Group : R.style.ActivityLight_Group;
}
public class GroupActivity extends BaseActivity {
 
private static final String KEY_GROUP = "key_group";
private static final String KEY_GROUP_ID = "key_group_id";
 
public static Intent newInstance(Context context, Group group) {
public static Intent newIntent(Context context, Group group) {
Intent intent = new Intent(context, GroupActivity.class);
intent.putExtra(KEY_GROUP, Parcels.wrap(group));
return intent;
}
 
public static Intent newInstance(Context context, long groupId) {
public static Intent newIntent(Context context, long groupId) {
Intent intent = new Intent(context, GroupActivity.class);
intent.putExtra(KEY_GROUP_ID, groupId);
return intent;
}
 
@Bind(R.id.root) View mRoot;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbarLayout;
@Bind(R.id.viewpager) ViewPager mViewPager;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Bind(R.id.backdrop) ImageView mBackdrop;
@BindView(R.id.root) View mRoot;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbarLayout;
@BindView(R.id.viewpager) ViewPager mViewPager;
@BindView(R.id.tabs) TabLayout mTabLayout;
@BindView(R.id.backdrop) ImageView mBackdrop;
@BindView(R.id.progress) View mProgress;
 
private final Callback<GroupDetail> mGroupCallback = new EasyCallback<GroupDetail>() {
@Override
public void onResponse(@NonNull GroupDetail response) {
mProgress.setVisibility(View.GONE);
bind(response);
}
 
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
showError();
}
};
Loading
Loading
@@ -92,10 +83,6 @@ public class GroupActivity extends BaseActivity implements ATEActivityThemeCusto
ButterKnife.bind(this);
 
// Default content and scrim colors
mCollapsingToolbarLayout.setContentScrimColor(
Config.primaryColor(this, AppThemeUtil.resolveThemeKey(this)));
mCollapsingToolbarLayout.setStatusBarScrimColor(
Config.primaryColorDark(this, AppThemeUtil.resolveThemeKey(this)));
 
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
Loading
Loading
@@ -109,6 +96,7 @@ public class GroupActivity extends BaseActivity implements ATEActivityThemeCusto
Group group = Parcels.unwrap(getIntent().getParcelableExtra(KEY_GROUP));
bind(group);
} else {
mProgress.setVisibility(View.VISIBLE);
long groupId = getIntent().getLongExtra(KEY_GROUP_ID, -1);
GitLabClient.instance().getGroup(groupId).enqueue(mGroupCallback);
}
Loading
Loading
@@ -139,8 +127,8 @@ public class GroupActivity extends BaseActivity implements ATEActivityThemeCusto
 
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.colorAccent));
int darkerColor = Easel.getDarkerColor(vibrantColor);
 
if (Build.VERSION.SDK_INT >= 21) {
Easel.getNavigationBarColorAnimator(getWindow(), darkerColor)
Loading
Loading
@@ -149,12 +137,12 @@ public class GroupActivity extends BaseActivity implements ATEActivityThemeCusto
}
 
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
@@ -4,7 +4,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
Loading
Loading
@@ -16,50 +15,46 @@ import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
 
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.commit451.gitlab.LabCoatApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.GroupAdapter;
import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.CloseDrawerEvent;
import com.commit451.gitlab.model.api.Group;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.gitlab.util.PaginationUtil;
import com.commit451.gitlab.viewHolder.GroupViewHolder;
import com.squareup.otto.Subscribe;
 
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Callback;
import timber.log.Timber;
 
/**
* Displays the groups of the current user
* Created by Jawn on 10/4/2015.
*/
public class GroupsActivity extends BaseActivity implements ATEActivityThemeCustomizer {
public class GroupsActivity extends BaseActivity {
 
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ?
R.style.Activity_Groups : R.style.ActivityLight_Groups;
}
public static Intent newInstance(Context context) {
public static Intent newIntent(Context context) {
Intent intent = new Intent(context, GroupsActivity.class);
return intent;
}
 
@Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout;
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mGroupRecyclerView;
@Bind(R.id.message_text) TextView mMessageText;
@BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@BindView(R.id.list) RecyclerView mGroupRecyclerView;
@BindView(R.id.message_text) TextView mMessageText;
GroupAdapter mGroupAdapter;
LinearLayoutManager mGroupLayoutManager;
 
private Uri mNextPageUrl;
private boolean mLoading = false;
EventReceiver mEventReceiver;
 
private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
@Override
Loading
Loading
@@ -127,6 +122,9 @@ public class GroupsActivity extends BaseActivity implements ATEActivityThemeCust
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_groups);
ButterKnife.bind(this);
mEventReceiver = new EventReceiver();
LabCoatApp.bus().register(mEventReceiver);
mToolbar.setTitle(R.string.nav_groups);
mToolbar.setNavigationIcon(R.drawable.ic_menu_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
Loading
Loading
@@ -155,6 +153,12 @@ public class GroupsActivity extends BaseActivity implements ATEActivityThemeCust
load();
}
 
@Override
protected void onDestroy() {
super.onDestroy();
LabCoatApp.bus().unregister(mEventReceiver);
}
private void load() {
mMessageText.setVisibility(View.GONE);
mSwipeRefreshLayout.post(new Runnable() {
Loading
Loading
@@ -188,7 +192,15 @@ public class GroupsActivity extends BaseActivity implements ATEActivityThemeCust
 
mLoading = true;
 
Timber.d("loadMore called for " + mNextPageUrl);
Timber.d("loadMore called for %s", mNextPageUrl);
GitLabClient.instance().getGroups(mNextPageUrl.toString()).enqueue(mMoreGroupsCallback);
}
private class EventReceiver {
@Subscribe
public void onCloseDrawerEvent(CloseDrawerEvent event) {
mDrawerLayout.closeDrawers();
}
}
}
Loading
Loading
@@ -2,19 +2,19 @@ package com.commit451.gitlab.activity;
 
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
 
import com.commit451.gitlab.LabCoatApp;
Loading
Loading
@@ -24,22 +24,28 @@ import com.commit451.gitlab.api.EasyCallback;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.event.IssueChangedEvent;
import com.commit451.gitlab.event.IssueReloadEvent;
import com.commit451.gitlab.model.api.FileUploadResponse;
import com.commit451.gitlab.model.api.Issue;
import com.commit451.gitlab.model.api.Note;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.navigation.NavigationManager;
import com.commit451.gitlab.util.IntentUtil;
import com.commit451.gitlab.util.KeyboardUtil;
import com.commit451.gitlab.util.NavigationManager;
import com.commit451.gitlab.util.PaginationUtil;
import com.commit451.gitlab.view.SendMessageView;
import com.commit451.teleprinter.Teleprinter;
import com.squareup.otto.Subscribe;
 
import org.parceler.Parcels;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
 
import butterknife.Bind;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Callback;
import timber.log.Timber;
 
Loading
Loading
@@ -50,47 +56,57 @@ public class IssueActivity extends BaseActivity {
 
private static final String EXTRA_PROJECT = "extra_project";
private static final String EXTRA_SELECTED_ISSUE = "extra_selected_issue";
private static final String EXTRA_PROJECT_NAMESPACE = "project_namespace";
private static final String EXTRA_PROJECT_NAME = "project_name";
private static final String EXTRA_ISSUE_IID = "extra_issue_iid";
 
public static Intent newInstance(Context context, Project project, Issue issue) {
private static final int REQUEST_IMAGE = 1;
public static Intent newIntent(Context context, Project project, Issue issue) {
Intent intent = new Intent(context, IssueActivity.class);
intent.putExtra(EXTRA_PROJECT, Parcels.wrap(project));
intent.putExtra(EXTRA_SELECTED_ISSUE, Parcels.wrap(issue));
return intent;
}
 
@Bind(R.id.root)
public static Intent newIntent(Context context, String namespace, String projectName, String issueIid) {
Intent intent = new Intent(context, IssueActivity.class);
intent.putExtra(EXTRA_PROJECT_NAMESPACE, namespace);
intent.putExtra(EXTRA_PROJECT_NAME, projectName);
intent.putExtra(EXTRA_ISSUE_IID, issueIid);
return intent;
}
@BindView(R.id.root)
ViewGroup mRoot;
@Bind(R.id.toolbar)
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.issue_title)
@BindView(R.id.issue_title)
TextView mIssueTitle;
@Bind(R.id.swipe_layout)
@BindView(R.id.swipe_layout)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list)
@BindView(R.id.list)
RecyclerView mNotesRecyclerView;
@Bind(R.id.new_note_edit)
EditText mNewNoteEdit;
@Bind(R.id.progress)
@BindView(R.id.send_message_view)
SendMessageView mSendMessageView;
@BindView(R.id.progress)
View mProgress;
 
@OnClick(R.id.new_note_button)
public void onNewNoteClick() {
postNote();
}
@OnClick(R.id.fab_edit_issue)
public void onEditIssueClick(View fab) {
NavigationManager.navigateToEditIssue(IssueActivity.this, fab, mProject, mIssue);
}
 
private MenuItem mOpenCloseMenuItem;
private IssueDetailsAdapter mIssueDetailsAdapter;
private LinearLayoutManager mNotesLayoutManager;
private Project mProject;
private Issue mIssue;
private String mIssueIid;
private boolean mLoading;
private Uri mNextPageUrl;
private Teleprinter mTeleprinter;
 
private EventReceiver mEventReceiver;
 
Loading
Loading
@@ -122,6 +138,49 @@ public class IssueActivity extends BaseActivity {
}
};
 
private Callback<Project> mProjectCallback = new EasyCallback<Project>() {
@Override
public void onResponse(@NonNull Project response) {
mProject = response;
GitLabClient.instance().getIssuesByIid(mProject.getId(), mIssueIid).enqueue(mIssueCallback);
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<List<Issue>> mIssueCallback = new EasyCallback<List<Issue>>() {
@Override
public void onResponse(@NonNull List<Issue> response) {
if (response.isEmpty()) {
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
} else {
mIssue = response.get(0);
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
bindIssue();
bindProject();
loadNotes();
}
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mSwipeRefreshLayout.setRefreshing(false);
Snackbar.make(mRoot, getString(R.string.failed_to_load), Snackbar.LENGTH_SHORT)
.show();
}
};
private Callback<List<Note>> mNotesCallback = new EasyCallback<List<Note>>() {
 
@Override
Loading
Loading
@@ -198,17 +257,31 @@ public class IssueActivity extends BaseActivity {
}
};
 
private Callback<FileUploadResponse> mUploadImageCallback = new EasyCallback<FileUploadResponse>() {
@Override
public void onResponse(@NonNull FileUploadResponse response) {
mProgress.setVisibility(View.GONE);
mSendMessageView.appendText(response.getMarkdown());
}
@Override
public void onAllFailure(Throwable t) {
Timber.e(t, null);
mProgress.setVisibility(View.GONE);
Snackbar.make(mRoot, getString(R.string.connection_error), Snackbar.LENGTH_SHORT)
.show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_issue);
ButterKnife.bind(this);
mTeleprinter = new Teleprinter(this);
mEventReceiver = new EventReceiver();
LabCoatApp.bus().register(mEventReceiver);
 
mProject = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_PROJECT));
mIssue = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_SELECTED_ISSUE));
mToolbar.setNavigationIcon(R.drawable.ic_back_24dp);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
Loading
Loading
@@ -216,22 +289,28 @@ public class IssueActivity extends BaseActivity {
onBackPressed();
}
});
mToolbar.setSubtitle(mProject.getNameWithNamespace());
mToolbar.inflateMenu(R.menu.menu_issue);
mOpenCloseMenuItem = mToolbar.getMenu().findItem(R.id.action_close);
mToolbar.setOnMenuItemClickListener(mOnMenuItemClickListener);
 
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue);
mNotesLayoutManager = new LinearLayoutManager(this);
mNotesRecyclerView.setLayoutManager(mNotesLayoutManager);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
mNotesRecyclerView.addOnScrollListener(mOnScrollListener);
 
mNewNoteEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
mSendMessageView.setCallbacks(new SendMessageView.Callbacks() {
@Override
public void onSendClicked(String message) {
postNote(message);
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
postNote();
return true;
public void onGalleryClicked() {
NavigationManager.navigateToChoosePhoto(IssueActivity.this, REQUEST_IMAGE);
}
@Override
public void onCameraClicked() {
}
});
 
Loading
Loading
@@ -241,8 +320,51 @@ public class IssueActivity extends BaseActivity {
loadNotes();
}
});
bindIssue();
loadNotes();
if (getIntent().hasExtra(EXTRA_SELECTED_ISSUE)) {
mProject = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_PROJECT));
mIssue = Parcels.unwrap(getIntent().getParcelableExtra(EXTRA_SELECTED_ISSUE));
mIssueDetailsAdapter = new IssueDetailsAdapter(IssueActivity.this, mIssue);
mNotesRecyclerView.setAdapter(mIssueDetailsAdapter);
bindIssue();
bindProject();
loadNotes();
} else if (getIntent().hasExtra(EXTRA_ISSUE_IID)) {
mIssueIid = getIntent().getStringExtra(EXTRA_ISSUE_IID);
String projectNamespace = getIntent().getStringExtra(EXTRA_PROJECT_NAMESPACE);
String projectName = getIntent().getStringExtra(EXTRA_PROJECT_NAME);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setRefreshing(true);
}
}
});
GitLabClient.instance().getProject(projectNamespace, projectName).enqueue(mProjectCallback);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_IMAGE:
//Not checking result code because apps are dumb and don't use it
Uri selectedImage = data.getData();
if (selectedImage != null) {
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), stream.toByteArray());
GitLabClient.instance().uploadFile(mProject.getId(), requestBody).enqueue(mUploadImageCallback);
} catch (IOException e) {
Timber.e(e, null);
}
}
break;
}
}
 
@Override
Loading
Loading
@@ -251,6 +373,10 @@ public class IssueActivity extends BaseActivity {
LabCoatApp.bus().unregister(mEventReceiver);
}
 
private void bindProject() {
mToolbar.setSubtitle(mProject.getNameWithNamespace());
}
private void bindIssue() {
mToolbar.setTitle(getString(R.string.issue_number) + mIssue.getIid());
setOpenCloseMenuStatus();
Loading
Loading
@@ -277,10 +403,9 @@ public class IssueActivity extends BaseActivity {
GitLabClient.instance().getIssueNotes(mNextPageUrl.toString()).enqueue(mMoreNotesCallback);
}
 
private void postNote() {
String body = mNewNoteEdit.getText().toString();
private void postNote(String message) {
 
if (body.length() < 1) {
if (message.length() < 1) {
return;
}
 
Loading
Loading
@@ -288,10 +413,10 @@ public class IssueActivity extends BaseActivity {
mProgress.setAlpha(0.0f);
mProgress.animate().alpha(1.0f);
// Clear text & collapse keyboard
KeyboardUtil.hideKeyboard(this);
mNewNoteEdit.setText("");
mTeleprinter.hideKeyboard();
mSendMessageView.clearText();
 
GitLabClient.instance().addIssueNote(mProject.getId(), mIssue.getId(), body).enqueue(mPostNoteCallback);
GitLabClient.instance().addIssueNote(mProject.getId(), mIssue.getId(), message).enqueue(mPostNoteCallback);
}
 
private void closeOrOpenIssue() {
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