Reduce number of Detekt issues

Reduce the number of Detekt issues for the 'OperationsMenuController' by
splitting the function 'processOperation' into smaller pieces. But in
the end it is not enough, because also the now short function
'processOperation' is too complex for Detekt. Because of that the
suppress annotation is set.

Signed-off-by: Tim Krüger <t@timkrueger.me>
This commit is contained in:
Tim Krüger 2022-05-06 17:01:10 +02:00 committed by Andy Scherzinger (Rebase PR Action)
parent e4b5fd2867
commit f9020dbc2b
2 changed files with 322 additions and 278 deletions

View File

@ -76,7 +76,6 @@ import org.greenrobot.eventbus.EventBus
import org.parceler.Parcels import org.parceler.Parcels
import retrofit2.HttpException import retrofit2.HttpException
import java.io.IOException import java.io.IOException
import java.util.ArrayList
import java.util.Collections import java.util.Collections
import javax.inject.Inject import javax.inject.Inject
@ -121,6 +120,7 @@ class OperationsMenuController(args: Bundle) : NewBaseController(
super.onViewBound(view) super.onViewBound(view)
sharedApplication!!.componentApplication.inject(this) sharedApplication!!.componentApplication.inject(this)
currentUser = userUtils!!.currentUser currentUser = userUtils!!.currentUser
if (!TextUtils.isEmpty(callUrl) && callUrl.contains("/call")) { if (!TextUtils.isEmpty(callUrl) && callUrl.contains("/call")) {
conversationToken = callUrl.substring(callUrl.lastIndexOf("/") + 1) conversationToken = callUrl.substring(callUrl.lastIndexOf("/") + 1)
if (callUrl.contains("/index.php")) { if (callUrl.contains("/index.php")) {
@ -204,296 +204,338 @@ class OperationsMenuController(args: Bundle) : NewBaseController(
}) })
} }
@Suppress("Detekt.ComplexMethod")
private fun processOperation() { private fun processOperation() {
val roomOperationsObserver = RoomOperationsObserver()
val genericOperationsObserver = GenericOperationsObserver()
if (currentUser == null) { if (currentUser == null) {
showResultImage(everythingOK = false, isGuestSupportError = true) showResultImage(everythingOK = false, isGuestSupportError = true)
Log.e(TAG, "Ended up in processOperation without a valid currentUser") Log.e(TAG, "Ended up in processOperation without a valid currentUser")
return return
} }
credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token) credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
val apiVersion = ApiUtils.getConversationApiVersion(currentUser, intArrayOf(ApiUtils.APIv4, ApiUtils.APIv1))
val chatApiVersion = ApiUtils.getChatApiVersion(currentUser, intArrayOf(ApiUtils.APIv1))
when (operation) { when (operation) {
ConversationOperationEnum.OPS_CODE_RENAME_ROOM -> ncApi!!.renameRoom( ConversationOperationEnum.OPS_CODE_RENAME_ROOM -> operationRenameRoom()
credentials, ConversationOperationEnum.OPS_CODE_MAKE_PUBLIC -> operationMakePublic()
ApiUtils.getUrlForRoom(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
),
conversation!!.getName()
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
ConversationOperationEnum.OPS_CODE_MAKE_PUBLIC -> ncApi!!.makeRoomPublic(
credentials,
ApiUtils.getUrlForRoomPublic(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
ConversationOperationEnum.OPS_CODE_CHANGE_PASSWORD, ConversationOperationEnum.OPS_CODE_CHANGE_PASSWORD,
ConversationOperationEnum.OPS_CODE_CLEAR_PASSWORD, ConversationOperationEnum.OPS_CODE_CLEAR_PASSWORD,
ConversationOperationEnum.OPS_CODE_SET_PASSWORD -> { ConversationOperationEnum.OPS_CODE_SET_PASSWORD -> operationChangePassword()
var pass: String? = "" ConversationOperationEnum.OPS_CODE_MAKE_PRIVATE -> operationMakePrivate()
if (conversation!!.getPassword() != null) { ConversationOperationEnum.OPS_CODE_GET_AND_JOIN_ROOM -> operationGetAndJoinRoom()
pass = conversation!!.getPassword() ConversationOperationEnum.OPS_CODE_INVITE_USERS -> operationInviteUsers()
} ConversationOperationEnum.OPS_CODE_MARK_AS_READ -> operationMarkAsRead()
ncApi!!.setPassword(
credentials,
ApiUtils.getUrlForRoomPassword(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
),
pass
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
}
ConversationOperationEnum.OPS_CODE_MAKE_PRIVATE -> ncApi!!.makeRoomPrivate(
credentials,
ApiUtils.getUrlForRoomPublic(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
ConversationOperationEnum.OPS_CODE_GET_AND_JOIN_ROOM -> ncApi!!.getRoom(
credentials,
ApiUtils.getUrlForRoom(apiVersion, baseUrl, conversationToken)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
disposable = d
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
if (conversation!!.isHasPassword && conversation!!.isGuest) {
eventBus!!.post(ConversationsListFetchDataEvent())
val bundle = Bundle()
bundle.putParcelable(KEY_ROOM, Parcels.wrap(conversation))
bundle.putString(KEY_CALL_URL, callUrl)
try {
bundle.putParcelable(
KEY_SERVER_CAPABILITIES,
Parcels.wrap<Capabilities>(
LoganSquare.parse<Capabilities>(
currentUser!!.capabilities,
Capabilities::class.java
)
)
)
} catch (e: IOException) {
Log.e(TAG, "Failed to parse capabilities for guest")
showResultImage(everythingOK = false, isGuestSupportError = false)
}
bundle.putSerializable(KEY_OPERATION_CODE, ConversationOperationEnum.OPS_CODE_JOIN_ROOM)
router.pushController(
RouterTransaction.with(EntryMenuController(bundle))
.pushChangeHandler(HorizontalChangeHandler())
.popChangeHandler(HorizontalChangeHandler())
)
} else if (conversation!!.isGuest) {
ncApi!!.joinRoom(
credentials,
ApiUtils.getUrlForParticipantsActive(
apiVersion,
baseUrl,
conversationToken
),
null
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
initiateConversation()
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
// unused atm
}
})
} else {
initiateConversation()
}
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
dispose()
}
})
ConversationOperationEnum.OPS_CODE_INVITE_USERS -> {
val retrofitBucket: RetrofitBucket
var invite: String? = null
if (invitedGroups!!.size > 0) {
invite = invitedGroups!![0]
}
retrofitBucket = if (conversationType == ConversationType.ROOM_PUBLIC_CALL) {
ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion,
currentUser!!.baseUrl,
"3",
null,
invite,
conversationName
)
} else {
ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion,
currentUser!!.baseUrl,
"2",
null,
invite,
conversationName
)
}
ncApi!!.createRoom(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
ncApi!!.getRoom(
credentials,
ApiUtils.getUrlForRoom(
apiVersion, currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(
roomOverall: RoomOverall
) {
conversation = roomOverall.getOcs().getData()
inviteUsersToAConversation()
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
// unused atm
}
})
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
dispose()
}
})
}
ConversationOperationEnum.OPS_CODE_MARK_AS_READ -> ncApi!!.setChatReadMarker(
credentials,
ApiUtils.getUrlForSetChatReadMarker(
chatApiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
),
conversation!!.lastMessage.jsonMessageId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
ConversationOperationEnum.OPS_CODE_REMOVE_FAVORITE, ConversationOperationEnum.OPS_CODE_REMOVE_FAVORITE,
ConversationOperationEnum.OPS_CODE_ADD_FAVORITE -> ConversationOperationEnum.OPS_CODE_ADD_FAVORITE -> operationToggleFavorite()
if (operation === ConversationOperationEnum.OPS_CODE_REMOVE_FAVORITE) { ConversationOperationEnum.OPS_CODE_JOIN_ROOM -> operationJoinRoom()
ncApi!!.removeConversationFromFavorites(
credentials,
ApiUtils.getUrlForRoomFavorite(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
} else {
ncApi!!.addConversationToFavorites(
credentials,
ApiUtils.getUrlForRoomFavorite(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
}
ConversationOperationEnum.OPS_CODE_JOIN_ROOM -> ncApi!!.joinRoom(
credentials,
ApiUtils.getUrlForParticipantsActive(
apiVersion,
baseUrl,
conversationToken
),
callPassword
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(roomOperationsObserver)
else -> { else -> {
} }
} }
} }
private fun apiVersion(): Int {
return ApiUtils.getConversationApiVersion(currentUser, intArrayOf(ApiUtils.APIv4, ApiUtils.APIv1))
}
private fun chatApiVersion(): Int {
return ApiUtils.getChatApiVersion(currentUser, intArrayOf(ApiUtils.APIv1))
}
private fun operationJoinRoom() {
ncApi!!.joinRoom(
credentials,
ApiUtils.getUrlForParticipantsActive(
apiVersion(),
baseUrl,
conversationToken
),
callPassword
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(RoomOperationsObserver())
}
private fun operationMarkAsRead() {
ncApi!!.setChatReadMarker(
credentials,
ApiUtils.getUrlForSetChatReadMarker(
chatApiVersion(),
currentUser!!.baseUrl,
conversation!!.getToken()
),
conversation!!.lastMessage.jsonMessageId
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(GenericOperationsObserver())
}
private fun operationMakePrivate() {
ncApi!!.makeRoomPrivate(
credentials,
ApiUtils.getUrlForRoomPublic(
apiVersion(),
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(GenericOperationsObserver())
}
private fun operationChangePassword() {
var pass: String? = ""
if (conversation!!.getPassword() != null) {
pass = conversation!!.getPassword()
}
ncApi!!.setPassword(
credentials,
ApiUtils.getUrlForRoomPassword(
apiVersion(),
currentUser!!.baseUrl,
conversation!!.getToken()
),
pass
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(GenericOperationsObserver())
}
private fun operationMakePublic() {
ncApi!!.makeRoomPublic(
credentials,
ApiUtils.getUrlForRoomPublic(
apiVersion(),
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(GenericOperationsObserver())
}
private fun operationRenameRoom() {
ncApi!!.renameRoom(
credentials,
ApiUtils.getUrlForRoom(
apiVersion(),
currentUser!!.baseUrl,
conversation!!.getToken()
),
conversation!!.getName()
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(GenericOperationsObserver())
}
private fun operationToggleFavorite() {
val genericOperationsObserver = GenericOperationsObserver()
val apiVersion = apiVersion()
if (operation === ConversationOperationEnum.OPS_CODE_REMOVE_FAVORITE) {
ncApi!!.removeConversationFromFavorites(
credentials,
ApiUtils.getUrlForRoomFavorite(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
} else {
ncApi!!.addConversationToFavorites(
credentials,
ApiUtils.getUrlForRoomFavorite(
apiVersion,
currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(genericOperationsObserver)
}
}
private fun operationInviteUsers() {
val retrofitBucket: RetrofitBucket
val apiVersion = apiVersion()
var invite: String? = null
if (invitedGroups!!.size > 0) {
invite = invitedGroups!![0]
}
retrofitBucket = if (conversationType == ConversationType.ROOM_PUBLIC_CALL) {
ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion,
currentUser!!.baseUrl,
"3",
null,
invite,
conversationName
)
} else {
ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion,
currentUser!!.baseUrl,
"2",
null,
invite,
conversationName
)
}
ncApi!!.createRoom(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
ncApi!!.getRoom(
credentials,
ApiUtils.getUrlForRoom(
apiVersion, currentUser!!.baseUrl,
conversation!!.getToken()
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(
roomOverall: RoomOverall
) {
conversation = roomOverall.getOcs().getData()
inviteUsersToAConversation()
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
// unused atm
}
})
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
dispose()
}
})
}
private fun operationGetAndJoinRoom() {
val apiVersion = apiVersion()
ncApi!!.getRoom(
credentials,
ApiUtils.getUrlForRoom(apiVersion, baseUrl, conversationToken)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(1)
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
disposable = d
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
if (conversation!!.isHasPassword && conversation!!.isGuest) {
eventBus!!.post(ConversationsListFetchDataEvent())
val bundle = Bundle()
bundle.putParcelable(KEY_ROOM, Parcels.wrap(conversation))
bundle.putString(KEY_CALL_URL, callUrl)
try {
bundle.putParcelable(
KEY_SERVER_CAPABILITIES,
Parcels.wrap<Capabilities>(
LoganSquare.parse<Capabilities>(
currentUser!!.capabilities,
Capabilities::class.java
)
)
)
} catch (e: IOException) {
Log.e(TAG, "Failed to parse capabilities for guest")
showResultImage(everythingOK = false, isGuestSupportError = false)
}
bundle.putSerializable(KEY_OPERATION_CODE, ConversationOperationEnum.OPS_CODE_JOIN_ROOM)
router.pushController(
RouterTransaction.with(EntryMenuController(bundle))
.pushChangeHandler(HorizontalChangeHandler())
.popChangeHandler(HorizontalChangeHandler())
)
} else if (conversation!!.isGuest) {
ncApi!!.joinRoom(
credentials,
ApiUtils.getUrlForParticipantsActive(
apiVersion,
baseUrl,
conversationToken
),
null
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<RoomOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(roomOverall: RoomOverall) {
conversation = roomOverall.getOcs().getData()
initiateConversation()
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
// unused atm
}
})
} else {
initiateConversation()
}
}
override fun onError(e: Throwable) {
showResultImage(everythingOK = false, isGuestSupportError = false)
dispose()
}
override fun onComplete() {
dispose()
}
})
}
@Suppress("Detekt.TooGenericExceptionCaught") @Suppress("Detekt.TooGenericExceptionCaught")
private fun showResultImage(everythingOK: Boolean, isGuestSupportError: Boolean) { private fun showResultImage(everythingOK: Boolean, isGuestSupportError: Boolean) {
try { try {
@ -578,7 +620,7 @@ class OperationsMenuController(args: Bundle) : NewBaseController(
if (localInvitedGroups!!.size > 0) { if (localInvitedGroups!!.size > 0) {
localInvitedGroups.removeAt(0) localInvitedGroups.removeAt(0)
} }
val apiVersion = ApiUtils.getConversationApiVersion(currentUser, intArrayOf(4, 1)) val apiVersion = ApiUtils.getConversationApiVersion(currentUser, API_CONVERSATION_VERSIONS)
if (localInvitedUsers!!.size > 0 || localInvitedGroups.size > 0 && if (localInvitedUsers!!.size > 0 || localInvitedGroups.size > 0 &&
CapabilitiesUtil.hasSpreedFeatureCapability(currentUser, "invite-groups-and-mails") CapabilitiesUtil.hasSpreedFeatureCapability(currentUser, "invite-groups-and-mails")
) { ) {
@ -693,7 +735,7 @@ class OperationsMenuController(args: Bundle) : NewBaseController(
showResultImage(everythingOK = false, isGuestSupportError = false) showResultImage(everythingOK = false, isGuestSupportError = false)
} else { } else {
val response = e.response() val response = e.response()
if (response != null && response.code() == 403) { if (response != null && response.code() == FORBIDDEN) {
ApplicationWideMessageHolder.getInstance() ApplicationWideMessageHolder.getInstance()
.setMessageType(ApplicationWideMessageHolder.MessageType.CALL_PASSWORD_WRONG) .setMessageType(ApplicationWideMessageHolder.MessageType.CALL_PASSWORD_WRONG)
router.popCurrentController() router.popCurrentController()
@ -752,6 +794,8 @@ class OperationsMenuController(args: Bundle) : NewBaseController(
companion object { companion object {
private const val TAG = "OperationsMenu" private const val TAG = "OperationsMenu"
private const val FORBIDDEN = 403
private val API_CONVERSATION_VERSIONS = intArrayOf(4, 1)
} }
init { init {

View File

@ -1,5 +1,5 @@
build: build:
maxIssues: 100 maxIssues: 95
weights: weights:
# complexity: 2 # complexity: 2
# LongParameterList: 1 # LongParameterList: 1