Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Commit451/LabCoat
  • Iktwo/GitLabAndroid
  • jonduran3000/GitLabAndroid
  • steffandroid/GitLabAndroid
  • xiaoyanit/GitLabAndroid
  • scottolcott/GitLabAndroid
  • james.mu/GitLabAndroid
  • pushkarpandey27/GitLabAndroid
  • atomfrede/GitLabAndroid
  • burrito82/GitLabAndroid
  • txlong_onz/GitLabAndroid
  • ricardo.longa/GitLabAndroid
  • rubenroy/GitLabAndroid
  • remy_android/GitLabAndroid
  • mzestars/GitLabAndroid
  • theobisproject/LabCoat
  • tarek360/GitLabAndroid
  • TR4Android/LabCoat
  • lvsmart/LabCoat
  • buddybuild/LabCoat
  • tkuah/LabCoat
  • jay3126/LabCoat
  • rmad17/LabCoat
  • galvatron/LabCoat
  • lijianjian13/LabCoat
  • Cody2333/LabCoat
  • ajtfreitas/LabCoat
  • nestor.lobo/LabCoat
  • Microgamer/LabCoat
  • irvinwang/LabCoat
  • avallete/LabCoat
  • digicazter/LabCoat
  • lovexiaov/LabCoat
  • dineshkarpe/LabCoat
  • bak1an/LabCoat
  • loomis/LabCoat
  • sank20/LabCoat
  • Jawnnyfoo/LabCoat
  • scottyab/LabCoat
  • aleksandar-stefanovic/LabCoat
  • tfontana/LabCoat
  • fuzzmz/LabCoat
  • dipaksavaliya/LabCoat
  • adi.bk/LabCoat
  • andreea.voicu/LabCoat
  • H1ghT0p/LabCoat
  • indritqoku/LabCoat
  • armpogart/LabCoat
  • eyedol/LabCoat
  • khairulnizan/LabCoat
  • vadm.perspectiva/LabCoat
  • yiyoss1986/LabCoat
  • BRoy98/LabCoat
  • satyarth.23/LabCoat
  • victorpe76/LabCoat
  • canhnht/LabCoat
  • jinhu/LabCoat
  • weathery/LabCoat
  • gitlabproject_s/LabCoat
  • tfKamran/LabCoat
  • voxadam/LabCoat
  • nprail/LabCoat
  • terrakok/LabCoat
  • jungletian/LabCoat
  • goldins/LabCoat
  • insanum/LabCoat
  • lzrs/LabCoat
  • shankarg/LabCoat
  • rm3l/LabCoat
  • alamo_dev/LabCoat
  • insomniaqc/LabCoat
  • mrasif/LabCoat
  • Babasile/LabCoat
  • eeyoo/LabCoat
  • ditkin/LabCoat
  • unbubot/LabCoat
  • bschuhm/LabCoat
  • fanticker/LabCoat
  • colorwebdesigner/LabCoat
  • milouse/LabCoat
80 results
Show changes
Showing
with 812 additions and 84 deletions
Loading
@@ -4,7 +4,6 @@ import android.app.Activity.RESULT_OK
Loading
@@ -4,7 +4,6 @@ import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.support.design.widget.Snackbar import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
Loading
@@ -18,6 +17,8 @@ import com.commit451.gitlab.R
Loading
@@ -18,6 +17,8 @@ import com.commit451.gitlab.R
import com.commit451.gitlab.activity.AttachActivity import com.commit451.gitlab.activity.AttachActivity
import com.commit451.gitlab.adapter.MergeRequestDetailAdapter import com.commit451.gitlab.adapter.MergeRequestDetailAdapter
import com.commit451.gitlab.event.MergeRequestChangedEvent 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.extension.setup
import com.commit451.gitlab.model.api.FileUploadResponse import com.commit451.gitlab.model.api.FileUploadResponse
import com.commit451.gitlab.model.api.MergeRequest import com.commit451.gitlab.model.api.MergeRequest
Loading
@@ -31,7 +32,6 @@ import com.commit451.gitlab.view.SendMessageView
Loading
@@ -31,7 +32,6 @@ import com.commit451.gitlab.view.SendMessageView
import com.commit451.teleprinter.Teleprinter import com.commit451.teleprinter.Teleprinter
import com.trello.rxlifecycle2.android.FragmentEvent import com.trello.rxlifecycle2.android.FragmentEvent
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.parceler.Parcels
import timber.log.Timber import timber.log.Timber
   
