From 7f66ec2d40dcbea1089689abdc028ece33eafc35 Mon Sep 17 00:00:00 2001 From: massimiliano Date: Mon, 20 Dec 2021 01:04:20 +0100 Subject: [PATCH 01/10] Added signature, pending time and ticket tags, soved unstability in login(when url is not reachable, more logs when user logs in for better user experience --- .../java/com/kirkbushman/zammad/ZammadApi.kt | 24 ++++ .../com/kirkbushman/zammad/ZammadClient.kt | 125 ++++++++++++++---- .../zammad/models/MailSignature.kt | 40 ++++++ .../kirkbushman/zammad/models/SearchResult.kt | 2 +- .../com/kirkbushman/zammad/models/Ticket.kt | 5 +- .../kirkbushman/zammad/models/TicketState.kt | 2 +- .../kirkbushman/zammad/models/TicketTag.kt | 16 +++ .../zammad/models/compat/TicketCompat.kt | 5 +- .../kirkbushman/sampleapp/LoginActivity.kt | 56 ++++---- .../sampleapp/di/SingletonModule.kt | 2 +- sampleapp/src/main/res/values/strings.xml | 2 + 11 files changed, 227 insertions(+), 52 deletions(-) create mode 100644 lib/src/main/java/com/kirkbushman/zammad/models/MailSignature.kt create mode 100644 lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt index 983f3e8..15b8027 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt @@ -28,6 +28,12 @@ interface ZammadApi { @HeaderMap header: HashMap ): Call + @GET("/api/v1/signatures") + fun signature( + @Query("expand") expanded: Boolean, + @HeaderMap header: HashMap + ): Call> + @FormUrlEncoded @PUT("/api/v1/users/{id}") fun updateUser( @@ -213,6 +219,23 @@ interface ZammadApi { @HeaderMap header: HashMap ): Call> + @GET("/api/v1/tags") + fun ticketTags( + @Query("object") ticket: String, + @Query("o_id") query: String, + @Query("expand") expanded: Boolean, + @HeaderMap header: HashMap + ): Call + + @FormUrlEncoded + @POST("/api/v1/tags/add") + fun addTag( + @Field("item") item: String, + @Field("object") tagObject: String, + @Field("o_id") oId: String, + @HeaderMap header: HashMap + ): Call + @GET("/api/v1/ticket_states") fun ticketStates( @Query("expand") expanded: Boolean, @@ -338,6 +361,7 @@ interface ZammadApi { @Field("customer_id") customerId: Int? = null, @Field("customer") customer: String? = null, @Field("note") note: String? = null, + @Field("pending_time") pendingTime: String? = null, @HeaderMap header: HashMap ): Call diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 112ce26..9f532f5 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -13,10 +13,11 @@ class ZammadClient( baseUrl: String, private val auth: String, - private val logging: Boolean + private val logging: Boolean, + loggedIn: Boolean // ) { - constructor(baseUrl: String, username: String, password: String, logging: Boolean) : this(baseUrl, "$username:$password", logging) + constructor(baseUrl: String, username: String, password: String, logging: Boolean ,loggedIn: Boolean) : this(baseUrl, "$username:$password", logging,loggedIn) companion object { @@ -24,14 +25,13 @@ class ZammadClient( private var retrofit: Retrofit? = null @Volatile private var api: ZammadApi? = null - @Synchronized - fun getRetrofit(baseUrl: String, logging: Boolean): Retrofit { + fun getRetrofit(baseUrl: String, logging: Boolean,loggedIn: Boolean): Retrofit { synchronized(this) { - - if (retrofit == null) { - retrofit = buildRetrofit(baseUrl, logging) - } + //if (retrofit == null) { //soved login issue part1 + if(!loggedIn) retrofit = buildRetrofit(baseUrl, logging) + if(retrofit == null) retrofit = buildRetrofit(baseUrl, logging) + //} return retrofit!! } @@ -50,13 +50,12 @@ class ZammadClient( } @Synchronized - fun getApi(baseUrl: String, logging: Boolean): ZammadApi { + fun getApi(baseUrl: String, logging: Boolean, loggedIn: Boolean): ZammadApi { synchronized(this) { - - if (api == null) { - api = getRetrofit(baseUrl, logging).create(ZammadApi::class.java) - } - + // if (api == null) { //soved login issue part2 + if (!loggedIn) {api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java)} + if (api == null) api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java) + //} return api!! } } @@ -82,19 +81,29 @@ class ZammadClient( val auth = "$username:$password" val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) - val api = getApi(baseUrl, logging) + val api = getApi(baseUrl, logging, loggedIn=false) val req = api.me(expanded, authMap) val res = req.execute() - if (!res.isSuccessful) { return null } return res.body() } + + fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { + + val auth = "$username:$password" + val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) + val api = getApi(baseUrl, logging, loggedIn=false) + val req = api.me(expanded, authMap) + val res = req.execute() + + return res.code() + } } - private val api = getApi(baseUrl, logging) + private val api = getApi(baseUrl, logging, loggedIn) fun me(expanded: Boolean = false): User? { @@ -203,12 +212,10 @@ class ZammadClient( phone: String? = null, fax: String? = null, mobile: String? = null, - department: String? = null, street: String? = null, zip: String? = null, city: String? = null, country: String? = null, - address: String? = null, isVip: Boolean? = null, isVerified: Boolean? = null, note: String? = null, @@ -237,12 +244,10 @@ class ZammadClient( phone = phone, fax = fax, mobile = mobile, - department = department, street = street, zip = zip, city = city, country = country, - address = address, isVip = isVip, isVerified = isVerified, note = note, @@ -632,6 +637,24 @@ class ZammadClient( return res.body() } + fun signature(expanded: Boolean = false): List? { + + val authMap = getHeaderMap() + val req = api.signature(expanded, authMap) + val res = req.execute() + + if (!res.isSuccessful) { + + if (logging) { + Log.i("Retrofit Error", res.errorBody().toString()) + } + + return null + } + + return res.body() + } + fun ticketStates(expanded: Boolean = false): List? { val authMap = getHeaderMap() @@ -868,6 +891,24 @@ class ZammadClient( return res.body() } + fun searchUnassignedTickets(query: String, page: Int, perPage: Int, expanded: Boolean = false): SearchResult? { + + val authMap = getHeaderMap() + val req = api.searchTickets(query, page, perPage, expanded, authMap) + val res = req.execute() + + if (!res.isSuccessful) { + + if (logging) { + Log.i("Retrofit Error", res.errorBody().toString()) + } + + return null + } + + return res.body() + } + fun ticket(id: Int, expanded: Boolean = false): Ticket? { val authMap = getHeaderMap() @@ -979,7 +1020,8 @@ class ZammadClient( owner: String? = null, customerId: Int? = null, customer: String? = null, - note: String? = null + note: String? = null, + pendingTime: String? = null ): Ticket? { val authMap = getHeaderMap() @@ -997,7 +1039,8 @@ class ZammadClient( customerId = customerId, customer = customer, note = note, - header = authMap + header = authMap, + pendingTime = pendingTime ) val res = req.execute() @@ -1037,6 +1080,42 @@ class ZammadClient( return true } + fun ticketTags(ticket: String, query: String, expanded: Boolean = false): TicketTag? { + + val authMap = getHeaderMap() + val req = api.ticketTags(ticket, query, expanded, authMap) + val res = req.execute() + + if (!res.isSuccessful) { + + if (logging) { + Log.i("Retrofit Error", res.errorBody().toString()) + } + + return null + } + + return res.body() + } + + fun addTag(item: String, tagObject: String, oId: String): Any? { + + val authMap = getHeaderMap() + val req = api.addTag(item, tagObject, oId, authMap) + val res = req.execute() + + if (!res.isSuccessful) { + + if (logging) { + Log.i("Retrofit Error", res.errorBody().toString()) + } + + return null + } + + return res.body() + } + fun searchTickets(query: String, page: Int, perPage: Int, expanded: Boolean = false): SearchResult? { val authMap = getHeaderMap() diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/MailSignature.kt b/lib/src/main/java/com/kirkbushman/zammad/models/MailSignature.kt new file mode 100644 index 0000000..f0db002 --- /dev/null +++ b/lib/src/main/java/com/kirkbushman/zammad/models/MailSignature.kt @@ -0,0 +1,40 @@ +package com.kirkbushman.zammad.models + +import android.os.Parcelable +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import kotlinx.parcelize.Parcelize + +@JsonClass(generateAdapter = true) +@Parcelize +data class MailSignature( + + @Json(name = "id") + val id: Int, + + @Json(name = "name") + val name: String, + + @Json(name = "body") + val body: String, + + @Json(name = "active") + val active: Boolean, + + @Json(name = "note") + val note: String?, + + @Json(name = "created_by_id") + val createdById: Int, + + @Json(name = "updated_by_id") + val updatedById: Int, + + @Json(name = "created_at") + val createdAt: String, + + @Json(name = "updated_at") + val updatedAt: String, + +) : Parcelable + diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt b/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt index 3e38881..dc5b27e 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt @@ -26,7 +26,7 @@ data class SearchAssets( @Json(name = "Ticket") val tickets: Map?, - + // Massi edit causes crashes as it doesn't accept null for department @Json(name = "User") val users: Map?, diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/Ticket.kt b/lib/src/main/java/com/kirkbushman/zammad/models/Ticket.kt index 93be453..20c8757 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/Ticket.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/Ticket.kt @@ -82,6 +82,9 @@ data class Ticket( override val createdBy: String?, @Json(name = "updated_by") - override val updatedBy: String? + override val updatedBy: String?, + + @Json(name = "pending_time") + val pendingTime: String? ) : Parcelable, Identifiable, Creatable, Updatable diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt b/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt index 78e2969..43c304e 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt @@ -31,7 +31,7 @@ data class TicketState( val defaultFollowUp: Boolean, @Json(name = "note") - val note: String, + val note: String?,//questionmark prevents crash @Json(name = "created_by_id") override val createdById: Int, diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt b/lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt new file mode 100644 index 0000000..a41ad75 --- /dev/null +++ b/lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt @@ -0,0 +1,16 @@ +package com.kirkbushman.zammad.models + +import android.os.Parcelable +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.RawValue + +@JsonClass(generateAdapter = true) +@Parcelize +data class TicketTag( + + @Json(name = "tags") + val tags: @RawValue List + +) : Parcelable \ No newline at end of file diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/compat/TicketCompat.kt b/lib/src/main/java/com/kirkbushman/zammad/models/compat/TicketCompat.kt index 65d4197..ffe7fde 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/compat/TicketCompat.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/compat/TicketCompat.kt @@ -46,6 +46,9 @@ data class TicketCompat( val article: TicketArticleCompat, @Json(name = "note") - val note: String? = null + val note: String? = null, + + @Json(name = "pending_time") + val pendingTime: String? = null ) : Parcelable diff --git a/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt b/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt index 5819625..d36d7fb 100644 --- a/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt +++ b/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt @@ -28,7 +28,7 @@ class LoginActivity : AppCompatActivity() { if (prefs.getIsLoggedIn()) { - SingletonModule.setClient(ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true)) + SingletonModule.setClient(ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true, true )) startActivity(Intent(this, MainActivity::class.java)) } @@ -39,7 +39,7 @@ class LoginActivity : AppCompatActivity() { val username = binding.emailEdit.text.trim().toString() val password = binding.passwordEdit.text.trim().toString() - if (baseUrl == "") { + if (!baseUrl.contains("https://")) { Toast.makeText(this, "baseurl not found!", Toast.LENGTH_SHORT).show() } @@ -51,30 +51,38 @@ class LoginActivity : AppCompatActivity() { Toast.makeText(this, "password not found!", Toast.LENGTH_SHORT).show() } - var me: User? = null - DoAsync( - doWork = { - me = ZammadClient.me(baseUrl, username, password, true) - }, - onPost = { - - if (me != null) { - - SingletonModule.setClient(ZammadClient(baseUrl, username, password, true)) - - with(prefs) { - setIsLoggedIn(true) - setBaseUrl(baseUrl) - setUsername(username) - setPassword(password) + else { + var me: User? = null + var log: Int? = null + var logText: String? + DoAsync( + doWork = { + kotlin.runCatching { + log = ZammadClient.log(baseUrl, username, password, true) + me = if(log == 200) ZammadClient.me(baseUrl, username, password, true) else null + } + }, + onPost = { + logText = if (log == 401) getString(R.string.unauthorized_error) else getString(R.string.inaccessible_error) + if (me != null) { + + SingletonModule.setClient(ZammadClient(baseUrl, username, password, true, true)) + + with(prefs) { + setIsLoggedIn(true) + setBaseUrl(baseUrl) + setUsername(username) + setPassword(password) + } + + startActivity(Intent(this, MainActivity::class.java)) + } else { + Toast.makeText(this, logText, Toast.LENGTH_LONG) + .show() } - - startActivity(Intent(this, MainActivity::class.java)) - } else { - Toast.makeText(this, "Error while trying to login!", Toast.LENGTH_SHORT).show() } - } - ) + ) + } } } } diff --git a/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt b/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt index 0f64d81..5569f44 100644 --- a/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt +++ b/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt @@ -47,7 +47,7 @@ object SingletonModule { ): ZammadClient { if (mClient == null) { - mClient = ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true) + mClient = ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true, true) } return mClient!! diff --git a/sampleapp/src/main/res/values/strings.xml b/sampleapp/src/main/res/values/strings.xml index 68f774c..b7a2bca 100644 --- a/sampleapp/src/main/res/values/strings.xml +++ b/sampleapp/src/main/res/values/strings.xml @@ -55,4 +55,6 @@ Search: No items to show. + Error while trying to login!\nUnauthorized! Please check your username and password. + Error while trying to login!\nUrl is inaccessible! Check network and input! From 1bc937c1393f8e9b50566e40acb350000574bfe2 Mon Sep 17 00:00:00 2001 From: massimiliano Date: Mon, 20 Dec 2021 09:53:56 +0100 Subject: [PATCH 02/10] ra added by mistake removed lines --- .../com/kirkbushman/zammad/ZammadClient.kt | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 9f532f5..115b09b 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -14,7 +14,7 @@ class ZammadClient( private val auth: String, private val logging: Boolean, - loggedIn: Boolean // + loggedIn: Boolean //prevents bug when type wrong url ) { constructor(baseUrl: String, username: String, password: String, logging: Boolean ,loggedIn: Boolean) : this(baseUrl, "$username:$password", logging,loggedIn) @@ -28,7 +28,7 @@ class ZammadClient( @Synchronized fun getRetrofit(baseUrl: String, logging: Boolean,loggedIn: Boolean): Retrofit { synchronized(this) { - //if (retrofit == null) { //soved login issue part1 + //if (retrofit == null) { //solves login issue part1 if(!loggedIn) retrofit = buildRetrofit(baseUrl, logging) if(retrofit == null) retrofit = buildRetrofit(baseUrl, logging) //} @@ -52,7 +52,7 @@ class ZammadClient( @Synchronized fun getApi(baseUrl: String, logging: Boolean, loggedIn: Boolean): ZammadApi { synchronized(this) { - // if (api == null) { //soved login issue part2 + // if (api == null) { //solves login issue part2 if (!loggedIn) {api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java)} if (api == null) api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java) //} @@ -90,17 +90,6 @@ class ZammadClient( return res.body() } - - fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { - - val auth = "$username:$password" - val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) - val api = getApi(baseUrl, logging, loggedIn=false) - val req = api.me(expanded, authMap) - val res = req.execute() - - return res.code() - } } private val api = getApi(baseUrl, logging, loggedIn) @@ -212,10 +201,12 @@ class ZammadClient( phone: String? = null, fax: String? = null, mobile: String? = null, + department: String? = null, street: String? = null, zip: String? = null, city: String? = null, country: String? = null, + address: String? = null, isVip: Boolean? = null, isVerified: Boolean? = null, note: String? = null, @@ -244,10 +235,12 @@ class ZammadClient( phone = phone, fax = fax, mobile = mobile, + department = department, street = street, zip = zip, city = city, country = country, + address = address, isVip = isVip, isVerified = isVerified, note = note, From 37041eaaf3401ca95ac2f5081475f129af25f13d Mon Sep 17 00:00:00 2001 From: massimiliano Date: Mon, 20 Dec 2021 09:58:10 +0100 Subject: [PATCH 03/10] Added signature, --- .../main/java/com/kirkbushman/zammad/ZammadClient.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 115b09b..5a6741e 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -92,6 +92,17 @@ class ZammadClient( } } + fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { + + val auth = "$username:$password" + val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) + val api = getApi(baseUrl, logging, loggedIn=false) + val req = api.me(expanded, authMap) + val res = req.execute() + + return res.code() + } + private val api = getApi(baseUrl, logging, loggedIn) fun me(expanded: Boolean = false): User? { From 828ad1db2c3c04fe8625055cf2774134d4ccf649 Mon Sep 17 00:00:00 2001 From: massimiliano Date: Wed, 22 Dec 2021 14:09:36 +0100 Subject: [PATCH 04/10] renamed ticketTags and Signature + removed comments --- .../com/kirkbushman/zammad/ZammadClient.kt | 22 +++++++++---------- .../kirkbushman/zammad/models/SearchResult.kt | 2 +- .../kirkbushman/zammad/models/TicketState.kt | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 5a6741e..1a0a691 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -14,7 +14,7 @@ class ZammadClient( private val auth: String, private val logging: Boolean, - loggedIn: Boolean //prevents bug when type wrong url + loggedIn: Boolean ) { constructor(baseUrl: String, username: String, password: String, logging: Boolean ,loggedIn: Boolean) : this(baseUrl, "$username:$password", logging,loggedIn) @@ -28,7 +28,7 @@ class ZammadClient( @Synchronized fun getRetrofit(baseUrl: String, logging: Boolean,loggedIn: Boolean): Retrofit { synchronized(this) { - //if (retrofit == null) { //solves login issue part1 + //if (retrofit == null) { if(!loggedIn) retrofit = buildRetrofit(baseUrl, logging) if(retrofit == null) retrofit = buildRetrofit(baseUrl, logging) //} @@ -52,7 +52,7 @@ class ZammadClient( @Synchronized fun getApi(baseUrl: String, logging: Boolean, loggedIn: Boolean): ZammadApi { synchronized(this) { - // if (api == null) { //solves login issue part2 + // if (api == null) { if (!loggedIn) {api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java)} if (api == null) api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java) //} @@ -90,17 +90,17 @@ class ZammadClient( return res.body() } - } - fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { + fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { - val auth = "$username:$password" - val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) - val api = getApi(baseUrl, logging, loggedIn=false) - val req = api.me(expanded, authMap) - val res = req.execute() + val auth = "$username:$password" + val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) + val api = getApi(baseUrl, logging, loggedIn=false) + val req = api.me(expanded, authMap) + val res = req.execute() - return res.code() + return res.code() + } } private val api = getApi(baseUrl, logging, loggedIn) diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt b/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt index dc5b27e..3e38881 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/SearchResult.kt @@ -26,7 +26,7 @@ data class SearchAssets( @Json(name = "Ticket") val tickets: Map?, - // Massi edit causes crashes as it doesn't accept null for department + @Json(name = "User") val users: Map?, diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt b/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt index 43c304e..2fdfe2d 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/TicketState.kt @@ -31,7 +31,7 @@ data class TicketState( val defaultFollowUp: Boolean, @Json(name = "note") - val note: String?,//questionmark prevents crash + val note: String?, @Json(name = "created_by_id") override val createdById: Int, From d6b11d12da065adcd3777e3923e723388fc6476d Mon Sep 17 00:00:00 2001 From: massimiliano Date: Wed, 22 Dec 2021 14:40:37 +0100 Subject: [PATCH 05/10] remove of searchUnassignedTickets --- .../com/kirkbushman/zammad/ZammadClient.kt | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 1a0a691..dea9acd 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -895,24 +895,6 @@ class ZammadClient( return res.body() } - fun searchUnassignedTickets(query: String, page: Int, perPage: Int, expanded: Boolean = false): SearchResult? { - - val authMap = getHeaderMap() - val req = api.searchTickets(query, page, perPage, expanded, authMap) - val res = req.execute() - - if (!res.isSuccessful) { - - if (logging) { - Log.i("Retrofit Error", res.errorBody().toString()) - } - - return null - } - - return res.body() - } - fun ticket(id: Int, expanded: Boolean = false): Ticket? { val authMap = getHeaderMap() From 308ac4ea9c1bb71e54191db58ef9a187a32e9117 Mon Sep 17 00:00:00 2001 From: massimiliano Date: Wed, 22 Dec 2021 14:42:40 +0100 Subject: [PATCH 06/10] renamed TicketTag to TicketTags --- lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt | 2 +- lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt | 2 +- .../kirkbushman/zammad/models/{TicketTag.kt => TicketTags.kt} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename lib/src/main/java/com/kirkbushman/zammad/models/{TicketTag.kt => TicketTags.kt} (93%) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt index 15b8027..87745b6 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt @@ -225,7 +225,7 @@ interface ZammadApi { @Query("o_id") query: String, @Query("expand") expanded: Boolean, @HeaderMap header: HashMap - ): Call + ): Call @FormUrlEncoded @POST("/api/v1/tags/add") diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index dea9acd..2987830 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -1066,7 +1066,7 @@ class ZammadClient( return true } - fun ticketTags(ticket: String, query: String, expanded: Boolean = false): TicketTag? { + fun ticketTags(ticket: String, query: String, expanded: Boolean = false): TicketTags? { val authMap = getHeaderMap() val req = api.ticketTags(ticket, query, expanded, authMap) diff --git a/lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt b/lib/src/main/java/com/kirkbushman/zammad/models/TicketTags.kt similarity index 93% rename from lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt rename to lib/src/main/java/com/kirkbushman/zammad/models/TicketTags.kt index a41ad75..02dfd56 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/models/TicketTag.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/models/TicketTags.kt @@ -8,7 +8,7 @@ import kotlinx.parcelize.RawValue @JsonClass(generateAdapter = true) @Parcelize -data class TicketTag( +data class TicketTags( @Json(name = "tags") val tags: @RawValue List From 9fb9d3a0d67b2dcd7fa888b45a5afd9cc9c75415 Mon Sep 17 00:00:00 2001 From: massimiliano Date: Thu, 27 Jan 2022 16:02:56 +0100 Subject: [PATCH 07/10] removed "logged in" in zamad client and removed log + added login test in login activity --- .idea/compiler.xml | 2 +- .idea/misc.xml | 2 +- .idea/modules.xml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../com/kirkbushman/zammad/ZammadClient.kt | 39 +++++--------- sampleapp/src/main/AndroidManifest.xml | 6 ++- .../kirkbushman/sampleapp/LoginActivity.kt | 53 +++++++++++++++---- .../sampleapp/di/SingletonModule.kt | 2 +- 8 files changed, 66 insertions(+), 42 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b73660a..61a9130 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 355212c..3378229 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 50a28b1..fb42285 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 25d3265..3cd8500 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 2987830..15b1b92 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -13,11 +13,10 @@ class ZammadClient( baseUrl: String, private val auth: String, - private val logging: Boolean, - loggedIn: Boolean + private val logging: Boolean ) { - constructor(baseUrl: String, username: String, password: String, logging: Boolean ,loggedIn: Boolean) : this(baseUrl, "$username:$password", logging,loggedIn) + constructor(baseUrl: String, username: String, password: String, logging: Boolean ) : this(baseUrl, "$username:$password", logging) companion object { @@ -25,13 +24,14 @@ class ZammadClient( private var retrofit: Retrofit? = null @Volatile private var api: ZammadApi? = null + @Synchronized - fun getRetrofit(baseUrl: String, logging: Boolean,loggedIn: Boolean): Retrofit { + fun getRetrofit(baseUrl: String, logging: Boolean): Retrofit { synchronized(this) { - //if (retrofit == null) { - if(!loggedIn) retrofit = buildRetrofit(baseUrl, logging) - if(retrofit == null) retrofit = buildRetrofit(baseUrl, logging) - //} + + if (retrofit == null) { + retrofit = buildRetrofit(baseUrl, logging) + } return retrofit!! } @@ -50,12 +50,11 @@ class ZammadClient( } @Synchronized - fun getApi(baseUrl: String, logging: Boolean, loggedIn: Boolean): ZammadApi { + fun getApi(baseUrl: String, logging: Boolean): ZammadApi { synchronized(this) { - // if (api == null) { - if (!loggedIn) {api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java)} - if (api == null) api = getRetrofit(baseUrl, logging, loggedIn).create(ZammadApi::class.java) - //} + if (api == null) { + api = getRetrofit(baseUrl, logging).create(ZammadApi::class.java) + } return api!! } } @@ -81,7 +80,7 @@ class ZammadClient( val auth = "$username:$password" val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) - val api = getApi(baseUrl, logging, loggedIn=false) + val api = getApi(baseUrl, logging) val req = api.me(expanded, authMap) val res = req.execute() if (!res.isSuccessful) { @@ -91,19 +90,9 @@ class ZammadClient( return res.body() } - fun log(baseUrl: String, username: String, password: String, logging: Boolean, expanded: Boolean = false): Int { - - val auth = "$username:$password" - val authMap = hashMapOf("Authorization" to "Basic ".plus(String(Base64.encode(auth.toByteArray(), Base64.NO_WRAP)))) - val api = getApi(baseUrl, logging, loggedIn=false) - val req = api.me(expanded, authMap) - val res = req.execute() - - return res.code() - } } - private val api = getApi(baseUrl, logging, loggedIn) + private val api = getApi(baseUrl, logging) fun me(expanded: Boolean = false): User? { diff --git a/sampleapp/src/main/AndroidManifest.xml b/sampleapp/src/main/AndroidManifest.xml index 862da94..59d2381 100644 --- a/sampleapp/src/main/AndroidManifest.xml +++ b/sampleapp/src/main/AndroidManifest.xml @@ -20,7 +20,9 @@ tools:targetApi="n" tools:ignore="GoogleAppIndexingWarning"> - + @@ -28,7 +30,7 @@ - + diff --git a/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt b/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt index d36d7fb..d09ad11 100644 --- a/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt +++ b/sampleapp/src/main/java/com/kirkbushman/sampleapp/LoginActivity.kt @@ -2,14 +2,16 @@ package com.kirkbushman.sampleapp import android.content.Intent import android.os.Bundle +import android.util.Base64 import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.kirkbushman.sampleapp.data.Preferences import com.kirkbushman.sampleapp.databinding.ActivityLoginBinding import com.kirkbushman.sampleapp.di.SingletonModule import com.kirkbushman.zammad.ZammadClient -import com.kirkbushman.zammad.models.User import dagger.hilt.android.AndroidEntryPoint +import java.net.HttpURLConnection +import java.net.URL import javax.inject.Inject @AndroidEntryPoint @@ -28,7 +30,7 @@ class LoginActivity : AppCompatActivity() { if (prefs.getIsLoggedIn()) { - SingletonModule.setClient(ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true, true )) + SingletonModule.setClient(ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true )) startActivity(Intent(this, MainActivity::class.java)) } @@ -52,21 +54,52 @@ class LoginActivity : AppCompatActivity() { } else { - var me: User? = null - var log: Int? = null var logText: String? + var isReachable:Int?=null DoAsync( doWork = { kotlin.runCatching { - log = ZammadClient.log(baseUrl, username, password, true) - me = if(log == 200) ZammadClient.me(baseUrl, username, password, true) else null + val userpass = "$username:$password" + val basicAuth = "Basic " + Base64.encodeToString( + userpass.toByteArray(), + Base64.NO_WRAP + ) + + isReachable = + if (android.os.Build.VERSION.SDK_INT >= 25) { + val connection: HttpURLConnection = URL( + baseUrl + "/api/v1/users/me" + ).openConnection() as HttpURLConnection + connection.setRequestProperty("Authorization", basicAuth); + connection.requestMethod = "GET" + connection.responseCode + } else 200 } }, onPost = { - logText = if (log == 401) getString(R.string.unauthorized_error) else getString(R.string.inaccessible_error) - if (me != null) { - - SingletonModule.setClient(ZammadClient(baseUrl, username, password, true, true)) + if (isReachable != 200) { + Toast.makeText( + this, + getString(R.string.inaccessible_error) + "\nERROR: " + isReachable.toString(), + Toast.LENGTH_LONG + ) + .show() + return@DoAsync + } + logText = if (isReachable == 401) getString(R.string.unauthorized_error) else getString( + R.string.inaccessible_error + ) + + if (isReachable == 200) { + + SingletonModule.setClient( + ZammadClient( + baseUrl, + username, + password, + true + ) + ) with(prefs) { setIsLoggedIn(true) diff --git a/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt b/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt index 5569f44..0f64d81 100644 --- a/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt +++ b/sampleapp/src/main/java/com/kirkbushman/sampleapp/di/SingletonModule.kt @@ -47,7 +47,7 @@ object SingletonModule { ): ZammadClient { if (mClient == null) { - mClient = ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true, true) + mClient = ZammadClient(prefs.getBaseUrl(), prefs.getUsername(), prefs.getPassword(), true) } return mClient!! From b0468c520cb0bd4453a3cd47b3be57fbbf7d3426 Mon Sep 17 00:00:00 2001 From: massimilian0 <64772465+massimilian0@users.noreply.github.com> Date: Thu, 27 Jan 2022 16:38:41 +0000 Subject: [PATCH 08/10] Delete .idea directory --- .idea/codeStyles/Project.xml | 119 ------------------- .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/compiler.xml | 6 - .idea/encodings.xml | 4 - .idea/inspectionProfiles/Project_Default.xml | 10 -- .idea/jarRepositories.xml | 25 ---- .idea/misc.xml | 14 --- .idea/modules.xml | 10 -- .idea/runConfigurations.xml | 12 -- .idea/vcs.xml | 6 - 10 files changed, 211 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index ce889bd..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -
- - - - xmlns:android - - ^$ - - - -
-
- - - - xmlns:.* - - ^$ - - - BY_NAME - -
-
- - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
-
- - - - .*:name - - http://schemas.android.com/apk/res/android - - - -
-
- - - - name - - ^$ - - - -
-
- - - - style - - ^$ - - - -
-
- - - - .* - - ^$ - - - BY_NAME - -
-
- - - - .* - - http://schemas.android.com/apk/res/android - - - ANDROID_ATTRIBUTE_ORDER - -
-
- - - - .* - - .* - - - BY_NAME - -
-
-
-
- - -
-
\ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 61a9130..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 15a15b2..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 146ab09..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index a5f05cd..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 3378229..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index fb42285..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 9af28abbbf78100a24176720f69c22e54d8eb2ed Mon Sep 17 00:00:00 2001 From: massimilian0 <64772465+massimilian0@users.noreply.github.com> Date: Thu, 27 Jan 2022 16:40:13 +0000 Subject: [PATCH 09/10] Update AndroidManifest.xml --- sampleapp/src/main/AndroidManifest.xml | 72 +++++++++++++------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/sampleapp/src/main/AndroidManifest.xml b/sampleapp/src/main/AndroidManifest.xml index 59d2381..169181d 100644 --- a/sampleapp/src/main/AndroidManifest.xml +++ b/sampleapp/src/main/AndroidManifest.xml @@ -31,44 +31,44 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + From 4d366c99ae3deff57c707d05b95d10b297d8ff7e Mon Sep 17 00:00:00 2001 From: massimiliano Date: Tue, 8 Feb 2022 09:59:36 +0100 Subject: [PATCH 10/10] removed "logged in" in zamad client and removed log + added login test in login activity --- lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt | 2 +- lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt index 87745b6..9154ce1 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadApi.kt @@ -29,7 +29,7 @@ interface ZammadApi { ): Call @GET("/api/v1/signatures") - fun signature( + fun signatures( @Query("expand") expanded: Boolean, @HeaderMap header: HashMap ): Call> diff --git a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt index 15b1b92..8cf7b09 100644 --- a/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt +++ b/lib/src/main/java/com/kirkbushman/zammad/ZammadClient.kt @@ -630,10 +630,10 @@ class ZammadClient( return res.body() } - fun signature(expanded: Boolean = false): List? { + fun signatures(expanded: Boolean = false): List? { val authMap = getHeaderMap() - val req = api.signature(expanded, authMap) + val req = api.signatures(expanded, authMap) val res = req.execute() if (!res.isSuccessful) {