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

Merge remote-tracking branch 'origin/develop'

parents 8675a0f4 8b71a5d0
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 812 additions and 84 deletions
Loading
Loading
@@ -4,7 +4,6 @@ import android.app.Activity.RESULT_OK
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
Loading
Loading
@@ -18,6 +17,8 @@ import com.commit451.gitlab.R
import com.commit451.gitlab.activity.AttachActivity
import com.commit451.gitlab.adapter.MergeRequestDetailAdapter
import com.commit451.gitlab.event.MergeRequestChangedEvent
import com.commit451.gitlab.extension.getParcelerParcelable
import com.commit451.gitlab.extension.putParcelParcelableExtra
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.FileUploadResponse
import com.commit451.gitlab.model.api.MergeRequest
Loading
Loading
@@ -31,7 +32,6 @@ import com.commit451.gitlab.view.SendMessageView
import com.commit451.teleprinter.Teleprinter
import com.trello.rxlifecycle2.android.FragmentEvent
import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber
 
/**
Loading
Loading
@@ -49,8 +49,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
fun newInstance(project: Project, mergeRequest: MergeRequest): MergeRequestDiscussionFragment {
val fragment = MergeRequestDiscussionFragment()
val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project))
args.putParcelable(KEY_MERGE_REQUEST, Parcels.wrap(mergeRequest))
args.putParcelParcelableExtra(KEY_PROJECT, project)
args.putParcelParcelableExtra(KEY_MERGE_REQUEST, mergeRequest)
fragment.arguments = args
return fragment
}
Loading
Loading
@@ -85,8 +85,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
 
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT))
mergeRequest = Parcels.unwrap<MergeRequest>(arguments.getParcelable<Parcelable>(KEY_MERGE_REQUEST))
project = arguments.getParcelerParcelable<Project>(KEY_PROJECT)!!
mergeRequest = arguments.getParcelerParcelable<MergeRequest>(KEY_MERGE_REQUEST)!!
}
 
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Loading
Loading
@@ -126,7 +126,7 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
when (requestCode) {
REQUEST_ATTACH -> {
if (resultCode == RESULT_OK) {
val response = Parcels.unwrap<FileUploadResponse>(data!!.getParcelableExtra<Parcelable>(AttachActivity.KEY_FILE_UPLOAD_RESPONSE))
val response = data!!.getParcelerParcelable<FileUploadResponse>(AttachActivity.KEY_FILE_UPLOAD_RESPONSE)!!
progress.visibility = View.GONE
sendMessageView.appendText(response.markdown)
} else {
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
Loading
Loading
@@ -15,12 +14,13 @@ import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.PickBranchOrTagActivity
import com.commit451.gitlab.adapter.BranchAdapter
import com.commit451.gitlab.extension.getParcelerParcelable
import com.commit451.gitlab.extension.putParcelParcelableExtra
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.Ref
import com.commit451.gitlab.model.api.Branch
import com.commit451.gitlab.rx.CustomSingleObserver
import com.trello.rxlifecycle2.android.FragmentEvent
import org.parceler.Parcels
import timber.log.Timber
 
/**
Loading
Loading
@@ -37,7 +37,7 @@ class PickBranchFragment : ButterKnifeFragment() {
val fragment = PickBranchFragment()
val args = Bundle()
args.putLong(EXTRA_PROJECT_ID, projectId)
args.putParcelable(EXTRA_REF, Parcels.wrap<Ref>(ref))
args.putParcelParcelableExtra(EXTRA_REF, ref)
fragment.arguments = args
return fragment
}
Loading
Loading
@@ -63,12 +63,12 @@ class PickBranchFragment : ButterKnifeFragment() {
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
 
val existingRef = Parcels.unwrap<Ref>(arguments.getParcelable<Parcelable>(EXTRA_REF))
val existingRef = arguments.getParcelerParcelable<Ref>(EXTRA_REF)
adapterBranches = BranchAdapter(existingRef, object : BranchAdapter.Listener {
override fun onBranchClicked(entry: Branch) {
val data = Intent()
val ref = Ref(Ref.TYPE_BRANCH, entry.name)
data.putExtra(PickBranchOrTagActivity.EXTRA_REF, Parcels.wrap(ref))
data.putParcelParcelableExtra(PickBranchOrTagActivity.EXTRA_REF, ref)
activity.setResult(Activity.RESULT_OK, data)
activity.finish()
}
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
Loading
Loading
@@ -15,6 +14,8 @@ import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.PickBranchOrTagActivity
import com.commit451.gitlab.adapter.TagAdapter
import com.commit451.gitlab.extension.getParcelerParcelable
import com.commit451.gitlab.extension.putParcelParcelableExtra
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.Ref
import com.commit451.gitlab.model.api.Tag
Loading
Loading
@@ -37,7 +38,7 @@ class PickTagFragment : ButterKnifeFragment() {
val fragment = PickTagFragment()
val args = Bundle()
args.putLong(EXTRA_PROJECT_ID, projectId)
args.putParcelable(EXTRA_CURRENT_REF, Parcels.wrap<Ref>(ref))
args.putParcelParcelableExtra(EXTRA_CURRENT_REF, ref)
fragment.arguments = args
return fragment
}
Loading
Loading
@@ -63,12 +64,12 @@ class PickTagFragment : ButterKnifeFragment() {
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
 
val ref = Parcels.unwrap<Ref>(arguments.getParcelable<Parcelable>(EXTRA_CURRENT_REF))
val ref = arguments.getParcelerParcelable<Ref>(EXTRA_CURRENT_REF)
adapterTags = TagAdapter(ref, object : TagAdapter.Listener {
override fun onTagClicked(entry: Tag) {
val data = Intent()
val newRef = Ref(Ref.TYPE_TAG, entry.name)
data.putExtra(PickBranchOrTagActivity.EXTRA_REF, Parcels.wrap(newRef))
data.putParcelParcelableExtra(PickBranchOrTagActivity.EXTRA_REF, newRef)
activity.setResult(Activity.RESULT_OK, data)
activity.finish()
}
Loading
Loading
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.PipelineChangedEvent
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.*
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.DateUtil
import com.trello.rxlifecycle2.android.FragmentEvent
import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber
import java.util.*
/**
* Shows the details of a pipeline
*/
class PipelineDescriptionFragment : ButterKnifeFragment() {
companion object {
private val KEY_PROJECT = "project"
private val KEY_PIPELINE = "pipeline"
fun newInstance(project: Project, pipeline: Pipeline): PipelineDescriptionFragment {
val fragment = PipelineDescriptionFragment()
val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project))
args.putParcelable(KEY_PIPELINE, Parcels.wrap(pipeline))
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_number) lateinit var textName: TextView
@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_ref) lateinit var textRef: TextView
@BindView(R.id.text_sha) lateinit var textSha: 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 pipeline: Pipeline
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT))
pipeline = Parcels.unwrap<Pipeline>(arguments.getParcelable<Parcelable>(KEY_PIPELINE))
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_pipeline_description, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout.setOnRefreshListener { load() }
bindPipeline(pipeline)
App.bus().register(this)
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
fun load() {
App.get().gitLab.getPipeline(project.id, pipeline.id)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomSingleObserver<Pipeline>() {
override fun error(t: Throwable) {
Timber.e(t)
Snackbar.make(root, R.string.unable_to_load_pipeline, Snackbar.LENGTH_LONG)
.show()
}
override fun success(pipeline: Pipeline) {
swipeRefreshLayout.isRefreshing = false
this@PipelineDescriptionFragment.pipeline = pipeline
bindPipeline(pipeline)
App.bus().post(PipelineChangedEvent(pipeline))
}
})
}
fun bindPipeline(pipeline: Pipeline) {
var finishedTime: Date? = pipeline.finishedAt
if (finishedTime == null) {
finishedTime = Date()
}
var startedTime: Date? = pipeline.startedAt
if (startedTime == null) {
startedTime = Date()
}
val status = String.format(getString(R.string.pipeline_status), pipeline.status)
textStatus.text = status
val name = String.format(getString(R.string.pipeline_name), pipeline.id)
textName.text = name
val created = String.format(getString(R.string.build_created), DateUtil.getRelativeTimeSpanString(activity, pipeline.createdAt))
textCreated.text = created
val finished = String.format(getString(R.string.pipeline_finished), pipeline.finishedAt)
textFinished.text = finished
val timeTaken = DateUtil.getTimeTaken(startedTime, finishedTime)
val duration = String.format(getString(R.string.pipeline_duration), timeTaken)
textDuration.text = duration
val ref = String.format(getString(R.string.pipeline_ref), pipeline.ref)
textRef.text = ref
val sha = String.format(getString(R.string.pipeline_sha), pipeline.sha)
textSha.text = sha
if (pipeline.finishedAt != null) {
val finished = String.format(getString(R.string.pipeline_finished), DateUtil.getRelativeTimeSpanString(activity, pipeline.finishedAt))
textFinished.text = finished
textFinished.visibility = View.VISIBLE
} else {
textFinished.visibility = View.GONE
}
if (pipeline.user != null) {
bindUser(pipeline.user)
}
}
fun bindUser(user: CommitUser) {
val authorText = String.format(getString(R.string.pipeline_commit_author), user.name)
textAuthor.text = authorText
}
@Subscribe
fun onPipelineChangedEvent(event: PipelineChangedEvent) {
if (pipeline.id == event.pipeline.id) {
pipeline = event.pipeline
bindPipeline(pipeline)
}
}
}
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.PipelineChangedEvent
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.*
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.DateUtil
import com.trello.rxlifecycle2.android.FragmentEvent
import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber
import java.util.*
/**
* Shows the details of a pipeline
*/
class PipelineJobsFragment : ButterKnifeFragment() {
companion object {
private val KEY_PROJECT = "project"
private val KEY_PIPELINE = "pipeline"
fun newInstance(project: Project, pipeline: Pipeline): PipelineJobsFragment {
val fragment = PipelineJobsFragment()
val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project))
args.putParcelable(KEY_PIPELINE, Parcels.wrap(pipeline))
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_number) lateinit var textName: TextView
@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_ref) lateinit var textRef: TextView
@BindView(R.id.text_sha) lateinit var textSha: 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 pipeline: Pipeline
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT))
pipeline = Parcels.unwrap<Pipeline>(arguments.getParcelable<Parcelable>(KEY_PIPELINE))
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_pipeline_description, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout.setOnRefreshListener { load() }
bindPipeline(pipeline)
App.bus().register(this)
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
fun load() {
App.get().gitLab.getPipeline(project.id, pipeline.id)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomSingleObserver<Pipeline>() {
override fun error(t: Throwable) {
Timber.e(t)
Snackbar.make(root, R.string.unable_to_load_pipeline, Snackbar.LENGTH_LONG)
.show()
}
override fun success(pipeline: Pipeline) {
swipeRefreshLayout.isRefreshing = false
this@PipelineJobsFragment.pipeline = pipeline
bindPipeline(pipeline)
App.bus().post(PipelineChangedEvent(pipeline))
}
})
}
fun bindPipeline(pipeline: Pipeline) {
var finishedTime: Date? = pipeline.finishedAt
if (finishedTime == null) {
finishedTime = Date()
}
var startedTime: Date? = pipeline.startedAt
if (startedTime == null) {
startedTime = Date()
}
val status = String.format(getString(R.string.pipeline_status), pipeline.status)
textStatus.text = status
val name = String.format(getString(R.string.pipeline_name), pipeline.id)
textName.text = name
val created = String.format(getString(R.string.build_created), DateUtil.getRelativeTimeSpanString(activity, pipeline.createdAt))
textCreated.text = created
val finished = String.format(getString(R.string.pipeline_finished), pipeline.finishedAt)
textFinished.text = finished
val timeTaken = DateUtil.getTimeTaken(startedTime, finishedTime)
val duration = String.format(getString(R.string.pipeline_duration), timeTaken)
textDuration.text = duration
val ref = String.format(getString(R.string.pipeline_ref), pipeline.ref)
textRef.text = ref
val sha = String.format(getString(R.string.pipeline_sha), pipeline.sha)
textSha.text = sha
if (pipeline.finishedAt != null) {
val finished = String.format(getString(R.string.pipeline_finished), DateUtil.getRelativeTimeSpanString(activity, pipeline.finishedAt))
textFinished.text = finished
textFinished.visibility = View.VISIBLE
} else {
textFinished.visibility = View.GONE
}
if (pipeline.user != null) {
bindUser(pipeline.user)
}
}
fun bindUser(user: CommitUser) {
val authorText = String.format(getString(R.string.pipeline_commit_author), user.name)
textAuthor.text = authorText
}
@Subscribe
fun onPipelineChangedEvent(event: PipelineChangedEvent) {
if (pipeline.id == event.pipeline.id) {
pipeline = event.pipeline
bindPipeline(pipeline)
}
}
}
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.PipelineAdapter
import com.commit451.gitlab.adapter.DividerItemDecoration
import com.commit451.gitlab.event.PipelineChangedEvent
import com.commit451.gitlab.event.ProjectReloadEvent
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.Pipeline
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 com.trello.rxlifecycle2.android.FragmentEvent
import org.greenrobot.eventbus.Subscribe
import timber.log.Timber
/**
* Shows the pipelines of a project
*/
class PipelinesFragment : ButterKnifeFragment() {
companion object {
fun newInstance(): PipelinesFragment {
return PipelinesFragment()
}
}
@BindView(R.id.root) lateinit var root: ViewGroup
@BindView(R.id.swipe_layout) lateinit var swipeRefreshLayout: SwipeRefreshLayout
@BindView(R.id.list) lateinit var listPipelines: RecyclerView
@BindView(R.id.message_text) lateinit var textMessage: TextView
@BindView(R.id.issue_spinner) lateinit var spinnerIssue: Spinner
lateinit var adapterPipelines: PipelineAdapter
lateinit var layoutManagerPipelines: LinearLayoutManager
lateinit var scopes: Array<String>
var scope: String? = null
var project: Project? = null
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 = layoutManagerPipelines.childCount
val totalItemCount = layoutManagerPipelines.itemCount
val firstVisibleItem = layoutManagerPipelines.findFirstVisibleItemPosition()
if (firstVisibleItem + visibleItemCount >= totalItemCount && !loading && nextPageUrl != null) {
loadMore()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
scopes = resources.getStringArray(R.array.pipeline_scope_values)
scope = scopes[0]
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_pipelines, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
App.bus().register(this)
adapterPipelines = PipelineAdapter(object : PipelineAdapter.Listener {
override fun onPipelinesClicked(pipeline: Pipeline) {
if (project != null) {
Navigator.navigateToPipeline(activity, project!!, pipeline)
} else {
Snackbar.make(root, getString(R.string.wait_for_project_to_load), Snackbar.LENGTH_SHORT)
.show()
}
}
})
layoutManagerPipelines = LinearLayoutManager(activity)
listPipelines.layoutManager = layoutManagerPipelines
listPipelines.addItemDecoration(DividerItemDecoration(activity))
listPipelines.adapter = adapterPipelines
listPipelines.addOnScrollListener(onScrollListener)
spinnerIssue.adapter = ArrayAdapter(activity, android.R.layout.simple_list_item_1,
android.R.id.text1, resources.getStringArray(R.array.pipeline_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() {
textMessage.visibility = View.GONE
swipeRefreshLayout.isRefreshing = true
nextPageUrl = null
loading = true
App.get().gitLab.getPipelines(project!!.id, scope)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomResponseSingleObserver<List<Pipeline>>() {
override fun error(e: Throwable) {
loading = false
Timber.e(e)
swipeRefreshLayout.isRefreshing = false
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.failed_to_load_pipelines)
adapterPipelines.setValues(null)
nextPageUrl = null
}
override fun responseNonNullSuccess(pipelines: List<Pipeline>) {
loading = false
swipeRefreshLayout.isRefreshing = false
if (pipelines.isEmpty()) {
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.no_pipelines)
}
adapterPipelines.setValues(pipelines)
nextPageUrl = LinkHeaderParser.parse(response()).next
Timber.d("Next page url %s", nextPageUrl)
}
})
}
fun loadMore() {
if (nextPageUrl == null) {
return
}
adapterPipelines.setLoading(true)
loading = true
Timber.d("loadMore called for %s", nextPageUrl)
App.get().gitLab.getPipelines(nextPageUrl!!.toString(), scope)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomResponseSingleObserver<List<Pipeline>>() {
override fun error(e: Throwable) {
Timber.e(e)
loading = false
adapterPipelines.setLoading(false)
}
override fun responseNonNullSuccess(pipelines: List<Pipeline>) {
loading = false
adapterPipelines.setLoading(false)
nextPageUrl = LinkHeaderParser.parse(response()).next
adapterPipelines.addValues(pipelines)
}
})
}
@Subscribe
fun onEvent(event: ProjectReloadEvent) {
project = event.project
loadData()
}
@Subscribe
fun onEvent(event: PipelineChangedEvent) {
adapterPipelines.updatePipeline(event.pipeline)
}
}
\ No newline at end of file
Loading
Loading
@@ -5,7 +5,6 @@ import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.app.AlertDialog
import android.text.Html
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Loading
Loading
@@ -13,17 +12,18 @@ import android.widget.TextView
import butterknife.BindView
import butterknife.OnClick
import com.commit451.gitlab.App
import com.commit451.gitlab.BuildConfig
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.ProjectActivity
import com.commit451.gitlab.event.ProjectReloadEvent
import com.commit451.gitlab.extension.base64Decode
import com.commit451.gitlab.extension.formatAsHtml
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.model.api.RepositoryFile
import com.commit451.gitlab.model.api.RepositoryTreeObject
import com.commit451.gitlab.navigation.Navigator
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.rx.DecodeObservableFactory
import com.commit451.gitlab.util.BypassFactory
import com.commit451.gitlab.util.BypassImageGetterFactory
import com.commit451.gitlab.util.InternalLinkMovementMethod
import com.commit451.reptar.Result
Loading
Loading
@@ -33,7 +33,6 @@ import io.reactivex.Single
import io.reactivex.SingleSource
import io.reactivex.functions.Function
import org.greenrobot.eventbus.Subscribe
import retrofit2.HttpException
import retrofit2.Response
import timber.log.Timber
 
