diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/account/AccountSDKModule.kt b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/account/AccountSDKModule.kt index d037ed03cfec7efb4bf1e6ab0ace7b642b5cabd4..1ce84349526f4801b859fbac3bcaf7967abab458 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/account/AccountSDKModule.kt +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/account/AccountSDKModule.kt @@ -12,6 +12,8 @@ import com.nynja.mobile.communicator.data.profile.UserContactData.CREATOR.CONTAC import com.nynja.mobile.communicator.data.profile.UserContactData.CREATOR.CONTACT_PHONE import com.nynja.mobile.communicator.data.profile.UserContactData.CREATOR.CONTACT_TWITTER import com.nynja.mobile.communicator.data.sdk.BaseSDKModule +import com.nynja.mobile.communicator.data.sdk.SDKErrors +import com.nynja.mobile.communicator.data.sdk.data.AccountRole import com.nynja.mobile.communicator.data.sdk.data.AccountStatus import com.nynja.mobile.communicator.data.sdk.data.data_impl.AccountImpl import com.nynja.mobile.communicator.data.sdk.data.data_impl.SDKError @@ -330,7 +332,7 @@ class AccountSDKModule(context: Context, communicator: NynjaCommunicator) : Base account.lastName, account.username, generateSDKAccountStatus(account.accountStatus), - generateSDKRoles(), + generateSDKRoles(),//account.accountRoles), generateSDKDate(account.birthday)) } @@ -453,7 +455,10 @@ class AccountSDKModule(context: Context, communicator: NynjaCommunicator) : Base fun deliverAccountResult(error: NYNError?, action: (ManageProfileSDKListener) -> Unit) { val sdkError = if (error != null) { val errorCode = error?.code?.let { AccountManager.errorCode(it) } - SDKError(errorCode.toString(), error.description) + val errorDesc = if (error.description.isNotEmpty()) error.description + else context.getString(SDKErrors.getProperResForErrorCode(errorCode.toString())) + + SDKError(errorCode.toString(), errorDesc) } else null deliverResult(mManageProfileListeners, sdkError, action) @@ -554,8 +559,18 @@ class AccountSDKModule(context: Context, communicator: NynjaCommunicator) : Base } private fun generateSDKRoles(): NYNAccountRoles { + return generateSDKRoles(null) + } + + private fun generateSDKRoles(accountRoles: ArrayList?): NYNAccountRoles { val roles = NYNAccountRoles() - roles.addRole(NYNAccountRole.NYN_AR_UNKNOWN) + if (accountRoles != null) { + for (role in accountRoles) { + roles.addRole(AccountRole.toSdkRole(role)) + } + } else { + roles.addRole(NYNAccountRole.NYN_AR_UNKNOWN) + } return roles } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/AccountSettingsPresenter.kt b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/AccountSettingsPresenter.kt index c1d3f1f2c3a638d4718fa21d8bac5c679584d679..58c9402704513c97bf46b6e5d81ef10a0c680f48 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/AccountSettingsPresenter.kt +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/AccountSettingsPresenter.kt @@ -18,6 +18,7 @@ import com.nynja.mobile.communicator.data.models.mqtt.Io import com.nynja.mobile.communicator.data.models.mqtt.Roster import com.nynja.mobile.communicator.data.models.nynjamodels.ProfileModel import com.nynja.mobile.communicator.data.models.nynjamodels.RosterModel +import com.nynja.mobile.communicator.data.sdk.SDKErrors import com.nynja.mobile.communicator.data.sdk.data.data_interfaces.IAccount import com.nynja.mobile.communicator.data.sdk.listeners.DefaultAccountSDKListener import com.nynja.mobile.communicator.mvp.view.AccountSettingsView @@ -39,6 +40,7 @@ import java.io.File class AccountSettingsPresenter : BasePresenter() { private var handledResponsesCount = 0 private var avatar: String? = null + private var uploadedAvatar: String? = null private val mHandler: Handler = Handler(Looper.getMainLooper()) @@ -71,6 +73,8 @@ class AccountSettingsPresenter : BasePresenter() { if (serverMessage.model is Roster) run { if (serverMessage.isSuccess(filter)) { handledResponsesCount++ + val roster = serverMessage.model as Roster + onUpdateddAvatar(roster.avatar) } } else if (serverMessage.model is Io) { @@ -85,16 +89,26 @@ class AccountSettingsPresenter : BasePresenter() { } } + override fun onFirstViewAttach() { + super.onFirstViewAttach() + mDataManager.accountSDK.attachManageProfileCallback(profileCallback) + } - override fun detachView(view: AccountSettingsView?) { + override fun onDestroy() { + super.onDestroy() mDataManager.accountSDK.detachManageProfileCallback(profileCallback) + } + + override fun detachView(view: AccountSettingsView?) { + //mDataManager.accountSDK.detachManageProfileCallback(profileCallback) + viewState.hideProgressDialog() super.detachView(view) } override fun attachView(view: AccountSettingsView?) { super.attachView(view) - mDataManager.accountSDK.attachManageProfileCallback(profileCallback) + //mDataManager.accountSDK.attachManageProfileCallback(profileCallback) setupContent() } @@ -114,13 +128,19 @@ class AccountSettingsPresenter : BasePresenter() { } fun setUserAvatar(filePath: String) { - mDataManager.saveAvatar(filePath) - mDataManager.saveUploadedAvatar(filePath) + //mDataManager.saveAvatar(filePath) mDataManager.uploadFile(NynjaAwsManager.TRANSFER_KEY_USER_AVATAR, File(filePath), object : AwsTransferWrapper() { override fun onComplete(transfer: AwsTransfer) { val avatarUrl : String? = transfer.awsTransferTasks[0].awsPayload - avatar = if (StringUtils.isNotEmpty(avatarUrl)) avatarUrl else null - //mDataManager.updateRosterAvatar(avatarUrl) + onUploadAvatarComplete(avatarUrl) + viewState.hideProgressDialog() + } + override fun onCanceled(transfer: AwsTransfer) { + viewState.hideProgressDialog() + } + + override fun onError(transfer: AwsTransfer?) { + viewState.hideProgressDialog() } }) } @@ -165,9 +185,25 @@ class AccountSettingsPresenter : BasePresenter() { } } + @Synchronized + private fun onUploadAvatarComplete(avatarUrl : String?) { + if (StringUtils.isEmpty(avatarUrl)) return; + avatar = avatarUrl + uploadedAvatar = avatarUrl + mDataManager.saveAvatar(avatarUrl) + } + @Synchronized + private fun onUpdateddAvatar(avatarUrl : String?) { + if (StringUtils.isEmpty(avatarUrl)) return; + //mDataManager.updateRosterAvatar(avatarUrl) + mDataManager.saveAvatar(avatarUrl) + mDataManager.saveUploadedAvatar(avatarUrl) + } + + @Synchronized private fun updateProfile(firstName: String, lastName: String, username: String) { mDataProvider.updateAccount( - avatar, null, null, + uploadedAvatar, null, null, firstName, lastName, username, null, null) } @@ -191,18 +227,23 @@ class AccountSettingsPresenter : BasePresenter() { }) } + @Synchronized private fun setAccountSettings(profile: ProfileModel) { val roster = profile.roster ?: return // TODO make decision for all values with "" val avatarUrl = roster.avatar ?: "" + val uploadedAvatarUrl = roster.uploadedAvatar ?: "" val inactiveTimeout = "" val firstName = roster.names ?: "" val lastName = roster.surnames ?: "" val username = roster.nick ?: "" val email = roster.email ?: "" - avatar = if (StringUtils.isNotEmpty(avatarUrl)) avatarUrl else null + avatar = if (StringUtils.isNotEmpty(avatarUrl) && + avatar == null) avatarUrl else avatar + uploadedAvatar = if (StringUtils.isNotEmpty(uploadedAvatarUrl) && + uploadedAvatar == null) uploadedAvatarUrl else uploadedAvatar val accountSettings = Content(avatarUrl, inactiveTimeout, firstName, lastName, username, email) viewState?.setContent(accountSettings) profile.account?.let { @@ -254,6 +295,8 @@ class AccountSettingsPresenter : BasePresenter() { } override fun onGetAccountInfoFinished(accountDetails: IAccount?) { + viewState.hideProgressDialog() + viewState.hideLocalProgress() mDataProvider.saveAccount(accountDetails!!) mHandler.postDelayed({ mDataManager.sendLocalEvent(AccountGetFinishedEvent()) diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/profile/AccountSettingsFragment.kt b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/profile/AccountSettingsFragment.kt index 2cccdda5f0c9e00f5b0cea793c35bcc7080588ab..da429ef4ff954c4840c00500dedaf8f16db7ff1b 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/profile/AccountSettingsFragment.kt +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/profile/AccountSettingsFragment.kt @@ -2,6 +2,8 @@ package com.nynja.mobile.communicator.ui.fragments.profile import android.Manifest import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.support.v4.content.ContextCompat import android.view.LayoutInflater import android.view.View @@ -12,6 +14,8 @@ import android.widget.TextView import butterknife.BindView import butterknife.OnClick import com.arellomobile.mvp.presenter.InjectPresenter +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.jakewharton.rxbinding2.widget.RxTextView import com.nynja.mobile.communicator.R import com.nynja.mobile.communicator.camera.data.CameraMedia @@ -64,6 +68,7 @@ class AccountSettingsFragment : BaseFragment(), AccountSettingsView { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + enableSaveButton(false) addDisposable(RxTextView.afterTextChangeEvents(mFirstName) .map { textViewAfterTextChangeEvent -> textViewAfterTextChangeEvent.view().text.toString() } .subscribeOn(Schedulers.io()) @@ -85,12 +90,20 @@ class AccountSettingsFragment : BaseFragment(), AccountSettingsView { } override fun setContent(content: AccountSettingsPresenter.Content) { - ImageUtils.loadAvatarImage(content.avatarUrl, mUserAvatar) + if (mUserAvatar != null && StringUtils.isNotEmpty(content.avatarUrl)) { + Glide.with(mUserAvatar.getContext()) + .load(content.avatarUrl) + .apply(RequestOptions() + .circleCrop()) + .into(mUserAvatar) + } else { + ImageUtils.loadAvatarImage(null, mUserAvatar) + } // mInactiveTimeout.setText(content.inactiveTimeout) - mFirstName.setText(content.firstName) - mLastName.setText(content.lastName) - mUsername.setText(content.username) + if (!(mFirstName.text.toString().contentEquals(content.firstName))) mFirstName.setText(content.firstName) + if (!(mLastName.text.toString().contentEquals(content.lastName))) mLastName.setText(content.lastName) + if (!(mUsername.text.toString().contentEquals(content.username))) mUsername.setText(content.username) // mEmail.setText(content.email) } @@ -104,7 +117,10 @@ class AccountSettingsFragment : BaseFragment(), AccountSettingsView { override fun onPickedMedia(resultData: CameraMedia) { if (resultData.file != null) { - mPresenter.setUserAvatar(resultData.file.path) + Handler(Looper.getMainLooper()).post( { + showProgressDialog() + mPresenter.setUserAvatar(resultData.file.path) + }) } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/utils/DialogFactory.java b/app/src/main/java/com/nynja/mobile/communicator/utils/DialogFactory.java index ea23d5bb11e175f9983d746e6bf5c40a0882ac16..fe1e330efe1e61909c6ac4b581f56760fe3574e3 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/utils/DialogFactory.java +++ b/app/src/main/java/com/nynja/mobile/communicator/utils/DialogFactory.java @@ -66,7 +66,16 @@ public class DialogFactory { public static void hideProgressDialog() { try { - if (progressDialog != null && progressDialog.isShowing()) progressDialog.dismiss(); + final ProgressDialog[] dialog = {progressDialog}; + progressDialog = null; + if (dialog[0] != null) { + if (dialog[0].isShowing()) { + dialog[0].setOnDismissListener(dialogInterface -> dialog[0] = null); + dialog[0].dismiss(); + } else { + dialog[0] = null; + } + } } catch (Exception ex) { Timber.e(ex); }