/** /**
Loading
@@ -49,8 +49,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
Loading
@@ -49,8 +49,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
fun newInstance(project: Project, mergeRequest: MergeRequest): MergeRequestDiscussionFragment { fun newInstance(project: Project, mergeRequest: MergeRequest): MergeRequestDiscussionFragment {
val fragment = MergeRequestDiscussionFragment() val fragment = MergeRequestDiscussionFragment()
val args = Bundle() val args = Bundle()
args.putParcelable(KEY_PROJECT, Parcels.wrap(project)) args.putParcelParcelableExtra(KEY_PROJECT, project)
args.putParcelable(KEY_MERGE_REQUEST, Parcels.wrap(mergeRequest)) args.putParcelParcelableExtra(KEY_MERGE_REQUEST, mergeRequest)
fragment.arguments = args fragment.arguments = args
return fragment return fragment
} }
Loading
@@ -85,8 +85,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
Loading
@@ -85,8 +85,8 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
   
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
project = Parcels.unwrap<Project>(arguments.getParcelable<Parcelable>(KEY_PROJECT)) project = arguments.getParcelerParcelable<Project>(KEY_PROJECT)!!
mergeRequest = Parcels.unwrap<MergeRequest>(arguments.getParcelable<Parcelable>(KEY_MERGE_REQUEST)) mergeRequest = arguments.getParcelerParcelable<MergeRequest>(KEY_MERGE_REQUEST)!!
} }
   
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Loading
@@ -126,7 +126,7 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
Loading
@@ -126,7 +126,7 @@ class MergeRequestDiscussionFragment : ButterKnifeFragment() {
when (requestCode) { when (requestCode) {
REQUEST_ATTACH -> { REQUEST_ATTACH -> {
if (resultCode == RESULT_OK) { 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 progress.visibility = View.GONE
sendMessageView.appendText(response.markdown) sendMessageView.appendText(response.markdown)
} else { } else {
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
Loading
@@ -15,12 +14,13 @@ import com.commit451.gitlab.App
Loading
@@ -15,12 +14,13 @@ import com.commit451.gitlab.App
import com.commit451.gitlab.R import com.commit451.gitlab.R
import com.commit451.gitlab.activity.PickBranchOrTagActivity import com.commit451.gitlab.activity.PickBranchOrTagActivity
import com.commit451.gitlab.adapter.BranchAdapter 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.extension.setup
import com.commit451.gitlab.model.Ref import com.commit451.gitlab.model.Ref
import com.commit451.gitlab.model.api.Branch import com.commit451.gitlab.model.api.Branch
import com.commit451.gitlab.rx.CustomSingleObserver import com.commit451.gitlab.rx.CustomSingleObserver
import com.trello.rxlifecycle2.android.FragmentEvent import com.trello.rxlifecycle2.android.FragmentEvent
import org.parceler.Parcels
import timber.log.Timber import timber.log.Timber
   
/** /**
Loading
@@ -37,7 +37,7 @@ class PickBranchFragment : ButterKnifeFragment() {
Loading
@@ -37,7 +37,7 @@ class PickBranchFragment : ButterKnifeFragment() {
val fragment = PickBranchFragment() val fragment = PickBranchFragment()
val args = Bundle() val args = Bundle()
args.putLong(EXTRA_PROJECT_ID, projectId) args.putLong(EXTRA_PROJECT_ID, projectId)
args.putParcelable(EXTRA_REF, Parcels.wrap<Ref>(ref)) args.putParcelParcelableExtra(EXTRA_REF, ref)
fragment.arguments = args fragment.arguments = args
return fragment return fragment
} }
Loading
@@ -63,12 +63,12 @@ class PickBranchFragment : ButterKnifeFragment() {
Loading
@@ -63,12 +63,12 @@ class PickBranchFragment : ButterKnifeFragment() {
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) 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 { adapterBranches = BranchAdapter(existingRef, object : BranchAdapter.Listener {
override fun onBranchClicked(entry: Branch) { override fun onBranchClicked(entry: Branch) {
val data = Intent() val data = Intent()
val ref = Ref(Ref.TYPE_BRANCH, entry.name) 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.setResult(Activity.RESULT_OK, data)
activity.finish() activity.finish()
} }
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
Loading
@@ -15,6 +14,8 @@ import com.commit451.gitlab.App
Loading
@@ -15,6 +14,8 @@ import com.commit451.gitlab.App
import com.commit451.gitlab.R import com.commit451.gitlab.R
import com.commit451.gitlab.activity.PickBranchOrTagActivity import com.commit451.gitlab.activity.PickBranchOrTagActivity
import com.commit451.gitlab.adapter.TagAdapter 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.extension.setup
import com.commit451.gitlab.model.Ref import com.commit451.gitlab.model.Ref
import com.commit451.gitlab.model.api.Tag import com.commit451.gitlab.model.api.Tag
Loading
@@ -37,7 +38,7 @@ class PickTagFragment : ButterKnifeFragment() {
Loading
@@ -37,7 +38,7 @@ class PickTagFragment : ButterKnifeFragment() {
val fragment = PickTagFragment() val fragment = PickTagFragment()
val args = Bundle() val args = Bundle()
args.putLong(EXTRA_PROJECT_ID, projectId) args.putLong(EXTRA_PROJECT_ID, projectId)
args.putParcelable(EXTRA_CURRENT_REF, Parcels.wrap<Ref>(ref)) args.putParcelParcelableExtra(EXTRA_CURRENT_REF, ref)
fragment.arguments = args fragment.arguments = args
return fragment return fragment
} }
Loading
@@ -63,12 +64,12 @@ class PickTagFragment : ButterKnifeFragment() {
Loading
@@ -63,12 +64,12 @@ class PickTagFragment : ButterKnifeFragment() {
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) 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 { adapterTags = TagAdapter(ref, object : TagAdapter.Listener {
override fun onTagClicked(entry: Tag) { override fun onTagClicked(entry: Tag) {
val data = Intent() val data = Intent()
val newRef = Ref(Ref.TYPE_TAG, entry.name) 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.setResult(Activity.RESULT_OK, data)
activity.finish() 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
@@ -5,7 +5,6 @@ import android.os.Bundle
Loading
@@ -5,7 +5,6 @@ import android.os.Bundle
import android.support.design.widget.Snackbar import android.support.design.widget.Snackbar
import android.support.v4.widget.SwipeRefreshLayout import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
import android.text.Html
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
Loading
@@ -13,17 +12,18 @@ import android.widget.TextView
Loading
@@ -13,17 +12,18 @@ import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import com.commit451.gitlab.App import com.commit451.gitlab.App
import com.commit451.gitlab.BuildConfig
import com.commit451.gitlab.R import com.commit451.gitlab.R
import com.commit451.gitlab.activity.ProjectActivity import com.commit451.gitlab.activity.ProjectActivity
import com.commit451.gitlab.event.ProjectReloadEvent 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.extension.setup
import com.commit451.gitlab.model.api.Project import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.model.api.RepositoryFile import com.commit451.gitlab.model.api.RepositoryFile
import com.commit451.gitlab.model.api.RepositoryTreeObject import com.commit451.gitlab.model.api.RepositoryTreeObject
import com.commit451.gitlab.navigation.Navigator import com.commit451.gitlab.navigation.Navigator
import com.commit451.gitlab.rx.CustomSingleObserver 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.BypassImageGetterFactory
import com.commit451.gitlab.util.InternalLinkMovementMethod import com.commit451.gitlab.util.InternalLinkMovementMethod
import com.commit451.reptar.Result import com.commit451.reptar.Result
Loading
@@ -33,7 +33,6 @@ import io.reactivex.Single
Loading
@@ -33,7 +33,6 @@ import io.reactivex.Single
import io.reactivex.SingleSource import io.reactivex.SingleSource
import io.reactivex.functions.Function import io.reactivex.functions.Function
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import retrofit2.HttpException
import retrofit2.Response import retrofit2.Response
import timber.log.Timber import timber.log.Timber
   
Loading
@@ -84,7 +83,7 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -84,7 +83,7 @@ class ProjectFragment : ButterKnifeFragment() {
.setTitle(R.string.project_fork_title) .setTitle(R.string.project_fork_title)
.setMessage(R.string.project_fork_message) .setMessage(R.string.project_fork_message)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok) { dialog, which -> .setPositiveButton(android.R.string.ok) { _, _ ->
App.get().gitLab.forkProject(it.id) App.get().gitLab.forkProject(it.id)
.setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) .setup(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe(object : CustomSingleObserver<String>() { .subscribe(object : CustomSingleObserver<String>() {
Loading
@@ -112,21 +111,19 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -112,21 +111,19 @@ class ProjectFragment : ButterKnifeFragment() {
.subscribe(object : CustomSingleObserver<Response<Project>>() { .subscribe(object : CustomSingleObserver<Response<Project>>() {
   
override fun error(t: Throwable) { 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) Snackbar.make(swipeRefreshLayout, R.string.project_star_failed, Snackbar.LENGTH_SHORT)
.show() .show()
} }
   
override fun success(projectResponse: Response<Project>) { override fun success(projectResponse: Response<Project>) {
Snackbar.make(swipeRefreshLayout, R.string.project_starred, Snackbar.LENGTH_SHORT) if (projectResponse.raw().code() == 304) {
.show() 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
@@ -134,13 +131,6 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -134,13 +131,6 @@ class ProjectFragment : ButterKnifeFragment() {
   
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) 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? { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Loading
@@ -159,6 +149,7 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -159,6 +149,7 @@ class ProjectFragment : ButterKnifeFragment() {
if (activity is ProjectActivity) { if (activity is ProjectActivity) {
project = (activity as ProjectActivity).project project = (activity as ProjectActivity).project
branchName = (activity as ProjectActivity).getRefRef() branchName = (activity as ProjectActivity).getRefRef()
bypass = BypassFactory.create(context, project!!)
bindProject(project) bindProject(project)
loadData() loadData()
} else { } else {
Loading
@@ -204,7 +195,7 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -204,7 +195,7 @@ class ProjectFragment : ButterKnifeFragment() {
}) })
.flatMap(Function<Result<RepositoryFile>, SingleSource<ReadmeResult>> { repositoryFileResult -> .flatMap(Function<Result<RepositoryFile>, SingleSource<ReadmeResult>> { repositoryFileResult ->
if (repositoryFileResult.isPresent) { if (repositoryFileResult.isPresent) {
result.bytes = DecodeObservableFactory.newDecode(repositoryFileResult.get().content) result.bytes = repositoryFileResult.get().content.base64Decode()
.blockingGet() .blockingGet()
return@Function Single.just(result) return@Function Single.just(result)
} }
Loading
@@ -232,7 +223,7 @@ class ProjectFragment : ButterKnifeFragment() {
Loading
@@ -232,7 +223,7 @@ class ProjectFragment : ButterKnifeFragment() {
App.get().getAccount().serverUrl.toString(), App.get().getAccount().serverUrl.toString(),
project!!)) project!!))
} }
README_TYPE_HTML -> textOverview.text = Html.fromHtml(text) README_TYPE_HTML -> textOverview.text = text.formatAsHtml()
README_TYPE_TEXT -> textOverview.text = text README_TYPE_TEXT -> textOverview.text = text
README_TYPE_NO_EXTENSION -> textOverview.text = text README_TYPE_NO_EXTENSION -> textOverview.text = text
} }
Loading
Loading
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
Loading
@@ -3,7 +3,6 @@ package com.commit451.gitlab.fragment
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.support.v4.widget.SwipeRefreshLayout import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
Loading
@@ -17,6 +16,8 @@ import com.commit451.gitlab.R
Loading
@@ -17,6 +16,8 @@ import com.commit451.gitlab.R
import com.commit451.gitlab.adapter.DividerItemDecoration import com.commit451.gitlab.adapter.DividerItemDecoration
import com.commit451.gitlab.adapter.ProjectAdapter import com.commit451.gitlab.adapter.ProjectAdapter
import com.commit451.gitlab.api.GitLabService 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.extension.setup
import com.commit451.gitlab.model.api.Group import com.commit451.gitlab.model.api.Group
import com.commit451.gitlab.model.api.Project import com.commit451.gitlab.model.api.Project
Loading
@@ -25,7 +26,6 @@ import com.commit451.gitlab.rx.CustomResponseSingleObserver
Loading
@@ -25,7 +26,6 @@ import com.commit451.gitlab.rx.CustomResponseSingleObserver
import com.commit451.gitlab.util.LinkHeaderParser import com.commit451.gitlab.util.LinkHeaderParser
import com.trello.rxlifecycle2.android.FragmentEvent import com.trello.rxlifecycle2.android.FragmentEvent
import io.reactivex.Single import io.reactivex.Single
import org.parceler.Parcels
import retrofit2.Response import retrofit2.Response
import timber.log.Timber import timber.log.Timber
   
Loading
@@ -64,7 +64,7 @@ class ProjectsFragment : ButterKnifeFragment() {
Loading
@@ -64,7 +64,7 @@ class ProjectsFragment : ButterKnifeFragment() {
fun newInstance(group: Group): ProjectsFragment { fun newInstance(group: Group): ProjectsFragment {
val args = Bundle() val args = Bundle()
args.putInt(EXTRA_MODE, MODE_GROUP) args.putInt(EXTRA_MODE, MODE_GROUP)
args.putParcelable(EXTRA_GROUP, Parcels.wrap(group)) args.putParcelParcelableExtra(EXTRA_GROUP, group)
val fragment = ProjectsFragment() val fragment = ProjectsFragment()
fragment.arguments = args fragment.arguments = args
return fragment return fragment
Loading
@@ -160,7 +160,7 @@ class ProjectsFragment : ButterKnifeFragment() {
Loading
@@ -160,7 +160,7 @@ class ProjectsFragment : ButterKnifeFragment() {
} }
MODE_GROUP -> { MODE_GROUP -> {
showLoading() 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)) actuallyLoadIt(getGitLab().getGroupProjects(group.id))
} }
else -> throw IllegalStateException(mode.toString() + " is not defined") else -> throw IllegalStateException(mode.toString() + " is not defined")
Loading
Loading
Loading
@@ -32,6 +32,8 @@ public class Build {
Loading
@@ -32,6 +32,8 @@ public class Build {
String ref; String ref;
@JsonField(name = "runner") @JsonField(name = "runner")
Runner runner; Runner runner;
@JsonField(name = "pipeline")
Pipeline pipeline;
@JsonField(name = "stage") @JsonField(name = "stage")
String stage; String stage;
@JsonField(name = "started_at") @JsonField(name = "started_at")
Loading
@@ -79,6 +81,10 @@ public class Build {
Loading
@@ -79,6 +81,10 @@ public class Build {
return runner; return runner;
} }
   
public Pipeline getPipeline() {
return pipeline;
}
public String getStage() { public String getStage() {
return stage; 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
@@ -15,11 +15,7 @@ import java.lang.ref.WeakReference
Loading
@@ -15,11 +15,7 @@ import java.lang.ref.WeakReference
*/ */
class BrowserFallback(context: Context) : NavigationFallback { class BrowserFallback(context: Context) : NavigationFallback {
   
private val context: WeakReference<Context> private val context: WeakReference<Context> = WeakReference(context)
init {
this.context = WeakReference(context)
}
   
override fun onFallbackNavigateTo(url: Uri) { override fun onFallbackNavigateTo(url: Uri) {
val intent = Intent(Intent.ACTION_VIEW) val intent = Intent(Intent.ACTION_VIEW)
Loading
Loading
Loading
@@ -13,11 +13,7 @@ import java.lang.ref.WeakReference
Loading
@@ -13,11 +13,7 @@ import java.lang.ref.WeakReference
*/ */
class LabCoatIntentCustomizer(activity: Activity, private val colorToolbar: Int) : IntentCustomizer { class LabCoatIntentCustomizer(activity: Activity, private val colorToolbar: Int) : IntentCustomizer {
   
private val activity: WeakReference<Activity> private val activity: WeakReference<Activity> = WeakReference(activity)
init {
this.activity = WeakReference(activity)
}
   
override fun onCustomiseIntent(simpleChromeCustomTabsIntentBuilder: SimpleChromeCustomTabsIntentBuilder): SimpleChromeCustomTabsIntentBuilder { override fun onCustomiseIntent(simpleChromeCustomTabsIntentBuilder: SimpleChromeCustomTabsIntentBuilder): SimpleChromeCustomTabsIntentBuilder {
val activity = this.activity.get() ?: return simpleChromeCustomTabsIntentBuilder val activity = this.activity.get() ?: return simpleChromeCustomTabsIntentBuilder
Loading
Loading
Loading
@@ -196,6 +196,10 @@ object Navigator {
Loading
@@ -196,6 +196,10 @@ object Navigator {
val intent = BuildActivity.newIntent(activity, project, build) val intent = BuildActivity.newIntent(activity, project, build)
activity.startActivity(intent) 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) { fun navigateToAttach(activity: Activity, project: Project, requestCode: Int) {
val intent = AttachActivity.newIntent(activity, project) 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
@@ -46,14 +46,14 @@ class CustomTrustManager : X509TrustManager {
Loading
@@ -46,14 +46,14 @@ class CustomTrustManager : X509TrustManager {
   
@Throws(CertificateException::class) @Throws(CertificateException::class)
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) { override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
X509TrustManagerProvider.get().checkClientTrusted(chain, authType) X509TrustManagerProvider.x509TrustManager.checkClientTrusted(chain, authType)
} }
   
@Throws(CertificateException::class) @Throws(CertificateException::class)
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) { override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
val cause: CertificateException val cause: CertificateException
try { try {
X509TrustManagerProvider.get().checkServerTrusted(chain, authType) X509TrustManagerProvider.x509TrustManager.checkServerTrusted(chain, authType)
return return
} catch (e: CertificateException) { } catch (e: CertificateException) {
cause = e cause = e
Loading
@@ -67,7 +67,7 @@ class CustomTrustManager : X509TrustManager {
Loading
@@ -67,7 +67,7 @@ class CustomTrustManager : X509TrustManager {
} }
   
override fun getAcceptedIssuers(): Array<X509Certificate> { override fun getAcceptedIssuers(): Array<X509Certificate> {
return X509TrustManagerProvider.get().acceptedIssuers return X509TrustManagerProvider.x509TrustManager.acceptedIssuers
} }
   
fun getSSLSocketFactory(): SSLSocketFactory { fun getSSLSocketFactory(): SSLSocketFactory {
Loading
Loading
Loading
@@ -22,7 +22,7 @@ public final class X509Util {
Loading
@@ -22,7 +22,7 @@ public final class X509Util {
return hexify(digest.digest()); return hexify(digest.digest());
} }
   
private static String hexify(byte[] bytes) { public static String hexify(byte[] bytes) {
char[] hexChars = new char[bytes.length * 3]; char[] hexChars = new char[bytes.length * 3];
for (int i = 0; i < bytes.length; i++) { for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF; 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
@@ -4,8 +4,11 @@ package com.commit451.gitlab.util
Loading
@@ -4,8 +4,11 @@ package com.commit451.gitlab.util
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Environment
import android.provider.MediaStore import android.provider.MediaStore
import android.provider.OpenableColumns import android.provider.OpenableColumns
import android.support.v4.content.FileProvider
import com.commit451.okyo.Okyo
import okhttp3.MediaType import okhttp3.MediaType
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
Loading
@@ -45,18 +48,51 @@ object FileUtil {
Loading
@@ -45,18 +48,51 @@ object FileUtil {
} }
   
fun getFileName(context: Context, imageUri: Uri): String { 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 val returnCursor = context.contentResolver.query(imageUri, null, null, null, null)
return "file" var name = "file"
   
var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE) if (returnCursor != null) {
if (nameIndex == -1) { var nameIndex = returnCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) if (nameIndex == -1) {
} nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
returnCursor.moveToFirst() }
val name = returnCursor.getString(nameIndex) returnCursor.moveToFirst()
if (!returnCursor.isClosed) { name = returnCursor.getString(nameIndex)
returnCursor.close() if (!returnCursor.isClosed) {
returnCursor.close()
}
} }
return name 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
}
} }