Loading
Loading
@@ -84,7 +83,7 @@ class ProjectFragment : ButterKnifeFragment() {
.setTitle(R.string.project_fork_title)
.setMessage(R.string.project_fork_message)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok) { dialog, which ->
.setPositiveButton(android.R.string.ok) { _, _ ->
App.get().gitLab.forkProject(it.id)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomSingleObserver<String>() {
Loading
Loading
@@ -112,21 +111,19 @@ class ProjectFragment : ButterKnifeFragment() {
.subscribe(object : CustomSingleObserver<Response<Project>>() {
 
override fun error(t: Throwable) {
if (t is HttpException) {
if (t.response().code() == 304) {
Snackbar.make(swipeRefreshLayout, R.string.project_already_starred, Snackbar.LENGTH_SHORT)
.setAction(R.string.project_unstar) { unstarProject() }
.show()
return
}
}
Snackbar.make(swipeRefreshLayout, R.string.project_star_failed, Snackbar.LENGTH_SHORT)
.show()
}
 
override fun success(projectResponse: Response<Project>) {
Snackbar.make(swipeRefreshLayout, R.string.project_starred, Snackbar.LENGTH_SHORT)
.show()
if (projectResponse.raw().code() == 304) {
Snackbar.make(swipeRefreshLayout, R.string.project_already_starred, Snackbar.LENGTH_LONG)
.setAction(R.string.project_unstar) { unstarProject() }
.show()
} else {
Snackbar.make(swipeRefreshLayout, R.string.project_starred, Snackbar.LENGTH_SHORT)
.show()
}
}
})
}
Loading
Loading
@@ -134,13 +131,6 @@ class ProjectFragment : ButterKnifeFragment() {
 
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bypass = Bypass(activity)
bypass.setImageSpanClickListener { view, imageSpan, s ->
if (BuildConfig.DEBUG) {
Snackbar.make(swipeRefreshLayout, s, Snackbar.LENGTH_LONG)
.show()
}
}
}
 
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Loading
Loading
@@ -159,6 +149,7 @@ class ProjectFragment : ButterKnifeFragment() {
if (activity is ProjectActivity) {
project = (activity as ProjectActivity).project
branchName = (activity as ProjectActivity).getRefRef()
bypass = BypassFactory.create(context, project!!)
bindProject(project)
loadData()
} else {
Loading
Loading
@@ -204,7 +195,7 @@ class ProjectFragment : ButterKnifeFragment() {
})
.flatMap(Function<Result<RepositoryFile>, SingleSource<ReadmeResult>> { repositoryFileResult ->
if (repositoryFileResult.isPresent) {
result.bytes = DecodeObservableFactory.newDecode(repositoryFileResult.get().content)
result.bytes = repositoryFileResult.get().content.base64Decode()
.blockingGet()
return@Function Single.just(result)
}
Loading
Loading
@@ -232,7 +223,7 @@ class ProjectFragment : ButterKnifeFragment() {
App.get().getAccount().serverUrl.toString(),
project!!))
}
README_TYPE_HTML -> textOverview.text = Html.fromHtml(text)
README_TYPE_HTML -> textOverview.text = text.formatAsHtml()
README_TYPE_TEXT -> textOverview.text = text
README_TYPE_NO_EXTENSION -> textOverview.text = text
}
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
Loading
Loading
@@ -17,6 +16,8 @@ import com.commit451.gitlab.R
import com.commit451.gitlab.adapter.DividerItemDecoration
import com.commit451.gitlab.adapter.ProjectAdapter
import com.commit451.gitlab.api.GitLabService
import com.commit451.gitlab.extension.getParcelerParcelable
import com.commit451.gitlab.extension.putParcelParcelableExtra
import com.commit451.gitlab.extension.setup
import com.commit451.gitlab.model.api.Group
import com.commit451.gitlab.model.api.Project
Loading
Loading
@@ -25,7 +26,6 @@ import com.commit451.gitlab.rx.CustomResponseSingleObserver
import com.commit451.gitlab.util.LinkHeaderParser
import com.trello.rxlifecycle2.android.FragmentEvent
import io.reactivex.Single
import org.parceler.Parcels
import retrofit2.Response
import timber.log.Timber
 
Loading
Loading
@@ -64,7 +64,7 @@ class ProjectsFragment : ButterKnifeFragment() {
fun newInstance(group: Group): ProjectsFragment {
val args = Bundle()
args.putInt(EXTRA_MODE, MODE_GROUP)
args.putParcelable(EXTRA_GROUP, Parcels.wrap(group))
args.putParcelParcelableExtra(EXTRA_GROUP, group)
val fragment = ProjectsFragment()
fragment.arguments = args
return fragment
Loading
Loading
@@ -160,7 +160,7 @@ class ProjectsFragment : ButterKnifeFragment() {
}
MODE_GROUP -> {
showLoading()
val group = Parcels.unwrap<Group>(arguments.getParcelable<Parcelable>(EXTRA_GROUP)) ?: throw IllegalStateException("You must also pass a group if you want to show a groups projects")
val group = arguments.getParcelerParcelable<Group>(EXTRA_GROUP) ?: throw IllegalStateException("You must also pass a group if you want to show a groups projects")
actuallyLoadIt(getGitLab().getGroupProjects(group.id))
}
else -> throw IllegalStateException(mode.toString() + " is not defined")
Loading
Loading
Loading
Loading
@@ -32,6 +32,8 @@ public class Build {
String ref;
@JsonField(name = "runner")
Runner runner;
@JsonField(name = "pipeline")
Pipeline pipeline;
@JsonField(name = "stage")
String stage;
@JsonField(name = "started_at")
Loading
Loading
@@ -79,6 +81,10 @@ public class Build {
return runner;
}
 
public Pipeline getPipeline() {
return pipeline;
}
public String getStage() {
return stage;
}
Loading
Loading
package com.commit451.gitlab.model.api;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.commit451.gitlab.util.ObjectUtil;
import org.parceler.Parcel;
import java.util.Date;
@Parcel
@JsonObject
public class CommitUser {
@JsonField(name = "id")
String id;
@JsonField(name = "name")
String name;
@JsonField(name = "username")
String username;
@JsonField(name = "state")
String state;
@JsonField(name = "avatar_url")
String avatarUrl;
@JsonField(name = "web_url")
String webUrl;
public CommitUser() {}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getUsername() {
return username;
}
public String getState() {
return state;
}
public String getAvatarUrl() {
return avatarUrl;
}
public String getWebUrl() {
return webUrl;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof CommitUser)) {
return false;
}
CommitUser commit = (CommitUser) o;
return ObjectUtil.INSTANCE.equals(id, commit.id);
}
@Override
public int hashCode() {
return ObjectUtil.INSTANCE.hash(id);
}
}
package com.commit451.gitlab.model.api;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.parceler.Parcel;
import java.util.Date;
/**
* A pipeline.
*/
@Parcel
@JsonObject
public class Pipeline {
@JsonField(name = "user")
CommitUser user;
@JsonField(name = "id")
long id;
@JsonField(name = "sha")
String sha;
@JsonField(name = "ref")
String ref;
@JsonField(name = "status")
String status;
@JsonField(name = "created_at")
Date createdAt;
@JsonField(name = "started_at")
Date startedAt;
@JsonField(name = "finished_at")
Date finishedAt;
public CommitUser getUser() {
return user;
}
public long getId() {
return id;
}
public String getSha() {
return sha;
}
public String getRef() {
return ref;
}
public String getStatus() {
return status;
}
public Date getCreatedAt() {
return createdAt;
}
public Date getStartedAt() { return startedAt; }
public Date getFinishedAt() { return finishedAt; }
}
package com.commit451.gitlab.model.api;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.parceler.Parcel;
import java.util.Date;
/**
* Represents a pipeline
*/
@Parcel
@JsonObject
public class Pipelines {
@JsonField(name = "sha")
String sha;
@JsonField(name = "id")
long id;
@JsonField(name = "ref")
String ref;
@JsonField(name = "status")
String status;
public long getId() {
return id;
}
public String getSha() {
return sha;
}
public String getRef() {
return ref;
}
public String getStatus() {
return status;
}
}
Loading
Loading
@@ -15,11 +15,7 @@ import java.lang.ref.WeakReference
*/
class BrowserFallback(context: Context) : NavigationFallback {
 
private val context: WeakReference<Context>
init {
this.context = WeakReference(context)
}
private val context: WeakReference<Context> = WeakReference(context)
 
override fun onFallbackNavigateTo(url: Uri) {
val intent = Intent(Intent.ACTION_VIEW)
Loading
Loading
Loading
Loading
@@ -13,11 +13,7 @@ import java.lang.ref.WeakReference
*/
class LabCoatIntentCustomizer(activity: Activity, private val colorToolbar: Int) : IntentCustomizer {
 
private val activity: WeakReference<Activity>
init {
this.activity = WeakReference(activity)
}
private val activity: WeakReference<Activity> = WeakReference(activity)
 
override fun onCustomiseIntent(simpleChromeCustomTabsIntentBuilder: SimpleChromeCustomTabsIntentBuilder): SimpleChromeCustomTabsIntentBuilder {
val activity = this.activity.get() ?: return simpleChromeCustomTabsIntentBuilder
Loading
Loading
Loading
Loading
@@ -196,6 +196,10 @@ object Navigator {
val intent = BuildActivity.newIntent(activity, project, build)
activity.startActivity(intent)
}
fun navigateToPipeline(activity: Activity, project: Project, pipeline: com.commit451.gitlab.model.api.Pipeline) {
val intent = PipelineActivity.newIntent(activity, project, pipeline)
activity.startActivity(intent)
}
 
fun navigateToAttach(activity: Activity, project: Project, requestCode: Int) {
val intent = AttachActivity.newIntent(activity, project)
Loading
Loading
package com.commit451.gitlab.rx
import android.util.Base64
import io.reactivex.Single
/**
* Observable that decodes a byte array
*/
object DecodeObservableFactory {
fun newDecode(string: String): Single<ByteArray> {
return Single.defer {
Single.just(Base64.decode(string, Base64.DEFAULT))
}
}
}
Loading
Loading
@@ -46,14 +46,14 @@ class CustomTrustManager : X509TrustManager {
 
@Throws(CertificateException::class)
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
X509TrustManagerProvider.get().checkClientTrusted(chain, authType)
X509TrustManagerProvider.x509TrustManager.checkClientTrusted(chain, authType)
}
 
@Throws(CertificateException::class)
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
val cause: CertificateException
try {
X509TrustManagerProvider.get().checkServerTrusted(chain, authType)
X509TrustManagerProvider.x509TrustManager.checkServerTrusted(chain, authType)
return
} catch (e: CertificateException) {
cause = e
Loading
Loading
@@ -67,7 +67,7 @@ class CustomTrustManager : X509TrustManager {
}
 
override fun getAcceptedIssuers(): Array<X509Certificate> {
return X509TrustManagerProvider.get().acceptedIssuers
return X509TrustManagerProvider.x509TrustManager.acceptedIssuers
}
 
fun getSSLSocketFactory(): SSLSocketFactory {
Loading
Loading
Loading
Loading
@@ -22,7 +22,7 @@ public final class X509Util {
return hexify(digest.digest());
}
 
private static String hexify(byte[] bytes) {
public static String hexify(byte[] bytes) {
char[] hexChars = new char[bytes.length * 3];
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF;
Loading
Loading
package com.commit451.gitlab.util
import `in`.uncod.android.bypass.Bypass
import android.content.Context
import com.commit451.gitlab.activity.FullscreenImageActivity
import com.commit451.gitlab.model.api.Project
/**
* Creates [BypassFactory]s which are configured to handle relative Urls
*/
object BypassFactory {
fun create(context: Context): Bypass {
return Bypass(context)
}
fun create(context: Context, project: Project): Bypass {
val bypass = Bypass(context)
bypass.setImageSpanClickListener { view, _, imageUrl ->
val intent = FullscreenImageActivity.newIntent(view.context, project, imageUrl)
context.startActivity(intent)
}
return bypass
}
}
\ No newline at end of file
Loading
Loading
@@ -4,8 +4,11 @@ package com.commit451.gitlab.util
import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import android.os.Environment
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.support.v4.content.FileProvider
import com.commit451.okyo.Okyo
import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.RequestBody
Loading
Loading
@@ -45,18 +48,51 @@ object FileUtil {
}
 
fun getFileName(context: Context, imageUri: Uri): String {
val returnCursor = context.contentResolver.query(imageUri, null, null, null, null) ?: //This should probably just return null, but oh well
return "file"
val returnCursor = context.contentResolver.query(imageUri, null, null, null, null)
var name = "file"
 
var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
if (nameIndex == -1) {
nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
}
returnCursor.moveToFirst()
val name = returnCursor.getString(nameIndex)
if (!returnCursor.isClosed) {
returnCursor.close()
if (returnCursor != null) {
var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
if (nameIndex == -1) {
nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
}
returnCursor.moveToFirst()
name = returnCursor.getString(nameIndex)
if (!returnCursor.isClosed) {
returnCursor.close()
}
}
return name
}
fun uriForFile(context: Context, file: File): Uri {
return FileProvider.getUriForFile(context, context.packageName + ".easyphotopicker.fileprovider", file)
}
@Throws(IOException::class)
fun saveBlobToProviderDirectory(context: Context, bytes: ByteArray, fileName: String): File {
val targetFile = File(getProviderDirectory(context), fileName)
targetFile.createNewFile()
Okyo.writeByteArrayToFile(bytes, targetFile)
return targetFile
}
/**
* Piggy back off of EasyImage directory
*/
fun getProviderDirectory(context: Context): File {
var cacheDir = context.cacheDir
if (isExternalStorageWritable()) {
cacheDir = context.externalCacheDir
}
val dir = File(cacheDir, "EasyImage")
if (!dir.exists()) dir.mkdirs()
return dir
}
fun isExternalStorageWritable(): Boolean {
val state = Environment.getExternalStorageState()
return Environment.MEDIA_MOUNTED == state
}
}
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