Skip to content
Snippets Groups Projects
Commit bfaf3400 authored by John Carlson's avatar John Carlson
Browse files

Fragments to Kotlin

parent 782f0bf6
No related branches found
No related tags found
No related merge requests found
Showing
with 604 additions and 888 deletions
Loading
Loading
@@ -77,7 +77,9 @@ class UserActivity : BaseActivity() {
 
if (savedInstanceState == null) {
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.add(R.id.user_feed, FeedFragment.newInstance(user.feedUrl)).commit()
fragmentTransaction
.add(R.id.user_feed, FeedFragment.newInstance(user.feedUrl))
.commit()
}
}
 
Loading
Loading
Loading
Loading
@@ -32,9 +32,9 @@ public class BuildSectionsPagerAdapter extends FragmentPagerAdapter {
 
switch(position) {
case 0:
return BuildDescriptionFragment.newInstance(project, build);
return BuildDescriptionFragment.Companion.newInstance(project, build);
case 1:
return BuildLogFragment.newInstance(project, build);
return BuildLogFragment.Companion.newInstance(project, build);
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -53,11 +53,11 @@ public class GroupPagerAdapter extends FragmentPagerAdapter {
 
switch (position) {
case ACTIVITY_POS:
return FeedFragment.newInstance(group.getFeedUrl());
return FeedFragment.Companion.newInstance(group.getFeedUrl());
case PROJECTS_POS:
return ProjectsFragment.newInstance(group);
return ProjectsFragment.Companion.newInstance(group);
case MEMBERS_POS:
return GroupMembersFragment.newInstance(group);
return GroupMembersFragment.Companion.newInstance(group);
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -32,9 +32,9 @@ public class MergeRequestSectionsPagerAdapter extends FragmentPagerAdapter {
 
switch(position) {
case 0:
return MergeRequestDiscussionFragment.newInstance(project, mergeRequest);
return MergeRequestDiscussionFragment.Companion.newInstance(project, mergeRequest);
case 1:
return MergeRequestCommitsFragment.newInstance(project, mergeRequest);
return MergeRequestCommitsFragment.Companion.newInstance(project, mergeRequest);
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -32,9 +32,9 @@ public class PickBranchOrTagPagerAdapter extends FragmentPagerAdapter {
 
switch(position) {
case 0:
return PickBranchFragment.newInstance(projectId, ref);
return PickBranchFragment.Companion.newInstance(projectId, ref);
case 1:
return PickTagFragment.newInstance(projectId, ref);
return PickTagFragment.Companion.newInstance(projectId, ref);
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -25,11 +25,11 @@ public class ProjectPagerAdapter extends FragmentPagerAdapter {
 
switch(position) {
case 0:
return ProjectsFragment.newInstance(ProjectsFragment.MODE_ALL);
return ProjectsFragment.Companion.newInstance(ProjectsFragment.Companion.getMODE_ALL());
case 1:
return ProjectsFragment.newInstance(ProjectsFragment.MODE_MINE);
return ProjectsFragment.Companion.newInstance(ProjectsFragment.Companion.getMODE_MINE());
case 2:
return ProjectsFragment.newInstance(ProjectsFragment.MODE_STARRED);
return ProjectsFragment.Companion.newInstance(ProjectsFragment.Companion.getMODE_STARRED());
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -91,25 +91,25 @@ public class ProjectSectionsPagerAdapter extends FragmentPagerAdapter {
 
switch (position) {
case PROJECT_POS:
return ProjectFragment.newInstance();
return ProjectFragment.Companion.newInstance();
case ACTIVITY_POS:
return FeedFragment.newInstance(project.getFeedUrl());
return FeedFragment.Companion.newInstance(project.getFeedUrl());
case FILES_POS:
return FilesFragment.newInstance();
return FilesFragment.Companion.newInstance();
case COMMITS_POS:
return CommitsFragment.newInstance();
return CommitsFragment.Companion.newInstance();
case BUILDS_POS:
return BuildsFragment.newInstance();
return BuildsFragment.Companion.newInstance();
case MILESTONES_POS:
return MilestonesFragment.newInstance();
return MilestonesFragment.Companion.newInstance();
case ISSUES_POS:
return IssuesFragment.newInstance();
return IssuesFragment.Companion.newInstance();
case MERGE_REQUESTS_POS:
return MergeRequestsFragment.newInstance();
return MergeRequestsFragment.Companion.newInstance();
case PROJECT_MEMBERS_POS:
return ProjectMembersFragment.newInstance();
return ProjectMembersFragment.Companion.newInstance();
case SNIPPETS_POS:
return SnippetsFragment.newInstance();
return SnippetsFragment.Companion.newInstance();
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
Loading
Loading
@@ -21,8 +21,8 @@ public class SearchPagerAdapter extends FragmentPagerAdapter {
 
public SearchPagerAdapter(Context context, FragmentManager fm) {
super(fm);
projectsFragment = ProjectsFragment.newInstance(ProjectsFragment.MODE_SEARCH);
usersFragment = UsersFragment.newInstance();
projectsFragment = ProjectsFragment.Companion.newInstance(ProjectsFragment.Companion.getMODE_SEARCH());
usersFragment = UsersFragment.Companion.newInstance();
titles = context.getResources().getStringArray(R.array.search_tabs);
}
 
Loading
Loading
Loading
Loading
@@ -25,9 +25,9 @@ public class TodoPagerAdapter extends FragmentPagerAdapter {
 
switch(position) {
case 0:
return TodoFragment.newInstance(TodoFragment.MODE_TODO);
return TodoFragment.Companion.newInstance(TodoFragment.Companion.getMODE_TODO());
case 1:
return TodoFragment.newInstance(TodoFragment.MODE_DONE);
return TodoFragment.Companion.newInstance(TodoFragment.Companion.getMODE_DONE());
}
 
throw new IllegalStateException("Position exceeded on view pager");
Loading
Loading
package com.commit451.gitlab.fragment;
import android.os.Bundle;
import android.view.View;
import com.commit451.gitlab.App;
import com.commit451.gitlab.event.ReloadDataEvent;
import com.trello.rxlifecycle2.components.support.RxFragment;
import org.greenrobot.eventbus.Subscribe;
public class BaseFragment extends RxFragment {
private EventReceiver baseEventReceiver;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
baseEventReceiver = new EventReceiver();
App.bus().register(baseEventReceiver);
}
@Override
public void onDestroyView() {
super.onDestroyView();
App.bus().unregister(baseEventReceiver);
}
/**
* Load the data based on a {@link ReloadDataEvent}
*/
protected void loadData() {
}
public boolean onBackPressed() {
return false;
}
private class EventReceiver {
@Subscribe
public void onReloadData(ReloadDataEvent event) {
loadData();
}
}
}
package com.commit451.gitlab.fragment
import android.os.Bundle
import android.view.View
import com.commit451.gitlab.App
import com.commit451.gitlab.event.ReloadDataEvent
import com.trello.rxlifecycle2.components.support.RxFragment
import org.greenrobot.eventbus.Subscribe
open class BaseFragment : RxFragment() {
var baseEventReceiver: EventReceiver? = null
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
baseEventReceiver = EventReceiver()
App.bus().register(baseEventReceiver!!)
}
override fun onDestroyView() {
super.onDestroyView()
App.bus().unregister(baseEventReceiver)
}
/**
* Load the data based on a [ReloadDataEvent]
*/
open fun loadData() {
}
open fun onBackPressed(): Boolean {
return false
}
inner class EventReceiver {
@Subscribe
fun onReloadData(event: ReloadDataEvent) {
loadData()
}
}
}
package com.commit451.gitlab.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.event.BuildChangedEvent;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.model.api.RepositoryCommit;
import com.commit451.gitlab.model.api.Runner;
import com.commit451.gitlab.rx.CustomSingleObserver;
import com.commit451.gitlab.util.DateUtil;
import org.greenrobot.eventbus.Subscribe;
import org.parceler.Parcels;
import java.util.Date;
import butterknife.BindView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
/**
* Shows the details of a build
*/
public class BuildDescriptionFragment extends ButterKnifeFragment {
private static final String KEY_PROJECT = "project";
private static final String KEY_BUILD = "build";
public static BuildDescriptionFragment newInstance(Project project, Build build) {
BuildDescriptionFragment fragment = new BuildDescriptionFragment();
Bundle args = new Bundle();
args.putParcelable(KEY_PROJECT, Parcels.wrap(project));
args.putParcelable(KEY_BUILD, Parcels.wrap(build));
fragment.setArguments(args);
return fragment;
}
@BindView(R.id.root)
ViewGroup root;
@BindView(R.id.swipe_layout)
SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.text_status)
TextView textStatus;
@BindView(R.id.text_duration)
TextView textDuration;
@BindView(R.id.text_created)
TextView textCreated;
@BindView(R.id.text_finished)
TextView textFinished;
@BindView(R.id.text_runner)
TextView textRunner;
@BindView(R.id.text_ref)
TextView textRef;
@BindView(R.id.text_author)
TextView textAuthor;
@BindView(R.id.text_message)
TextView textMessage;
Project project;
Build build;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
project = Parcels.unwrap(getArguments().getParcelable(KEY_PROJECT));
build = Parcels.unwrap(getArguments().getParcelable(KEY_BUILD));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_build_description, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
load();
}
});
bindBuild(build);
App.bus().register(this);
}
private void load() {
App.get().getGitLab().getBuild(project.getId(), build.getId())
.compose(this.<Build>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomSingleObserver<Build>() {
@Override
public void error(@NonNull Throwable t) {
Timber.e(t);
Snackbar.make(root, R.string.unable_to_load_build, Snackbar.LENGTH_LONG)
.show();
}
@Override
public void success(@NonNull Build build) {
swipeRefreshLayout.setRefreshing(false);
BuildDescriptionFragment.this.build = build;
bindBuild(build);
App.bus().post(new BuildChangedEvent(build));
}
});
}
private void bindBuild(Build build) {
Date finishedTime = build.getFinishedAt();
if (finishedTime == null) {
finishedTime = new Date();
}
Date startedTime = build.getStartedAt();
if (startedTime == null) {
startedTime = new Date();
}
String status = String.format(getString(R.string.build_status), build.getStatus());
textStatus.setText(status);
String timeTaken = DateUtil.getTimeTaken(startedTime, finishedTime);
String duration = String.format(getString(R.string.build_duration), timeTaken);
textDuration.setText(duration);
String created = String.format(getString(R.string.build_created), DateUtil.getRelativeTimeSpanString(getActivity(), build.getCreatedAt()));
textCreated.setText(created);
String ref = String.format(getString(R.string.build_ref), build.getRef());
textRef.setText(ref);
if (build.getFinishedAt() != null) {
String finished = String.format(getString(R.string.build_finished), DateUtil.getRelativeTimeSpanString(getActivity(), build.getFinishedAt()));
textFinished.setText(finished);
textFinished.setVisibility(View.VISIBLE);
} else {
textFinished.setVisibility(View.GONE);
}
if (build.getRunner() != null) {
bindRunner(build.getRunner());
}
if (build.getCommit() != null) {
bindCommit(build.getCommit());
}
}
private void bindRunner(Runner runner) {
String runnerNum = String.format(getString(R.string.runner_number), String.valueOf(runner.getId()));
textRunner.setText(runnerNum);
}
private void bindCommit(RepositoryCommit commit) {
String authorText = String.format(getString(R.string.build_commit_author), commit.getAuthorName());
textAuthor.setText(authorText);
String messageText = String.format(getString(R.string.build_commit_message), commit.getMessage());
textMessage.setText(messageText);
}
@Override
public void onDestroyView() {
App.bus().unregister(this);
super.onDestroyView();
}
@Subscribe
public void onBuildChangedEvent(BuildChangedEvent event) {
if (build.getId() == event.build.getId()) {
build = event.build;
bindBuild(build);
}
}
}
package com.commit451.gitlab.fragment
import android.os.Bundle
import android.os.Parcelable
import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import butterknife.BindView
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.event.BuildChangedEvent
import com.commit451.gitlab.model.api.Build
import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.model.api.RepositoryCommit
import com.commit451.gitlab.model.api.Runner
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.DateUtil
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber
import java.util.*
/**
* Shows the details of a build
*/
class BuildDescriptionFragment : ButterKnifeFragment() {
companion object {
private val KEY_PROJECT = "project"
private val KEY_BUILD = "build"
fun newInstance(project: Project, build: Build): BuildDescriptionFragment {
val fragment = BuildDescriptionFragment()
val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project))
args.putParcelable(KEY_BUILD, Parcels.wrap(build))
fragment.arguments = args
return fragment
}
}
@BindView(R.id.root)
lateinit var root: ViewGroup
@BindView(R.id.swipe_layout)
lateinit var swipeRefreshLayout: SwipeRefreshLayout
@BindView(R.id.text_status)
lateinit var textStatus: TextView
@BindView(R.id.text_duration)
lateinit var textDuration: TextView
@BindView(R.id.text_created)
lateinit var textCreated: TextView
@BindView(R.id.text_finished)
lateinit var textFinished: TextView
@BindView(R.id.text_runner)
lateinit var textRunner: TextView
@BindView(R.id.text_ref)
lateinit var textRef: TextView
@BindView(R.id.text_author)
lateinit var textAuthor: TextView
@BindView(R.id.text_message)
lateinit var textMessage: TextView
lateinit var project: Project
lateinit var build: Build
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT))
build = Parcels.unwrap<Build>(arguments.getParcelable<Parcelable>(KEY_BUILD))
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_build_description, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout.setOnRefreshListener { load() }
bindBuild(build)
App.bus().register(this)
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
fun load() {
App.get().gitLab.getBuild(project.id, build.id)
.compose(this.bindToLifecycle<Build>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : CustomSingleObserver<Build>() {
override fun error(t: Throwable) {
Timber.e(t)
Snackbar.make(root, R.string.unable_to_load_build, Snackbar.LENGTH_LONG)
.show()
}
override fun success(build: Build) {
swipeRefreshLayout.isRefreshing = false
this@BuildDescriptionFragment.build = build
bindBuild(build)
App.bus().post(BuildChangedEvent(build))
}
})
}
fun bindBuild(build: Build) {
var finishedTime: Date? = build.finishedAt
if (finishedTime == null) {
finishedTime = Date()
}
var startedTime: Date? = build.startedAt
if (startedTime == null) {
startedTime = Date()
}
val status = String.format(getString(R.string.build_status), build.status)
textStatus.text = status
val timeTaken = DateUtil.getTimeTaken(startedTime, finishedTime)
val duration = String.format(getString(R.string.build_duration), timeTaken)
textDuration.text = duration
val created = String.format(getString(R.string.build_created), DateUtil.getRelativeTimeSpanString(activity, build.createdAt))
textCreated.text = created
val ref = String.format(getString(R.string.build_ref), build.ref)
textRef.text = ref
if (build.finishedAt != null) {
val finished = String.format(getString(R.string.build_finished), DateUtil.getRelativeTimeSpanString(activity, build.finishedAt))
textFinished.text = finished
textFinished.visibility = View.VISIBLE
} else {
textFinished.visibility = View.GONE
}
if (build.runner != null) {
bindRunner(build.runner)
}
if (build.commit != null) {
bindCommit(build.commit)
}
}
fun bindRunner(runner: Runner) {
val runnerNum = String.format(getString(R.string.runner_number), runner.id.toString())
textRunner.text = runnerNum
}
fun bindCommit(commit: RepositoryCommit) {
val authorText = String.format(getString(R.string.build_commit_author), commit.authorName)
textAuthor.text = authorText
val messageText = String.format(getString(R.string.build_commit_message), commit.message)
textMessage.text = messageText
}
@Subscribe
fun onBuildChangedEvent(event: BuildChangedEvent) {
if (build.id == event.build.id) {
build = event.build
bindBuild(build)
}
}
}
package com.commit451.gitlab.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.event.BuildChangedEvent;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.rx.CustomSingleObserver;
import com.commit451.gitlab.util.BuildUtil;
import org.greenrobot.eventbus.Subscribe;
import org.parceler.Parcels;
import butterknife.BindView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
/**
* Shows the build artifacts
*/
public class BuildLogFragment extends ButterKnifeFragment {
private static final String KEY_PROJECT = "project";
private static final String KEY_BUILD = "build";
public static BuildLogFragment newInstance(Project project, Build build) {
BuildLogFragment fragment = new BuildLogFragment();
Bundle args = new Bundle();
args.putParcelable(KEY_PROJECT, Parcels.wrap(project));
args.putParcelable(KEY_BUILD, Parcels.wrap(build));
fragment.setArguments(args);
return fragment;
}
@BindView(R.id.swipe_layout)
SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.log)
TextView textLog;
@BindView(R.id.message_text)
TextView textMessage;
Project project;
Build build;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
project = Parcels.unwrap(getArguments().getParcelable(KEY_PROJECT));
build = Parcels.unwrap(getArguments().getParcelable(KEY_BUILD));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_build_log, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData();
}
});
loadData();
App.bus().register(this);
}
@Override
public void onDestroyView() {
App.bus().unregister(this);
super.onDestroyView();
}
@Override
protected void loadData() {
if (getView() == null) {
return;
}
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (swipeRefreshLayout != null) {
swipeRefreshLayout.setRefreshing(true);
}
}
});
String url = BuildUtil.getRawBuildUrl(App.get().getAccount().getServerUrl(), project, build);
App.get().getGitLab().getRaw(url)
.compose(this.<String>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomSingleObserver<String>() {
@Override
public void error(@NonNull Throwable t) {
Timber.e(t);
swipeRefreshLayout.setRefreshing(false);
textMessage.setVisibility(View.VISIBLE);
}
@Override
public void success(@NonNull String s) {
swipeRefreshLayout.setRefreshing(false);
textLog.setText(s);
}
});
}
@Subscribe
public void onBuildChanged(BuildChangedEvent event) {
if (build.getId() == event.build.getId()) {
build = event.build;
loadData();
}
}
}
\ No newline at end of file
package com.commit451.gitlab.fragment
import android.os.Bundle
import android.os.Parcelable
import android.support.v4.widget.SwipeRefreshLayout
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import butterknife.BindView
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.event.BuildChangedEvent
import com.commit451.gitlab.model.api.Build
import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.BuildUtil
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber
/**
* Shows the build artifacts
*/
class BuildLogFragment : ButterKnifeFragment() {
companion object {
private val KEY_PROJECT = "project"
private val KEY_BUILD = "build"
fun newInstance(project: Project, build: Build): BuildLogFragment {
val fragment = BuildLogFragment()
val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project))
args.putParcelable(KEY_BUILD, Parcels.wrap(build))
fragment.arguments = args
return fragment
}
}
@BindView(R.id.swipe_layout)
lateinit var swipeRefreshLayout: SwipeRefreshLayout
@BindView(R.id.log)
lateinit var textLog: TextView
@BindView(R.id.message_text)
lateinit var textMessage: TextView
lateinit var project: Project
lateinit var build: Build
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT))
build = Parcels.unwrap<Build>(arguments.getParcelable<Parcelable>(KEY_BUILD))
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_build_log, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout.setOnRefreshListener { loadData() }
loadData()
App.bus().register(this)
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
override fun loadData() {
if (view == null) {
return
}
swipeRefreshLayout.isRefreshing = true
val url = BuildUtil.getRawBuildUrl(App.get().account.serverUrl, project, build)
App.get().gitLab.getRaw(url)
.compose(this.bindToLifecycle<String>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : CustomSingleObserver<String>() {
override fun error(t: Throwable) {
Timber.e(t)
swipeRefreshLayout.isRefreshing = false
textMessage.visibility = View.VISIBLE
}
override fun success(log: String) {
swipeRefreshLayout.isRefreshing = false
textLog.text = log
}
})
}
@Subscribe
fun onBuildChanged(event: BuildChangedEvent) {
if (build.id == event.build.id) {
build = event.build
loadData()
}
}
}
\ No newline at end of file
package com.commit451.gitlab.fragment;
import android.net.Uri;
import android.os.Bundle;
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.view.LayoutInflater;
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 com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.activity.ProjectActivity;
import com.commit451.gitlab.adapter.BuildAdapter;
import com.commit451.gitlab.adapter.DividerItemDecoration;
import com.commit451.gitlab.event.BuildChangedEvent;
import com.commit451.gitlab.event.ProjectReloadEvent;
import com.commit451.gitlab.model.api.Build;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.navigation.Navigator;
import com.commit451.gitlab.rx.CustomResponseSingleObserver;
import com.commit451.gitlab.util.LinkHeaderParser;
import org.greenrobot.eventbus.Subscribe;
import java.util.List;
import butterknife.BindView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Response;
import timber.log.Timber;
/**
* Shows the builds of a project
*/
public class BuildsFragment extends ButterKnifeFragment {
public static BuildsFragment newInstance() {
return new BuildsFragment();
}
@BindView(R.id.root)
ViewGroup root;
@BindView(R.id.swipe_layout)
SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.list)
RecyclerView listBuilds;
@BindView(R.id.message_text)
TextView textMessage;
@BindView(R.id.issue_spinner)
Spinner spinnerIssue;
BuildAdapter adapterBuilds;
LinearLayoutManager layoutManagerBuilds;
Project project;
String scope;
String[] scopes;
Uri nextPageUrl;
boolean loading;
private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = layoutManagerBuilds.getChildCount();
int totalItemCount = layoutManagerBuilds.getItemCount();
int firstVisibleItem = layoutManagerBuilds.findFirstVisibleItemPosition();
if (firstVisibleItem + visibleItemCount >= totalItemCount && !loading && nextPageUrl != null) {
loadMore();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
scopes = getResources().getStringArray(R.array.build_scope_values);
scope = scopes[0];
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_builds, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
App.bus().register(this);
adapterBuilds = new BuildAdapter(new BuildAdapter.Listener() {
@Override
public void onBuildClicked(Build build) {
if (project != null) {
Navigator.navigateToBuild(getActivity(), project, build);
} else {
Snackbar.make(root, getString(R.string.wait_for_project_to_load), Snackbar.LENGTH_SHORT)
.show();
}
}
});
layoutManagerBuilds = new LinearLayoutManager(getActivity());
listBuilds.setLayoutManager(layoutManagerBuilds);
listBuilds.addItemDecoration(new DividerItemDecoration(getActivity()));
listBuilds.setAdapter(adapterBuilds);
listBuilds.addOnScrollListener(onScrollListener);
spinnerIssue.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1,
android.R.id.text1, getResources().getStringArray(R.array.build_scope_names)));
spinnerIssue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
scope = scopes[position];
loadData();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData();
}
});
if (getActivity() instanceof ProjectActivity) {
project = ((ProjectActivity) getActivity()).getProject();
loadData();
} else {
throw new IllegalStateException("Incorrect parent activity");
}
}
@Override
public void onDestroyView() {
App.bus().unregister(this);
super.onDestroyView();
}
@Override
protected void loadData() {
if (getView() == null) {
return;
}
if (project == null) {
swipeRefreshLayout.setRefreshing(false);
return;
}
textMessage.setVisibility(View.GONE);
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (swipeRefreshLayout != null) {
swipeRefreshLayout.setRefreshing(true);
}
}
});
nextPageUrl = null;
loading = true;
App.get().getGitLab().getBuilds(project.getId(), scope)
.compose(this.<Response<List<Build>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomResponseSingleObserver<List<Build>>() {
@Override
public void error(@NonNull Throwable e) {
loading = false;
Timber.e(e);
swipeRefreshLayout.setRefreshing(false);
textMessage.setVisibility(View.VISIBLE);
textMessage.setText(R.string.failed_to_load_builds);
adapterBuilds.setValues(null);
nextPageUrl = null;
}
@Override
public void responseSuccess(@NonNull List<Build> builds) {
loading = false;
swipeRefreshLayout.setRefreshing(false);
if (builds.isEmpty()) {
textMessage.setVisibility(View.VISIBLE);
textMessage.setText(R.string.no_builds);
}
adapterBuilds.setValues(builds);
nextPageUrl = LinkHeaderParser.parse(response()).getNext();
Timber.d("Next page url %s", nextPageUrl);
}
});
}
private void loadMore() {
if (getView() == null) {
return;
}
if (nextPageUrl == null) {
return;
}
adapterBuilds.setLoading(true);
loading = true;
Timber.d("loadMore called for %s", nextPageUrl);
App.get().getGitLab().getBuilds(nextPageUrl.toString(), scope)
.compose(this.<Response<List<Build>>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomResponseSingleObserver<List<Build>>() {
@Override
public void error(@NonNull Throwable e) {
Timber.e(e);
loading = false;
adapterBuilds.setLoading(false);
}
@Override
public void responseSuccess(@NonNull List<Build> builds) {
loading = false;
adapterBuilds.setLoading(false);
nextPageUrl = LinkHeaderParser.parse(response()).getNext();
adapterBuilds.addValues(builds);
}
});
}
@Subscribe
public void onProjectReload(ProjectReloadEvent event) {
project = event.project;
loadData();
}
@Subscribe
public void onBuildChangedEvent(BuildChangedEvent event) {
adapterBuilds.updateBuild(event.build);
}
}
\ No newline at end of file
package com.commit451.gitlab.fragment
import android.net.Uri
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
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 butterknife.BindView
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.ProjectActivity
import com.commit451.gitlab.adapter.BuildAdapter
import com.commit451.gitlab.adapter.DividerItemDecoration
import com.commit451.gitlab.event.BuildChangedEvent
import com.commit451.gitlab.event.ProjectReloadEvent
import com.commit451.gitlab.model.api.Build
import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.navigation.Navigator
import com.commit451.gitlab.rx.CustomResponseSingleObserver
import com.commit451.gitlab.util.LinkHeaderParser
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.Subscribe
import retrofit2.Response
import timber.log.Timber
/**
* Shows the builds of a project
*/
class BuildsFragment : ButterKnifeFragment() {
companion object {
fun newInstance(): BuildsFragment {
return BuildsFragment()
}
}
@BindView(R.id.root)
lateinit var root: ViewGroup
@BindView(R.id.swipe_layout)
lateinit var swipeRefreshLayout: SwipeRefreshLayout
@BindView(R.id.list)
lateinit var listBuilds: RecyclerView
@BindView(R.id.message_text)
lateinit var textMessage: TextView
@BindView(R.id.issue_spinner)
lateinit var spinnerIssue: Spinner
lateinit var adapterBuilds: BuildAdapter
lateinit var layoutManagerBuilds: LinearLayoutManager
var project: Project? = null
lateinit var scope: String
lateinit var scopes: Array<String>
var nextPageUrl: Uri? = null
var loading: Boolean = false
val onScrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val visibleItemCount = layoutManagerBuilds.childCount
val totalItemCount = layoutManagerBuilds.itemCount
val firstVisibleItem = layoutManagerBuilds.findFirstVisibleItemPosition()
if (firstVisibleItem + visibleItemCount >= totalItemCount && !loading && nextPageUrl != null) {
loadMore()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
scopes = resources.getStringArray(R.array.build_scope_values)
scope = scopes[0]
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_builds, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
App.bus().register(this)
adapterBuilds = BuildAdapter(BuildAdapter.Listener { build ->
if (project != null) {
Navigator.navigateToBuild(activity, project, build)
} else {
Snackbar.make(root, getString(R.string.wait_for_project_to_load), Snackbar.LENGTH_SHORT)
.show()
}
})
layoutManagerBuilds = LinearLayoutManager(activity)
listBuilds.layoutManager = layoutManagerBuilds
listBuilds.addItemDecoration(DividerItemDecoration(activity))
listBuilds.adapter = adapterBuilds
listBuilds.addOnScrollListener(onScrollListener)
spinnerIssue.adapter = ArrayAdapter(activity, android.R.layout.simple_list_item_1,
android.R.id.text1, resources.getStringArray(R.array.build_scope_names))
spinnerIssue.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
scope = scopes[position]
loadData()
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
}
swipeRefreshLayout.setOnRefreshListener { loadData() }
if (activity is ProjectActivity) {
project = (activity as ProjectActivity).project
loadData()
} else {
throw IllegalStateException("Incorrect parent activity")
}
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
override fun loadData() {
if (view == null) {
return
}
if (project == null) {
swipeRefreshLayout.isRefreshing = false
return
}
textMessage.visibility = View.GONE
swipeRefreshLayout.isRefreshing = true
nextPageUrl = null
loading = true
App.get().gitLab.getBuilds(project!!.id, scope)
.compose(this.bindToLifecycle<Response<List<Build>>>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : CustomResponseSingleObserver<List<Build>>() {
override fun error(e: Throwable) {
loading = false
Timber.e(e)
swipeRefreshLayout.isRefreshing = false
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.failed_to_load_builds)
adapterBuilds.setValues(null)
nextPageUrl = null
}
override fun responseSuccess(builds: List<Build>) {
loading = false
swipeRefreshLayout.isRefreshing = false
if (builds.isEmpty()) {
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.no_builds)
}
adapterBuilds.setValues(builds)
nextPageUrl = LinkHeaderParser.parse(response()).next
Timber.d("Next page url %s", nextPageUrl)
}
})
}
fun loadMore() {
if (view == null) {
return
}
if (nextPageUrl == null) {
return
}
adapterBuilds.setLoading(true)
loading = true
Timber.d("loadMore called for %s", nextPageUrl)
App.get().gitLab.getBuilds(nextPageUrl!!.toString(), scope)
.compose(this.bindToLifecycle<Response<List<Build>>>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : CustomResponseSingleObserver<List<Build>>() {
override fun error(e: Throwable) {
Timber.e(e)
loading = false
adapterBuilds.setLoading(false)
}
override fun responseSuccess(builds: List<Build>) {
loading = false
adapterBuilds.setLoading(false)
nextPageUrl = LinkHeaderParser.parse(response()).next
adapterBuilds.addValues(builds)
}
})
}
@Subscribe
fun onProjectReload(event: ProjectReloadEvent) {
project = event.project
loadData()
}
@Subscribe
fun onBuildChangedEvent(event: BuildChangedEvent) {
adapterBuilds.updateBuild(event.build)
}
}
\ No newline at end of file
package com.commit451.gitlab.fragment;
import android.os.Bundle;
import android.view.View;
import butterknife.ButterKnife;
import butterknife.Unbinder;
/**
* Takes care of binding and unbinding
*/
public class ButterKnifeFragment extends BaseFragment {
private Unbinder unbinder;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
unbinder = ButterKnife.bind(this, view);
}
@Override
public void onDestroyView() {
unbinder.unbind();
super.onDestroyView();
}
}
package com.commit451.gitlab.fragment
import android.os.Bundle
import android.view.View
import butterknife.ButterKnife
import butterknife.Unbinder
/**
* Takes care of binding and unbinding
*/
open class ButterKnifeFragment : BaseFragment() {
var unbinder: Unbinder? = null
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
unbinder = ButterKnife.bind(this, view!!)
}
override fun onDestroyView() {
unbinder?.unbind()
super.onDestroyView()
}
}
package com.commit451.gitlab.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.commit451.gitlab.App;
import com.commit451.gitlab.R;
import com.commit451.gitlab.activity.ProjectActivity;
import com.commit451.gitlab.adapter.CommitAdapter;
import com.commit451.gitlab.adapter.DividerItemDecoration;
import com.commit451.gitlab.event.ProjectReloadEvent;
import com.commit451.gitlab.model.api.Project;
import com.commit451.gitlab.model.api.RepositoryCommit;
import com.commit451.gitlab.navigation.Navigator;
import com.commit451.gitlab.rx.CustomSingleObserver;
import org.greenrobot.eventbus.Subscribe;
import java.util.List;
import butterknife.BindView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
public class CommitsFragment extends ButterKnifeFragment {
public static CommitsFragment newInstance() {
return new CommitsFragment();
}
@BindView(R.id.swipe_layout)
SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.list)
RecyclerView listCommits;
@BindView(R.id.message_text)
TextView textMessage;
LinearLayoutManager layoutManagerCommits;
CommitAdapter adapterCommits;
Project project;
String branchName;
int page = -1;
boolean loading;
private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = layoutManagerCommits.getChildCount();
int totalItemCount = layoutManagerCommits.getItemCount();
int firstVisibleItem = layoutManagerCommits.findFirstVisibleItemPosition();
if (firstVisibleItem + visibleItemCount >= totalItemCount && !loading && page >= 0) {
loadMore();
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_commits, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
App.bus().register(this);
adapterCommits = new CommitAdapter(new CommitAdapter.Listener() {
@Override
public void onCommitClicked(RepositoryCommit commit) {
Navigator.navigateToDiffActivity(getActivity(), project, commit);
}
});
layoutManagerCommits = new LinearLayoutManager(getActivity());
listCommits.setLayoutManager(layoutManagerCommits);
listCommits.addItemDecoration(new DividerItemDecoration(getActivity()));
listCommits.setAdapter(adapterCommits);
listCommits.addOnScrollListener(onScrollListener);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData();
}
});
if (getActivity() instanceof ProjectActivity) {
project = ((ProjectActivity) getActivity()).getProject();
branchName = ((ProjectActivity) getActivity()).getRefRef();
loadData();
} else {
throw new IllegalStateException("Incorrect parent activity");
}
}
@Override
public void onDestroyView() {
App.bus().unregister(this);
super.onDestroyView();
}
@Override
protected void loadData() {
if (getView() == null) {
return;
}
if (project == null || TextUtils.isEmpty(branchName)) {
swipeRefreshLayout.setRefreshing(false);
return;
}
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (swipeRefreshLayout != null) {
swipeRefreshLayout.setRefreshing(true);
}
}
});
page = 0;
loading = true;
App.get().getGitLab().getCommits(project.getId(), branchName, page)
.compose(this.<List<RepositoryCommit>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomSingleObserver<List<RepositoryCommit>>() {
@Override
public void error(@NonNull Throwable t) {
loading = false;
Timber.e(t);
swipeRefreshLayout.setRefreshing(false);
textMessage.setVisibility(View.VISIBLE);
textMessage.setText(R.string.connection_error_commits);
adapterCommits.setData(null);
page = -1;
}
@Override
public void success(@NonNull List<RepositoryCommit> repositoryCommits) {
loading = false;
swipeRefreshLayout.setRefreshing(false);
if (!repositoryCommits.isEmpty()) {
textMessage.setVisibility(View.GONE);
} else {
textMessage.setVisibility(View.VISIBLE);
textMessage.setText(R.string.no_commits_found);
}
adapterCommits.setData(repositoryCommits);
if (repositoryCommits.isEmpty()) {
page = -1;
}
}
});
}
private void loadMore() {
if (getView() == null) {
return;
}
if (project == null || TextUtils.isEmpty(branchName) || page < 0) {
return;
}
page++;
loading = true;
adapterCommits.setLoading(true);
Timber.d("loadMore called for %s", page);
App.get().getGitLab().getCommits(project.getId(), branchName, page)
.compose(this.<List<RepositoryCommit>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CustomSingleObserver<List<RepositoryCommit>>() {
@Override
public void error(@NonNull Throwable e) {
loading = false;
Timber.e(e);
adapterCommits.setLoading(false);
}
@Override
public void success(@NonNull List<RepositoryCommit> repositoryCommits) {
loading = false;
adapterCommits.setLoading(false);
if (repositoryCommits.isEmpty()) {
page = -1;
return;
}
adapterCommits.addData(repositoryCommits);
}
});
}
@Subscribe
public void onProjectReload(ProjectReloadEvent event) {
project = event.project;
branchName = event.branchName;
loadData();
}
}
\ No newline at end of file
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