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

Merge remote-tracking branch 'origin/develop'

parents cbd7ebc0 f5eb33a1
No related branches found
No related tags found
No related merge requests found
Pipeline #
Showing
with 118 additions and 95 deletions
Loading
Loading
@@ -5,6 +5,7 @@ import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import com.commit451.gitlab.R
import com.commit451.gitlab.extension.feedUrl
import com.commit451.gitlab.fragment.FeedFragment
import com.commit451.gitlab.fragment.GroupMembersFragment
import com.commit451.gitlab.fragment.ProjectsFragment
Loading
Loading
package com.commit451.gitlab.adapter
 
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.ViewGroup
import com.commit451.gitlab.model.api.Issue
Loading
Loading
@@ -15,7 +14,7 @@ import java.util.*
/**
* Nice notes
*/
class IssueDetailsAdapter(context: Context, private var issue: Issue?, private val project: Project) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
class IssueDetailsAdapter(private var issue: Issue?, private val project: Project) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
 
companion object {
 
Loading
Loading
@@ -48,7 +47,7 @@ class IssueDetailsAdapter(context: Context, private var issue: Issue?, private v
if (holder is IssueHeaderViewHolder) {
holder.bind(issue!!, project)
} else if (holder is IssueLabelsViewHolder) {
holder.bind(issue!!.labels)
holder.bind(issue!!.labels!!)
} else if (holder is NoteViewHolder) {
val note = getNoteAt(position)
holder.bind(note, project)
Loading
Loading
@@ -98,7 +97,7 @@ class IssueDetailsAdapter(context: Context, private var issue: Issue?, private v
val oldLabels = this.issue!!.labels
this.issue = issue
notifyItemChanged(0)
if (oldLabels.size != this.issue!!.labels.size) {
if (oldLabels!!.size != this.issue!!.labels!!.size) {
notifyItemChanged(1)
}
}
Loading
Loading
Loading
Loading
@@ -6,8 +6,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import com.commit451.gitlab.R
import com.commit451.gitlab.model.api.Member
import com.commit451.gitlab.model.api.ProjectNamespace
import com.commit451.gitlab.model.api.User
import com.commit451.gitlab.viewHolder.ProjectMemberFooterViewHolder
import com.commit451.gitlab.viewHolder.ProjectMemberViewHolder
import java.util.*
Loading
Loading
@@ -25,7 +25,7 @@ class ProjectMembersAdapter(private val listener: ProjectMembersAdapter.Listener
val FOOTER_COUNT = 1
}
 
private val members: ArrayList<Member> = ArrayList()
private val members: ArrayList<User> = ArrayList()
private var namespace: ProjectNamespace? = null
 
val spanSizeLookup: GridLayoutManager.SpanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
Loading
Loading
@@ -100,12 +100,12 @@ class ProjectMembersAdapter(private val listener: ProjectMembersAdapter.Listener
}
}
 
fun setProjectMembers(data: Collection<Member>?) {
fun setProjectMembers(data: Collection<User>?) {
members.clear()
addProjectMembers(data)
}
 
fun addProjectMembers(data: Collection<Member>?) {
fun addProjectMembers(data: Collection<User>?) {
if (data != null) {
members.addAll(data)
}
Loading
Loading
@@ -117,25 +117,25 @@ class ProjectMembersAdapter(private val listener: ProjectMembersAdapter.Listener
notifyDataSetChanged()
}
 
fun getProjectMember(position: Int): Member {
fun getProjectMember(position: Int): User {
return members[position]
}
 
fun addMember(member: Member) {
fun addMember(member: User) {
members.add(0, member)
notifyItemInserted(0)
}
 
fun removeMember(member: Member) {
fun removeMember(member: User) {
val position = members.indexOf(member)
members.remove(member)
notifyItemRemoved(position)
}
 
interface Listener {
fun onProjectMemberClicked(member: Member, memberGroupViewHolder: ProjectMemberViewHolder)
fun onRemoveMember(member: Member)
fun onChangeAccess(member: Member)
fun onProjectMemberClicked(member: User, memberGroupViewHolder: ProjectMemberViewHolder)
fun onRemoveMember(member: User)
fun onChangeAccess(member: User)
fun onSeeGroupClicked()
}
}
Loading
Loading
@@ -5,7 +5,7 @@ import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.ProjectActivity
import com.commit451.gitlab.extension.getFeedUrl
import com.commit451.gitlab.extension.feedUrl
import com.commit451.gitlab.fragment.*
import com.commit451.gitlab.model.api.Project
import timber.log.Timber
Loading
Loading
@@ -74,7 +74,7 @@ class ProjectSectionsPagerAdapter(context: ProjectActivity, fm: FragmentManager)
 
when (correctPosition) {
PROJECT_POS -> return ProjectFragment.newInstance()
ACTIVITY_POS -> return FeedFragment.newInstance(project.getFeedUrl())
ACTIVITY_POS -> return FeedFragment.newInstance(project.feedUrl)
FILES_POS -> return FilesFragment.newInstance()
COMMITS_POS -> return CommitsFragment.newInstance()
PIPELINES_POS -> return PipelinesFragment.newInstance()
Loading
Loading
Loading
Loading
@@ -4,7 +4,7 @@ import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.ViewGroup
import com.commit451.gitlab.R
import com.commit451.gitlab.model.api.UserBasic
import com.commit451.gitlab.model.api.User
import com.commit451.gitlab.viewHolder.LoadingFooterViewHolder
import com.commit451.gitlab.viewHolder.UserViewHolder
import java.util.*
Loading
Loading
@@ -22,7 +22,7 @@ class UserAdapter(private val listener: UserAdapter.Listener) : RecyclerView.Ada
private val TYPE_FOOTER = 1
}
 
private val values: ArrayList<UserBasic> = ArrayList()
private val values: ArrayList<User> = ArrayList()
private var loading: Boolean = false
 
val spanSizeLookup: GridLayoutManager.SpanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
Loading
Loading
@@ -74,12 +74,12 @@ class UserAdapter(private val listener: UserAdapter.Listener) : RecyclerView.Ada
return values.size + FOOTER_COUNT
}
 
fun setData(users: Collection<UserBasic>?) {
fun setData(users: Collection<User>?) {
values.clear()
addData(users)
}
 
fun addData(users: Collection<UserBasic>?) {
fun addData(users: Collection<User>?) {
if (users != null) {
values.addAll(users)
}
Loading
Loading
@@ -96,11 +96,11 @@ class UserAdapter(private val listener: UserAdapter.Listener) : RecyclerView.Ada
notifyItemChanged(values.size)
}
 
private fun getUser(position: Int): UserBasic {
private fun getUser(position: Int): User {
return values[position]
}
 
interface Listener {
fun onUserClicked(user: UserBasic, userViewHolder: UserViewHolder)
fun onUserClicked(user: User, userViewHolder: UserViewHolder)
}
}
Loading
Loading
@@ -13,7 +13,7 @@ import retrofit2.converter.simplexml.SimpleXmlConverterFactory
object GitLabRssFactory {
 
fun create(account: Account, client: OkHttpClient): GitLabRss {
val persister = SimpleXmlPersisterFactory.createPersister(account)
val persister = SimpleXmlPersisterFactory.createPersister()
val restAdapter = Retrofit.Builder()
.baseUrl(account.serverUrl.toString())
.client(client)
Loading
Loading
package com.commit451.gitlab.api
 
import com.commit451.gitlab.api.request.SessionRequest
import com.commit451.gitlab.api.response.FileUploadResponse
import com.commit451.gitlab.model.api.*
import io.reactivex.Single
import okhttp3.MultipartBody
Loading
Loading
@@ -21,7 +22,7 @@ interface GitLabService {
/* --- LOGIN --- */
 
@POST(API_VERSION + "/session")
fun login(@Body request: SessionRequest): Single<Response<UserLogin>>
fun login(@Body request: SessionRequest): Single<Response<User>>
 
/* --- USERS --- */
 
Loading
Loading
@@ -29,19 +30,19 @@ interface GitLabService {
* Get currently authenticated user
*/
@GET(API_VERSION + "/user")
fun getThisUser(): Single<Response<UserFull>>
fun getThisUser(): Single<Response<User>>
 
@GET(API_VERSION + "/users")
fun getUsers(): Single<List<UserBasic>>
fun getUsers(): Single<List<User>>
 
@GET
fun getUsers(@Url url: String): Single<List<UserBasic>>
fun getUsers(@Url url: String): Single<List<User>>
 
@GET(API_VERSION + "/users")
fun searchUsers(@Query("search") query: String): Single<Response<List<UserBasic>>>
fun searchUsers(@Query("search") query: String): Single<Response<List<User>>>
 
@GET
fun searchUsers(@Url url: String, @Query("search") query: String): Single<Response<List<UserBasic>>>
fun searchUsers(@Url url: String, @Query("search") query: String): Single<Response<List<User>>>
 
@GET(API_VERSION + "/users/{id}")
fun getUser(@Path("id") userId: Long): Single<User>
Loading
Loading
@@ -54,25 +55,25 @@ interface GitLabService {
fun getGroups(@Url url: String): Single<Response<List<Group>>>
 
@GET(API_VERSION + "/groups/{id}")
fun getGroup(@Path("id") id: Long): Single<GroupDetail>
fun getGroup(@Path("id") id: Long): Single<Group>
 
@GET(API_VERSION + "/groups/{id}/projects?order_by=last_activity_at")
fun getGroupProjects(@Path("id") id: Long): Single<Response<List<Project>>>
 
@GET(API_VERSION + "/groups/{id}/members")
fun getGroupMembers(@Path("id") groupId: Long): Single<Response<List<Member>>>
fun getGroupMembers(@Path("id") groupId: Long): Single<Response<List<User>>>
 
@FormUrlEncoded
@POST(API_VERSION + "/groups/{id}/members")
fun addGroupMember(@Path("id") groupId: Long,
@Field("user_id") userId: Long,
@Field("access_level") accessLevel: Int): Single<Response<Member>>
@Field("access_level") accessLevel: Int): Single<Response<User>>
 
@FormUrlEncoded
@PUT(API_VERSION + "/groups/{id}/members/{user_id}")
fun editGroupMember(@Path("id") groupId: Long,
@Path("user_id") userId: Long,
@Field("access_level") accessLevel: Int): Single<Member>
@Field("access_level") accessLevel: Int): Single<User>
 
@DELETE(API_VERSION + "/groups/{id}/members/{user_id}")
fun removeGroupMember(@Path("id") groupId: Long,
Loading
Loading
@@ -104,22 +105,22 @@ interface GitLabService {
fun searchAllProjects(@Query("search") query: String): Single<Response<List<Project>>>
 
@GET(API_VERSION + "/projects/{id}/members")
fun getProjectMembers(@Path("id") projectId: Long): Single<Response<List<Member>>>
fun getProjectMembers(@Path("id") projectId: Long): Single<Response<List<User>>>
 
@GET
fun getProjectMembers(@Url url: String): Single<Response<List<Member>>>
fun getProjectMembers(@Url url: String): Single<Response<List<User>>>
 
@FormUrlEncoded
@POST(API_VERSION + "/projects/{id}/members")
fun addProjectMember(@Path("id") projectId: Long,
@Field("user_id") userId: Long,
@Field("access_level") accessLevel: Int): Single<Response<Member>>
@Field("access_level") accessLevel: Int): Single<Response<User>>
 
@FormUrlEncoded
@PUT(API_VERSION + "/projects/{id}/members/{user_id}")
fun editProjectMember(@Path("id") projectId: Long,
@Path("user_id") userId: Long,
@Field("access_level") accessLevel: Int): Single<Member>
@Field("access_level") accessLevel: Int): Single<User>
 
@DELETE(API_VERSION + "/projects/{id}/members/{user_id}")
fun removeProjectMember(@Path("id") projectId: Long,
Loading
Loading
package com.commit451.gitlab.api.converter
 
import com.commit451.gitlab.model.api.Milestone
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.ToJson
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*
 
Loading
Loading
Loading
Loading
@@ -7,10 +7,10 @@ import com.squareup.moshi.Json
*/
class SessionRequest {
 
@Json(name = "email")
@field:Json(name = "email")
var email: String? = null
@Json(name = "login")
@field:Json(name = "login")
var login: String? = null
@Json(name = "password")
@field:Json(name = "password")
var password: String? = null
}
package com.commit451.gitlab.api.response
import com.squareup.moshi.Json
import org.parceler.Parcel
/**
* Response when a file is uploaded
*/
@Parcel(Parcel.Serialization.BEAN)
open class FileUploadResponse {
@field:Json(name = "alt")
var alt: String? = null
@field:Json(name = "url")
var url: String? = null
@field:Json(name = "is_image")
var isImage: Boolean = false
@field:Json(name = "markdown")
lateinit var markdown: String
}
Loading
Loading
@@ -10,12 +10,10 @@ import java.util.*
*/
class DateTransform : Transform<Date> {
 
@Throws(Exception::class)
override fun read(value: String): Date? {
return Date(Instant.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(value)).toEpochMilli())
}
 
@Throws(Exception::class)
override fun write(value: Date): String {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(Instant.ofEpochMilli(value.time))
}
Loading
Loading
package com.commit451.gitlab.api.rss
 
import android.net.Uri
import com.commit451.gitlab.model.Account
import org.simpleframework.xml.core.Persister
import org.simpleframework.xml.transform.Matcher
import java.util.*
 
object SimpleXmlPersisterFactory {
 
fun createPersister(account: Account): Persister {
fun createPersister(): Persister {
return Persister(Matcher { type ->
if (Date::class.java.isAssignableFrom(type)) {
return@Matcher DateTransform()
} else if (Uri::class.java.isAssignableFrom(type)) {
return@Matcher UriTransform(account)
}
 
null
Loading
Loading
package com.commit451.gitlab.api.rss
import android.net.Uri
import com.commit451.gitlab.model.Account
import com.commit451.gitlab.util.ConversionUtil
import org.simpleframework.xml.transform.Transform
/**
* Uri Transformer
*/
class UriTransform(private val account: Account) : Transform<Uri> {
@Throws(Exception::class)
override fun read(value: String): Uri? {
return ConversionUtil.toUri(account, value)
}
@Throws(Exception::class)
override fun write(value: Uri): String? {
return ConversionUtil.fromUri(value)
}
}
Loading
Loading
@@ -48,7 +48,10 @@ object Prefs {
if (!accountsJson.isNullOrEmpty()) {
val type = Types.newParameterizedType(List::class.java, Account::class.java)
val adapter = MoshiProvider.moshi.adapter<List<Account>>(type)
return adapter.fromJson(accountsJson)!!.toMutableList()
val accounts = adapter.fromJson(accountsJson)!!.toMutableList()
Collections.sort(accounts)
Collections.reverse(accounts)
return accounts
} else {
return ArrayList()
}
Loading
Loading
Loading
Loading
@@ -8,7 +8,7 @@ import com.afollestad.materialdialogs.Theme
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.model.api.Group
import com.commit451.gitlab.model.api.Member
import com.commit451.gitlab.model.api.User
import com.commit451.gitlab.rx.CustomSingleObserver
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
Loading
Loading
@@ -19,7 +19,7 @@ import java.util.*
/**
* Change a users access level, either for a group or for a project
*/
class AccessDialog private constructor(context: Context, internal var member: Member?, internal var group: Group?, projectId: Long) : MaterialDialog(MaterialDialog.Builder(context)
class AccessDialog private constructor(context: Context, internal var member: User?, internal var group: Group?, projectId: Long) : MaterialDialog(MaterialDialog.Builder(context)
.items(if (group == null) R.array.project_role_names else R.array.group_role_names)
.itemsCallbackSingleChoice(-1) { _, _, _, _ -> true }
.theme(Theme.DARK)
Loading
Loading
@@ -40,9 +40,9 @@ class AccessDialog private constructor(context: Context, internal var member: Me
listener = accessAppliedListener
}
 
constructor(context: Context, member: Member, group: Group) : this(context, member, group, -1)
constructor(context: Context, member: User, group: Group) : this(context, member, group, -1)
 
constructor(context: Context, member: Member, projectId: Long) : this(context, member, null, projectId)
constructor(context: Context, member: User, projectId: Long) : this(context, member, null, projectId)
 
init {
getActionButton(DialogAction.POSITIVE).setOnClickListener { onApply() }
Loading
Loading
@@ -50,7 +50,7 @@ class AccessDialog private constructor(context: Context, internal var member: Me
this.projectId = projectId
if (this.member != null) {
selectedIndex = Arrays.asList(*roleNames).indexOf(
Member.getAccessLevel(this.member!!.accessLevel))
User.getAccessLevel(this.member!!.accessLevel))
}
}
 
Loading
Loading
@@ -69,18 +69,18 @@ class AccessDialog private constructor(context: Context, internal var member: Me
}
}
 
fun editGroupOrProjectMember(observable: Single<Member>) {
fun editGroupOrProjectMember(observable: Single<User>) {
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : CustomSingleObserver<Member>() {
.subscribe(object : CustomSingleObserver<User>() {
 
override fun error(t: Throwable) {
Timber.e(t)
this@AccessDialog.onError()
}
 
override fun success(member: Member) {
override fun success(member: User) {
if (onAccessChangedListener != null) {
onAccessChangedListener!!.onAccessChanged(this@AccessDialog.member!!, roleNames[selectedIndex])
}
Loading
Loading
@@ -109,7 +109,7 @@ class AccessDialog private constructor(context: Context, internal var member: Me
return
}
val accessLevel = roleNames[selectedIndex]
changeAccess(Member.getAccessLevel(accessLevel))
changeAccess(User.getAccessLevel(accessLevel))
}
 
fun onCancel() {
Loading
Loading
@@ -117,7 +117,7 @@ class AccessDialog private constructor(context: Context, internal var member: Me
}
 
interface OnAccessChangedListener {
fun onAccessChanged(member: Member, accessLevel: String)
fun onAccessChanged(member: User, accessLevel: String)
}
 
interface Listener {
Loading
Loading
package com.commit451.gitlab.event
 
import com.commit451.gitlab.model.api.Member
import com.commit451.gitlab.model.api.User
 
/**
* Indicates that a user was added
*/
class MemberAddedEvent(val member: Member)
class MemberAddedEvent(val member: User)
package com.commit451.gitlab.extension
import com.commit451.gitlab.model.api.Diff
val Diff.fileName: String
get() {
if (newPath!!.contains("/")) {
val paths = newPath!!.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
return paths[paths.size - 1]
} else {
return newPath!!
}
}
\ No newline at end of file
package com.commit451.gitlab.extension
import com.commit451.gitlab.model.api.Group
val Group.feedUrl: String
get() = webUrl + ".atom"
package com.commit451.gitlab.extension
import android.graphics.Color
import android.support.annotation.ColorInt
import com.commit451.gitlab.model.api.Label
@ColorInt
fun Label.getColor(): Int {
try {
return Color.parseColor(color)
} catch (e: Exception) {
return Color.TRANSPARENT
}
}
\ No newline at end of file
package com.commit451.gitlab.extension
 
import com.commit451.gitlab.model.api.Project
import android.net.Uri
 
/**
* Created by johncarlson on 7/28/17.
*/
fun Project.getFeedUrl(): Uri? {
if (webUrl == null) {
return null
}
return Uri.parse(webUrl + ".atom")
val Project.feedUrl: String get() = webUrl + ".atom"
fun Project.belongsToGroup(): Boolean {
//If there is an owner, then there is no group
return owner == null
}
\ 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