Further fixes to settings

This commit is contained in:
Mario Danic 2019-12-08 15:41:07 +01:00
parent c7989f04ce
commit c3a9cca12d
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
3 changed files with 743 additions and 725 deletions

View File

@ -61,6 +61,10 @@ import com.nextcloud.talk.jobs.AccountRemovalWorker
import com.nextcloud.talk.models.RingtoneSettings import com.nextcloud.talk.models.RingtoneSettings
import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.database.UserEntity
import com.nextcloud.talk.models.json.userprofile.UserProfileOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.local.models.getCredentials
import com.nextcloud.talk.newarch.local.models.other.UserStatus
import com.nextcloud.talk.newarch.utils.getCredentials import com.nextcloud.talk.newarch.utils.getCredentials
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
@ -83,6 +87,7 @@ import com.yarolegovich.mp.MaterialStandardPreference
import com.yarolegovich.mp.MaterialSwitchPreference import com.yarolegovich.mp.MaterialSwitchPreference
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.*
import net.orange_box.storebox.listeners.OnPreferenceValueChangedListener import net.orange_box.storebox.listeners.OnPreferenceValueChangedListener
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.io.IOException import java.io.IOException
@ -175,9 +180,9 @@ class SettingsController : BaseController() {
@JvmField @JvmField
@Inject @Inject
var ncApi: NcApi? = null var ncApi: NcApi? = null
val userUtils: UserUtils by inject() val usersRepository: UsersRepository by inject()
private var saveStateHandler: LovelySaveStateHandler? = null private var saveStateHandler: LovelySaveStateHandler? = null
private var currentUser: UserEntity? = null private var currentUser: UserNgEntity? = null
private var credentials: String? = null private var credentials: String? = null
lateinit var proxyTypeChangeListener: OnPreferenceValueChangedListener<String> lateinit var proxyTypeChangeListener: OnPreferenceValueChangedListener<String>
lateinit var proxyCredentialsChangeListener: OnPreferenceValueChangedListener<Boolean> lateinit var proxyCredentialsChangeListener: OnPreferenceValueChangedListener<Boolean>
@ -193,11 +198,6 @@ class SettingsController : BaseController() {
return inflater.inflate(R.layout.controller_settings, container, false) return inflater.inflate(R.layout.controller_settings, container, false)
} }
private fun getCurrentUser() {
currentUser = userUtils.currentUser
credentials = currentUser!!.getCredentials()
}
override fun onViewBound(view: View) { override fun onViewBound(view: View) {
super.onViewBound(view) super.onViewBound(view)
setHasOptionsMenu(true) setHasOptionsMenu(true)
@ -207,8 +207,6 @@ class SettingsController : BaseController() {
.componentApplication .componentApplication
.inject(this) .inject(this)
getCurrentUser()
if (saveStateHandler == null) { if (saveStateHandler == null) {
saveStateHandler = LovelySaveStateHandler() saveStateHandler = LovelySaveStateHandler()
} }
@ -219,6 +217,114 @@ class SettingsController : BaseController() {
screenLockChangeListener = ScreenLockListener() screenLockChangeListener = ScreenLockListener()
screenLockTimeoutChangeListener = ScreenLockTimeoutListener() screenLockTimeoutChangeListener = ScreenLockTimeoutListener()
themeChangeListener = ThemeChangeListener() themeChangeListener = ThemeChangeListener()
}
private fun showLovelyDialog(
dialogId: Int,
savedInstanceState: Bundle?
) {
when (dialogId) {
ID_REMOVE_ACCOUNT_WARNING_DIALOG -> showRemoveAccountWarning(savedInstanceState)
else -> {
}
}
}
@OnClick(R.id.settings_version)
fun sendLogs() {
if (resources!!.getBoolean(R.bool.nc_is_debug)) {
LoggingUtils.sendMailWithAttachment(context!!)
}
}
override fun onSaveViewState(
view: View,
outState: Bundle
) {
saveStateHandler!!.saveInstanceState(outState)
super.onSaveViewState(view, outState)
}
override fun onRestoreViewState(
view: View,
savedViewState: Bundle
) {
super.onRestoreViewState(view, savedViewState)
if (LovelySaveStateHandler.wasDialogOnScreen(savedViewState)) {
//Dialog won't be restarted automatically, so we need to call this method.
//Each dialog knows how to restore its viewState
showLovelyDialog(LovelySaveStateHandler.getSavedDialogId(savedViewState), savedViewState)
}
}
private fun showRemoveAccountWarning(savedInstanceState: Bundle?) {
if (activity != null) {
LovelyStandardDialog(activity, LovelyStandardDialog.ButtonLayout.HORIZONTAL)
.setTopColorRes(R.color.nc_darkRed)
.setIcon(
DisplayUtils.getTintedDrawable(
resources!!,
R.drawable.ic_delete_black_24dp, R.color.bg_default
)
)
.setPositiveButtonColor(context.resources.getColor(R.color.nc_darkRed))
.setTitle(R.string.nc_settings_remove_account)
.setMessage(R.string.nc_settings_remove_confirmation)
.setPositiveButton(R.string.nc_settings_remove) { removeCurrentAccount() }
.setNegativeButton(R.string.nc_cancel, null)
.setInstanceStateHandler(ID_REMOVE_ACCOUNT_WARNING_DIALOG, saveStateHandler!!)
.setSavedInstanceState(savedInstanceState)
.show()
}
}
private fun removeCurrentAccount() {
val user = usersRepository.getActiveUser()
user!!.status = UserStatus.PENDING_DELETE
GlobalScope.launch {
val job = async {
usersRepository.updateUser(user)
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java)
.build()
WorkManager.getInstance()
.enqueue(accountRemovalWork)
}
job.await()
if (usersRepository.setAnyUserAsActive()) {
withContext(Dispatchers.Main) {
onViewBound(view!!)
onAttach(view!!)
}
} else {
router.setRoot(RouterTransaction.with(
ServerSelectionController()
)
.pushChangeHandler(VerticalChangeHandler())
.popChangeHandler(VerticalChangeHandler())
)
}
}
}
override fun onAttach(view: View) {
super.onAttach(view)
if (actionBar != null) {
actionBar!!.show()
}
GlobalScope.launch {
var hasMultipleUsers: Boolean = false
val job = async {
currentUser = usersRepository.getActiveUser()
hasMultipleUsers = usersRepository.getUsers().size > 0
credentials = currentUser!!.getCredentials()
}
job.await()
withContext(Dispatchers.Main) {
appPreferences.registerProxyTypeListener(proxyTypeChangeListener) appPreferences.registerProxyTypeListener(proxyTypeChangeListener)
appPreferences.registerProxyCredentialsListener { proxyCredentialsChangeListener } appPreferences.registerProxyCredentialsListener { proxyCredentialsChangeListener }
appPreferences.registerScreenSecurityListener { screenSecurityChangeListener } appPreferences.registerScreenSecurityListener { screenSecurityChangeListener }
@ -357,105 +463,15 @@ class SettingsController : BaseController() {
realAlias = "" realAlias = ""
} }
userUtils.createOrUpdateUser( currentUser = usersRepository.getUserWithId(currentUser!!.id!!)
null, null, null, null, null, null, null, currentUser!!.clientCertificate = realAlias
currentUser!!.id, null, realAlias, null GlobalScope.launch {
) usersRepository.updateUser(currentUser!!)
}
}, arrayOf("RSA", "EC"), null, finalHost, finalPort, }, arrayOf("RSA", "EC"), null, finalHost, finalPort,
currentUser!!.clientCertificate currentUser!!.clientCertificate
) )
} }
}
private fun showLovelyDialog(
dialogId: Int,
savedInstanceState: Bundle?
) {
when (dialogId) {
ID_REMOVE_ACCOUNT_WARNING_DIALOG -> showRemoveAccountWarning(savedInstanceState)
else -> {
}
}
}
@OnClick(R.id.settings_version)
fun sendLogs() {
if (resources!!.getBoolean(R.bool.nc_is_debug)) {
LoggingUtils.sendMailWithAttachment(context!!)
}
}
override fun onSaveViewState(
view: View,
outState: Bundle
) {
saveStateHandler!!.saveInstanceState(outState)
super.onSaveViewState(view, outState)
}
override fun onRestoreViewState(
view: View,
savedViewState: Bundle
) {
super.onRestoreViewState(view, savedViewState)
if (LovelySaveStateHandler.wasDialogOnScreen(savedViewState)) {
//Dialog won't be restarted automatically, so we need to call this method.
//Each dialog knows how to restore its viewState
showLovelyDialog(LovelySaveStateHandler.getSavedDialogId(savedViewState), savedViewState)
}
}
private fun showRemoveAccountWarning(savedInstanceState: Bundle?) {
if (activity != null) {
LovelyStandardDialog(activity, LovelyStandardDialog.ButtonLayout.HORIZONTAL)
.setTopColorRes(R.color.nc_darkRed)
.setIcon(
DisplayUtils.getTintedDrawable(
resources!!,
R.drawable.ic_delete_black_24dp, R.color.bg_default
)
)
.setPositiveButtonColor(context.resources.getColor(R.color.nc_darkRed))
.setTitle(R.string.nc_settings_remove_account)
.setMessage(R.string.nc_settings_remove_confirmation)
.setPositiveButton(R.string.nc_settings_remove) { removeCurrentAccount() }
.setNegativeButton(R.string.nc_cancel, null)
.setInstanceStateHandler(ID_REMOVE_ACCOUNT_WARNING_DIALOG, saveStateHandler!!)
.setSavedInstanceState(savedInstanceState)
.show()
}
}
private fun removeCurrentAccount() {
val otherUserExists = userUtils!!.scheduleUserForDeletionWithId(currentUser!!.id)
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java)
.build()
WorkManager.getInstance()
.enqueue(accountRemovalWork)
if (otherUserExists && view != null) {
onViewBound(view!!)
onAttach(view!!)
} else if (!otherUserExists) {
router.setRoot(
RouterTransaction.with(
ServerSelectionController()
)
.pushChangeHandler(VerticalChangeHandler())
.popChangeHandler(VerticalChangeHandler())
)
}
}
override fun onAttach(view: View) {
super.onAttach(view)
if (actionBar != null) {
actionBar!!.show()
}
getCurrentUser()
if (!TextUtils.isEmpty(currentUser!!.clientCertificate)) { if (!TextUtils.isEmpty(currentUser!!.clientCertificate)) {
certificateSetup!!.setTitle(R.string.nc_client_cert_change) certificateSetup!!.setTitle(R.string.nc_client_cert_change)
@ -613,22 +629,13 @@ class SettingsController : BaseController() {
} }
if (!TextUtils.isEmpty(displayName) && displayName != currentUser!!.displayName) { if (!TextUtils.isEmpty(displayName) && displayName != currentUser!!.displayName) {
val user = usersRepository.getUserWithId(currentUser!!.id!!)
user.displayName = displayName
GlobalScope.launch {
usersRepository.updateUser(user)
}
displayNameTextView!!.text = displayName
userUtils!!.createOrUpdateUser(
null, null, null, displayName, null, null, null, currentUser!!.id, null, null,
null
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.`as`<ObservableSubscribeProxy<UserEntity>>(
AutoDispose.autoDisposable(scopeProvider)
)
.subscribe({ userEntityResult ->
displayNameTextView!!.setText(
userEntityResult.getDisplayName()
)
},
{ throwable -> }, { Log.d(TAG, "") })
} }
}, { throwable -> }, { Log.d(TAG, "") }) }, { throwable -> }, { Log.d(TAG, "") })
@ -639,7 +646,7 @@ class SettingsController : BaseController() {
} }
} }
if (userUtils!!.users.size <= 1) { if (!hasMultipleUsers) {
switchAccountButton!!.visibility = View.GONE switchAccountButton!!.visibility = View.GONE
} }
@ -689,9 +696,15 @@ class SettingsController : BaseController() {
} else { } else {
if (messageView != null) { if (messageView != null) {
messageView!!.visibility = View.GONE messageView!!.visibility = View.GONE
} else {
// do nothing
} }
} }
} }
}
}
private fun loadAvatarImage() { private fun loadAvatarImage() {
val avatarId: String val avatarId: String
@ -756,8 +769,8 @@ class SettingsController : BaseController() {
} }
private fun hideProxyCredentials() { private fun hideProxyCredentials() {
appPreferences!!.removeProxyUsername() appPreferences.removeProxyUsername()
appPreferences!!.removeProxyPassword() appPreferences.removeProxyPassword()
settingsScreen!!.findViewById<View>(R.id.settings_proxy_username_edit) settingsScreen!!.findViewById<View>(R.id.settings_proxy_username_edit)
.visibility = View.GONE .visibility = View.GONE
settingsScreen!!.findViewById<View>(R.id.settings_proxy_password_edit) settingsScreen!!.findViewById<View>(R.id.settings_proxy_password_edit)

View File

@ -61,4 +61,8 @@ class UsersRepositoryImpl(val usersDao: UsersDao): UsersRepository {
usersDao.deleteUserWithId(id) usersDao.deleteUserWithId(id)
} }
override suspend fun setAnyUserAsActive(): Boolean {
return usersDao.setAnyUserAsActive()
}
} }

View File

@ -32,4 +32,5 @@ interface UsersRepository {
suspend fun updateUser(user: UserNgEntity): Int suspend fun updateUser(user: UserNgEntity): Int
suspend fun setUserAsActiveWithId(id: Long) suspend fun setUserAsActiveWithId(id: Long)
suspend fun deleteUserWithId(id: Long) suspend fun deleteUserWithId(id: Long)
suspend fun setAnyUserAsActive(): Boolean
} }