Unverified Commit 644d6518 authored by Lucio Maciel's avatar Lucio Maciel Committed by GitHub

Merge pull request #1844 from RocketChat/new/delete-my-account

[NEW] Adds delete own account.
parents ad7e04f5 fa6ed6cd
File mode changed from 100644 to 100755
...@@ -23,10 +23,17 @@ class OnBoardingPresenter @Inject constructor( ...@@ -23,10 +23,17 @@ class OnBoardingPresenter @Inject constructor(
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
val settingsInteractor: GetSettingsInteractor, val settingsInteractor: GetSettingsInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) : CheckServerPresenter(strategy, factory, settingsInteractor) { ) : CheckServerPresenter(
strategy = strategy,
factory = factory,
settingsInteractor = settingsInteractor,
refreshSettingsInteractor = refreshSettingsInteractor
) {
fun toSignInToYourServer() = navigator.toSignInToYourServer() fun toSignInToYourServer() = navigator.toSignInToYourServer()
fun toCreateANewServer(createServerUrl: String) = navigator.toWebPage(createServerUrl)
fun connectToCommunityServer(communityServerUrl: String) { fun connectToCommunityServer(communityServerUrl: String) {
connectToServer(communityServerUrl) { connectToServer(communityServerUrl) {
if (totalSocialAccountsEnabled == 0 && !isNewAccountCreationEnabled) { if (totalSocialAccountsEnabled == 0 && !isNewAccountCreationEnabled) {
...@@ -63,8 +70,6 @@ class OnBoardingPresenter @Inject constructor( ...@@ -63,8 +70,6 @@ class OnBoardingPresenter @Inject constructor(
} }
} }
fun toCreateANewServer(createServerUrl: String) = navigator.toWebPage(createServerUrl)
private fun connectToServer(serverUrl: String, block: () -> Unit) { private fun connectToServer(serverUrl: String, block: () -> Unit) {
launchUI(strategy) { launchUI(strategy) {
// Check if we already have an account for this server... // Check if we already have an account for this server...
...@@ -77,9 +82,9 @@ class OnBoardingPresenter @Inject constructor( ...@@ -77,9 +82,9 @@ class OnBoardingPresenter @Inject constructor(
try { try {
withContext(DefaultDispatcher) { withContext(DefaultDispatcher) {
setupConnectionInfo(serverUrl) setupConnectionInfo(serverUrl)
refreshSettingsInteractor.refresh(serverUrl)
// preparing next fragment before showing it // preparing next fragment before showing it
refreshServerAccounts()
checkEnabledAccounts(serverUrl) checkEnabledAccounts(serverUrl)
checkIfLoginFormIsEnabled() checkIfLoginFormIsEnabled()
checkIfCreateNewAccountIsEnabled() checkIfCreateNewAccountIsEnabled()
......
...@@ -25,7 +25,13 @@ class ServerPresenter @Inject constructor( ...@@ -25,7 +25,13 @@ class ServerPresenter @Inject constructor(
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
val settingsInteractor: GetSettingsInteractor, val settingsInteractor: GetSettingsInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) : CheckServerPresenter(strategy, factory, settingsInteractor, view) { ) : CheckServerPresenter(
strategy = strategy,
factory = factory,
settingsInteractor = settingsInteractor,
versionCheckView = view,
refreshSettingsInteractor = refreshSettingsInteractor
) {
fun checkServer(server: String) { fun checkServer(server: String) {
if (!server.isValidUrl()) { if (!server.isValidUrl()) {
...@@ -93,9 +99,8 @@ class ServerPresenter @Inject constructor( ...@@ -93,9 +99,8 @@ class ServerPresenter @Inject constructor(
view.showLoading() view.showLoading()
try { try {
withContext(DefaultDispatcher) { withContext(DefaultDispatcher) {
refreshSettingsInteractor.refresh(serverUrl)
// preparing next fragment before showing it // preparing next fragment before showing it
refreshServerAccounts()
checkEnabledAccounts(serverUrl) checkEnabledAccounts(serverUrl)
checkIfLoginFormIsEnabled() checkIfLoginFormIsEnabled()
checkIfCreateNewAccountIsEnabled() checkIfCreateNewAccountIsEnabled()
...@@ -112,5 +117,4 @@ class ServerPresenter @Inject constructor( ...@@ -112,5 +117,4 @@ class ServerPresenter @Inject constructor(
} }
} }
} }
} }
\ No newline at end of file
package chat.rocket.android.main.presentation package chat.rocket.android.main.presentation
import android.content.Context import android.content.Context
import chat.rocket.android.R
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.emoji.Emoji import chat.rocket.android.emoji.Emoji
...@@ -36,13 +35,9 @@ import chat.rocket.common.model.UserStatus ...@@ -36,13 +35,9 @@ import chat.rocket.common.model.UserStatus
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.getCustomEmojis import chat.rocket.core.internal.rest.getCustomEmojis
import chat.rocket.core.internal.rest.logout
import chat.rocket.core.internal.rest.me import chat.rocket.core.internal.rest.me
import chat.rocket.core.internal.rest.unregisterPushToken
import chat.rocket.core.model.Myself import chat.rocket.core.model.Myself
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.channels.Channel import kotlinx.coroutines.experimental.channels.Channel
import kotlinx.coroutines.experimental.withContext
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
...@@ -51,23 +46,33 @@ class MainPresenter @Inject constructor( ...@@ -51,23 +46,33 @@ class MainPresenter @Inject constructor(
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: MainNavigator, private val navigator: MainNavigator,
private val tokenRepository: TokenRepository, private val tokenRepository: TokenRepository,
private val serverInteractor: GetCurrentServerInteractor,
private val refreshSettingsInteractor: RefreshSettingsInteractor, private val refreshSettingsInteractor: RefreshSettingsInteractor,
private val refreshPermissionsInteractor: RefreshPermissionsInteractor, private val refreshPermissionsInteractor: RefreshPermissionsInteractor,
private val localRepository: LocalRepository,
private val navHeaderMapper: NavHeaderUiModelMapper, private val navHeaderMapper: NavHeaderUiModelMapper,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
private val removeAccountInteractor: RemoveAccountInteractor,
factory: RocketChatClientFactory,
private val groupedPush: GroupedPush, private val groupedPush: GroupedPush,
serverInteractor: GetCurrentServerInteractor,
localRepository: LocalRepository,
removeAccountInteractor: RemoveAccountInteractor,
factory: RocketChatClientFactory,
dbManagerFactory: DatabaseManagerFactory, dbManagerFactory: DatabaseManagerFactory,
getSettingsInteractor: GetSettingsInteractor, getSettingsInteractor: GetSettingsInteractor,
managerFactory: ConnectionManagerFactory managerFactory: ConnectionManagerFactory
) : CheckServerPresenter(strategy, factory, view = view) { ) : CheckServerPresenter(
strategy = strategy,
factory = factory,
serverInteractor = serverInteractor,
localRepository = localRepository,
removeAccountInteractor = removeAccountInteractor,
tokenRepository = tokenRepository,
managerFactory = managerFactory,
dbManagerFactory = dbManagerFactory,
tokenView = view,
navigator = navigator
) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private val manager = managerFactory.create(currentServer) private val manager = managerFactory.create(currentServer)
private val dbManager = dbManagerFactory.create(currentServer)
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.create(currentServer)
private var settings: PublicSettings = getSettingsInteractor.get(serverInteractor.get()!!) private var settings: PublicSettings = getSettingsInteractor.get(serverInteractor.get()!!)
private val userDataChannel = Channel<Myself>() private val userDataChannel = Channel<Myself>()
...@@ -114,9 +119,7 @@ class MainPresenter @Inject constructor( ...@@ -114,9 +119,7 @@ class MainPresenter @Inject constructor(
view.setupUserAccountInfo(model) view.setupUserAccountInfo(model)
} catch (ex: Exception) { } catch (ex: Exception) {
when (ex) { when (ex) {
is RocketChatAuthException -> { is RocketChatAuthException -> logout()
logout()
}
else -> { else -> {
Timber.d(ex, "Error loading my information for navheader") Timber.d(ex, "Error loading my information for navheader")
ex.message?.let { ex.message?.let {
...@@ -163,36 +166,9 @@ class MainPresenter @Inject constructor( ...@@ -163,36 +166,9 @@ class MainPresenter @Inject constructor(
} }
} }
/**
* Logout from current server.
*/
fun logout() { fun logout() {
launchUI(strategy) { setupConnectionInfo(currentServer)
view.showProgress() super.logout(userDataChannel)
try {
clearTokens()
retryIO("logout") { client.logout() }
} catch (exception: RocketChatException) {
Timber.d(exception, "Error calling logout")
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
try {
disconnect()
removeAccountInteractor.remove(currentServer)
tokenRepository.remove(currentServer)
withContext(CommonPool) { dbManager.logout() }
navigator.switchOrAddNewServer()
} catch (ex: Exception) {
Timber.d(ex, "Error cleaning up the session...")
}
view.hideProgress()
}
} }
fun connect() { fun connect() {
...@@ -202,8 +178,8 @@ class MainPresenter @Inject constructor( ...@@ -202,8 +178,8 @@ class MainPresenter @Inject constructor(
} }
fun disconnect() { fun disconnect() {
manager.removeUserDataChannel(userDataChannel) setupConnectionInfo(currentServer)
manager.disconnect() super.disconnect(userDataChannel)
} }
fun changeServer(serverUrl: String) { fun changeServer(serverUrl: String) {
...@@ -247,20 +223,6 @@ class MainPresenter @Inject constructor( ...@@ -247,20 +223,6 @@ class MainPresenter @Inject constructor(
saveAccountInteractor.save(account) saveAccountInteractor.save(account)
} }
private suspend fun clearTokens() {
serverInteractor.clear()
val pushToken = localRepository.get(LocalRepository.KEY_PUSH_TOKEN)
if (pushToken != null) {
try {
retryIO("unregisterPushToken") { client.unregisterPushToken(pushToken) }
view.invalidateToken(pushToken)
} catch (ex: Exception) {
Timber.d(ex, "Error unregistering push token")
}
}
localRepository.clearAllFromServer(currentServer)
}
private suspend fun subscribeMyselfUpdates() { private suspend fun subscribeMyselfUpdates() {
manager.addUserDataChannel(userDataChannel) manager.addUserDataChannel(userDataChannel)
for (myself in userDataChannel) { for (myself in userDataChannel) {
......
...@@ -4,9 +4,10 @@ import chat.rocket.android.authentication.server.presentation.VersionCheckView ...@@ -4,9 +4,10 @@ import chat.rocket.android.authentication.server.presentation.VersionCheckView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.main.uimodel.NavHeaderUiModel import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.presentation.TokenView
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
interface MainView : MessageView, VersionCheckView { interface MainView : MessageView, VersionCheckView, TokenView {
/** /**
* Shows the current user status. * Shows the current user status.
...@@ -31,8 +32,6 @@ interface MainView : MessageView, VersionCheckView { ...@@ -31,8 +32,6 @@ interface MainView : MessageView, VersionCheckView {
fun closeServerSelection() fun closeServerSelection()
fun invalidateToken(token: String)
fun showProgress() fun showProgress()
fun hideProgress() fun hideProgress()
......
...@@ -202,8 +202,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, ...@@ -202,8 +202,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
.show() .show()
} }
override fun invalidateToken(token: String) = override fun invalidateToken(token: String) = invalidateFirebaseToken(token)
invalidateFirebaseToken(token)
override fun showMessage(resId: Int) = showToast(resId) override fun showMessage(resId: Int) = showToast(resId)
...@@ -234,11 +233,11 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, ...@@ -234,11 +233,11 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
fun showLogoutDialog() { fun showLogoutDialog() {
val builder = AlertDialog.Builder(this) val builder = AlertDialog.Builder(this)
builder.setTitle(R.string.action_logout) builder.setTitle(R.string.title_are_you_sure)
builder.setMessage(R.string.title_confirmation) .setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout()}
builder.setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout()} .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() }
.setNegativeButton(R.string.action_stay) { dialog, _ -> dialog.cancel() } .create()
builder.create().show() .show()
} }
fun setAvatar(avatarUrl: String) { fun setAvatar(avatarUrl: String) {
......
...@@ -5,19 +5,31 @@ import android.net.Uri ...@@ -5,19 +5,31 @@ import android.net.Uri
import chat.rocket.android.chatroom.domain.UriInteractor import chat.rocket.android.chatroom.domain.UriInteractor
import chat.rocket.android.core.behaviours.showMessage import chat.rocket.android.core.behaviours.showMessage
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.helper.UserHelper import chat.rocket.android.helper.UserHelper
import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.RemoveAccountInteractor
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.server.presentation.CheckServerPresenter
import chat.rocket.android.util.extension.compressImageAndGetByteArray import chat.rocket.android.util.extension.compressImageAndGetByteArray
import chat.rocket.android.util.extension.gethash
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extension.toHex
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.deleteOwnAccount
import chat.rocket.core.internal.rest.resetAvatar import chat.rocket.core.internal.rest.resetAvatar
import chat.rocket.core.internal.rest.setAvatar import chat.rocket.core.internal.rest.setAvatar
import chat.rocket.core.internal.rest.updateProfile import chat.rocket.core.internal.rest.updateProfile
import kotlinx.coroutines.experimental.DefaultDispatcher
import kotlinx.coroutines.experimental.withContext
import java.lang.Exception
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
...@@ -26,8 +38,23 @@ class ProfilePresenter @Inject constructor( ...@@ -26,8 +38,23 @@ class ProfilePresenter @Inject constructor(
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val uriInteractor: UriInteractor, private val uriInteractor: UriInteractor,
val userHelper: UserHelper, val userHelper: UserHelper,
navigator: MainNavigator,
serverInteractor: GetCurrentServerInteractor, serverInteractor: GetCurrentServerInteractor,
factory: RocketChatClientFactory factory: RocketChatClientFactory,
removeAccountInteractor: RemoveAccountInteractor,
tokenRepository: TokenRepository,
dbManagerFactory: DatabaseManagerFactory,
managerFactory: ConnectionManagerFactory
) : CheckServerPresenter(
strategy = strategy,
factory = factory,
serverInteractor = serverInteractor,
removeAccountInteractor = removeAccountInteractor,
tokenRepository = tokenRepository,
dbManagerFactory = dbManagerFactory,
managerFactory = managerFactory,
tokenView = view,
navigator = navigator
) { ) {
private val serverUrl = serverInteractor.get()!! private val serverUrl = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(serverUrl) private val client: RocketChatClient = factory.create(serverUrl)
...@@ -147,4 +174,27 @@ class ProfilePresenter @Inject constructor( ...@@ -147,4 +174,27 @@ class ProfilePresenter @Inject constructor(
} }
} }
} }
fun deleteAccount(password: String) {
launchUI(strategy) {
view.showLoading()
try {
withContext(DefaultDispatcher) {
// REMARK: Backend API is only working with a lowercase hash.
// https://github.com/RocketChat/Rocket.Chat/issues/12573
retryIO { client.deleteOwnAccount(password.gethash().toHex().toLowerCase()) }
setupConnectionInfo(serverUrl)
logout(null)
}
} catch (exception: Exception) {
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
} finally {
view.hideLoading()
}
}
}
} }
\ No newline at end of file
...@@ -2,8 +2,9 @@ package chat.rocket.android.profile.presentation ...@@ -2,8 +2,9 @@ package chat.rocket.android.profile.presentation
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.server.presentation.TokenView
interface ProfileView : LoadingView, MessageView { interface ProfileView : TokenView, LoadingView, MessageView {
/** /**
* Shows the user profile. * Shows the user profile.
......
...@@ -2,6 +2,7 @@ package chat.rocket.android.profile.ui ...@@ -2,6 +2,7 @@ package chat.rocket.android.profile.ui
import DrawableHelper import DrawableHelper
import android.app.Activity import android.app.Activity
import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.os.Build import android.os.Build
...@@ -11,6 +12,8 @@ import android.view.Menu ...@@ -11,6 +12,8 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.MenuInflater
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.net.toUri import androidx.core.net.toUri
...@@ -29,6 +32,7 @@ import chat.rocket.android.util.extensions.inflate ...@@ -29,6 +32,7 @@ import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.invalidateFirebaseToken
import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.backends.pipeline.Fresco
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
...@@ -61,6 +65,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -61,6 +65,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
AndroidSupportInjection.inject(this) AndroidSupportInjection.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
} }
override fun onCreateView( override fun onCreateView(
...@@ -98,6 +103,25 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -98,6 +103,25 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
} }
} }
override fun onPrepareOptionsMenu(menu: Menu) {
if (actionMode != null) {
menu.clear()
}
super.onPrepareOptionsMenu(menu)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.profile, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_delete_account -> showDeleteAccountDialog()
}
return true
}
override fun showProfile(avatarUrl: String, name: String, username: String, email: String?) { override fun showProfile(avatarUrl: String, name: String, username: String, email: String?) {
ui { ui {
image_avatar.setImageURI(avatarUrl) image_avatar.setImageURI(avatarUrl)
...@@ -123,6 +147,8 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -123,6 +147,8 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
showMessage(getString(R.string.msg_profile_update_successfully)) showMessage(getString(R.string.msg_profile_update_successfully))
} }
override fun invalidateToken(token: String) = invalidateFirebaseToken(token)
override fun showLoading() { override fun showLoading() {
enableUserInput(false) enableUserInput(false)
ui { view_loading.isVisible = true } ui { view_loading.isVisible = true }
...@@ -148,7 +174,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -148,7 +174,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
mode.menuInflater.inflate(R.menu.profile, menu) mode.menuInflater.inflate(R.menu.action_mode_profile, menu)
mode.title = getString(R.string.title_update_profile) mode.title = getString(R.string.title_update_profile)
return true return true
} }
...@@ -239,6 +265,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -239,6 +265,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
text_username.toString() != currentUsername || text_username.toString() != currentUsername ||
text_email.toString() != currentEmail) text_email.toString() != currentEmail)
}.subscribe { isValid -> }.subscribe { isValid ->
activity?.invalidateOptionsMenu()
if (isValid) { if (isValid) {
startActionMode() startActionMode()
} else { } else {
...@@ -264,4 +291,19 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -264,4 +291,19 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
text_email.isEnabled = value text_email.isEnabled = value
} }
} }
fun showDeleteAccountDialog() {
val passwordEditText = EditText(context)
passwordEditText.hint = getString(R.string.msg_password)
val builder = AlertDialog.Builder(context)
builder.setTitle(R.string.title_are_you_sure)
.setView(passwordEditText)
.setPositiveButton(R.string.action_delete_account) { _, _ ->
presenter.deleteAccount(passwordEditText.text.toString())
}
.setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() }
.create()
.show()
}
} }
...@@ -3,7 +3,11 @@ package chat.rocket.android.server.presentation ...@@ -3,7 +3,11 @@ package chat.rocket.android.server.presentation
import chat.rocket.android.BuildConfig import chat.rocket.android.BuildConfig
import chat.rocket.android.authentication.server.presentation.VersionCheckView import chat.rocket.android.authentication.server.presentation.VersionCheckView
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.helper.OauthHelper import chat.rocket.android.helper.OauthHelper
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.PublicSettings import chat.rocket.android.server.domain.PublicSettings
import chat.rocket.android.server.domain.casLoginUrl import chat.rocket.android.server.domain.casLoginUrl
...@@ -18,6 +22,12 @@ import chat.rocket.android.server.domain.isLoginFormEnabled ...@@ -18,6 +22,12 @@ import chat.rocket.android.server.domain.isLoginFormEnabled
import chat.rocket.android.server.domain.isRegistrationEnabledForNewUsers import chat.rocket.android.server.domain.isRegistrationEnabledForNewUsers
import chat.rocket.android.server.domain.isWordpressAuthenticationEnabled import chat.rocket.android.server.domain.isWordpressAuthenticationEnabled
import chat.rocket.android.server.domain.wordpressUrl import chat.rocket.android.server.domain.wordpressUrl
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.RemoveAccountInteractor
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.RefreshSettingsInteractor
import chat.rocket.android.server.infraestructure.ConnectionManager
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.VersionInfo import chat.rocket.android.util.VersionInfo
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
...@@ -30,9 +40,15 @@ import chat.rocket.common.RocketChatException ...@@ -30,9 +40,15 @@ import chat.rocket.common.RocketChatException
import chat.rocket.common.RocketChatInvalidProtocolException import chat.rocket.common.RocketChatInvalidProtocolException
import chat.rocket.common.model.ServerInfo import chat.rocket.common.model.ServerInfo
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.logout
import chat.rocket.core.internal.rest.serverInfo import chat.rocket.core.internal.rest.serverInfo
import chat.rocket.core.internal.rest.settingsOauth import chat.rocket.core.internal.rest.settingsOauth
import chat.rocket.core.internal.rest.unregisterPushToken
import chat.rocket.core.model.Myself
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.Job import kotlinx.coroutines.experimental.Job
import kotlinx.coroutines.experimental.channels.Channel
import kotlinx.coroutines.experimental.withContext
import timber.log.Timber import timber.log.Timber
private const val SERVICE_NAME_FACEBOOK = "facebook" private const val SERVICE_NAME_FACEBOOK = "facebook"
...@@ -42,16 +58,26 @@ private const val SERVICE_NAME_LINKEDIN = "linkedin" ...@@ -42,16 +58,26 @@ private const val SERVICE_NAME_LINKEDIN = "linkedin"
private const val SERVICE_NAME_GILAB = "gitlab" private const val SERVICE_NAME_GILAB = "gitlab"
private const val SERVICE_NAME_WORDPRESS = "wordpress" private const val SERVICE_NAME_WORDPRESS = "wordpress"
abstract class CheckServerPresenter constructor( abstract class CheckServerPresenter constructor(
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val factory: RocketChatClientFactory, private val factory: RocketChatClientFactory,
private val settingsInteractor: GetSettingsInteractor? = null, private val settingsInteractor: GetSettingsInteractor? = null,
private val view: VersionCheckView? = null private val serverInteractor: GetCurrentServerInteractor? = null,
private val localRepository: LocalRepository? = null,
private val removeAccountInteractor: RemoveAccountInteractor? = null,
private val tokenRepository: TokenRepository? = null,
private val managerFactory: ConnectionManagerFactory? = null,
private val dbManagerFactory: DatabaseManagerFactory? = null,
private val versionCheckView: VersionCheckView? = null,
private val tokenView: TokenView? = null,
private val navigator: MainNavigator? = null,
private val refreshSettingsInteractor: RefreshSettingsInteractor? = null
) { ) {
private lateinit var currentServer: String private lateinit var currentServer: String
private lateinit var client: RocketChatClient private lateinit var client: RocketChatClient
private lateinit var settings: PublicSettings private lateinit var settings: PublicSettings
private lateinit var manager: ConnectionManager
private lateinit var dbManager: DatabaseManager
internal var state: String = "" internal var state: String = ""
internal var facebookOauthUrl: String? = null internal var facebookOauthUrl: String? = null
internal var githubOauthUrl: String? = null internal var githubOauthUrl: String? = null
...@@ -78,10 +104,22 @@ abstract class CheckServerPresenter constructor( ...@@ -78,10 +104,22 @@ abstract class CheckServerPresenter constructor(
internal var isNewAccountCreationEnabled = false internal var isNewAccountCreationEnabled = false
internal fun setupConnectionInfo(serverUrl: String) { internal fun setupConnectionInfo(serverUrl: String) {
settingsInteractor?.get(serverUrl)?.let { currentServer = serverUrl
client = factory.create(serverUrl)
managerFactory?.create(serverUrl)?.let {
manager = it
}
dbManagerFactory?.create(serverUrl)?.let {
dbManager = it
}
}
internal suspend fun refreshServerAccounts() {
refreshSettingsInteractor?.refresh(currentServer)
settingsInteractor?.get(currentServer)?.let {
settings = it settings = it
} }
client = factory.create(serverUrl)
state = "" state = ""
facebookOauthUrl = null facebookOauthUrl = null
...@@ -117,28 +155,28 @@ abstract class CheckServerPresenter constructor( ...@@ -117,28 +155,28 @@ abstract class CheckServerPresenter constructor(
client.serverInfo() client.serverInfo()
} }
if (serverInfo.redirected) { if (serverInfo.redirected) {
view?.updateServerUrl(serverInfo.url) versionCheckView?.updateServerUrl(serverInfo.url)
} }
val version = checkServerVersion(serverInfo) val version = checkServerVersion(serverInfo)
when (version) { when (version) {
is Version.VersionOk -> { is Version.VersionOk -> {
Timber.i("Your version is nice! (Requires: 0.62.0, Yours: ${version.version})") Timber.i("Your version is nice! (Requires: 0.62.0, Yours: ${version.version})")
view?.versionOk() versionCheckView?.versionOk()
} }
is Version.RecommendedVersionWarning -> { is Version.RecommendedVersionWarning -> {
Timber.i("Your server ${version.version} is bellow recommended version ${BuildConfig.RECOMMENDED_SERVER_VERSION}") Timber.i("Your server ${version.version} is bellow recommended version ${BuildConfig.RECOMMENDED_SERVER_VERSION}")
view?.alertNotRecommendedVersion() versionCheckView?.alertNotRecommendedVersion()
} }
is Version.OutOfDateError -> { is Version.OutOfDateError -> {
Timber.i("Oops. Looks like your server ${version.version} is out-of-date! Minimum server version required ${BuildConfig.REQUIRED_SERVER_VERSION}!") Timber.i("Oops. Looks like your server ${version.version} is out-of-date! Minimum server version required ${BuildConfig.REQUIRED_SERVER_VERSION}!")
view?.blockAndAlertNotRequiredVersion() versionCheckView?.blockAndAlertNotRequiredVersion()
} }
} }
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.d(ex, "Error getting server info") Timber.d(ex, "Error getting server info")
when (ex) { when (ex) {
is RocketChatInvalidProtocolException -> view?.errorInvalidProtocol() is RocketChatInvalidProtocolException -> versionCheckView?.errorInvalidProtocol()
else -> view?.errorCheckingServerVersion() else -> versionCheckView?.errorCheckingServerVersion()
} }
} }
} }
...@@ -162,8 +200,59 @@ abstract class CheckServerPresenter constructor( ...@@ -162,8 +200,59 @@ abstract class CheckServerPresenter constructor(
} }
} }
private fun checkEnabledOauthAccounts(services: List<Map<String,Any>>, serverUrl: String) { /**
* Logout the user from the current server.
*
* @param userDataChannel the user data channel to stop listening to changes (if currently subscribed).
*/
internal fun logout(userDataChannel: Channel<Myself>?) {
launchUI(strategy) {
try {
clearTokens()
retryIO("logout") { client.logout() }
} catch (exception: RocketChatException) {
Timber.e(exception, "Error calling logout")
}
try {
if (userDataChannel != null) {
disconnect(userDataChannel)
}
removeAccountInteractor?.remove(currentServer)
tokenRepository?.remove(currentServer)
withContext(CommonPool) { dbManager.logout() }
navigator?.switchOrAddNewServer()
} catch (ex: Exception) {
Timber.e(ex, "Error cleaning up the session...")
}
}
}
/**
* Stops listening to user data changes and disconnects the user.
*
* @param userDataChannel the user data channel to stop listening to changes.
*/
fun disconnect(userDataChannel: Channel<Myself>) {
manager.removeUserDataChannel(userDataChannel)
manager.disconnect()
}
private suspend fun clearTokens() {
serverInteractor?.clear()
val pushToken = localRepository?.get(LocalRepository.KEY_PUSH_TOKEN)
if (pushToken != null) {
try {
retryIO("unregisterPushToken") { client.unregisterPushToken(pushToken) }
tokenView?.invalidateToken(pushToken)
} catch (ex: Exception) {
Timber.e(ex, "Error unregistering push token")
}
}
localRepository?.clearAllFromServer(currentServer)
}
private fun checkEnabledOauthAccounts(services: List<Map<String,Any>>, serverUrl: String) {
if (settings.isFacebookAuthenticationEnabled()) { if (settings.isFacebookAuthenticationEnabled()) {
getServiceMap(services, SERVICE_NAME_FACEBOOK)?.let { serviceMap -> getServiceMap(services, SERVICE_NAME_FACEBOOK)?.let { serviceMap ->
getOauthClientId(serviceMap)?.let { clientId -> getOauthClientId(serviceMap)?.let { clientId ->
...@@ -552,4 +641,4 @@ abstract class CheckServerPresenter constructor( ...@@ -552,4 +641,4 @@ abstract class CheckServerPresenter constructor(
data class OutOfDateError(private val currentVersion: String) : Version(currentVersion) data class OutOfDateError(private val currentVersion: String) : Version(currentVersion)
} }
} }
\ No newline at end of file
package chat.rocket.android.server.presentation
interface TokenView {
fun invalidateToken(token: String)
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_update_profile"
android:icon="@drawable/ic_check_white_24dp"
android:title="@string/action_update" />
</menu>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/action_update_profile" android:id="@+id/action_delete_account"
android:icon="@drawable/ic_check_white_24dp" android:title="@string/action_delete_account"
android:title="@string/action_update" /> app:showAsAction="never" />
</menu> </menu>
\ No newline at end of file
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<string name="title_update_profile">Update Profil</string> <string name="title_update_profile">Update Profil</string>
<string name="title_about">Über</string> <string name="title_about">Über</string>
<string name="title_create_channel">Erstelle Raum</string> <string name="title_create_channel">Erstelle Raum</string>
<string name="title_confirmation">Are You Sure you want to logout?</string><!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string><!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Verbinde</string> <string name="action_connect">Verbinde</string>
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
<string name="action_create_channel">Erstelle Raum</string> <string name="action_create_channel">Erstelle Raum</string>
<string name="action_create">Erstelle</string> <string name="action_create">Erstelle</string>
<string name="action_logout">Abmelden</string> <string name="action_logout">Abmelden</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Dateien</string> <string name="action_files">Dateien</string>
<string name="action_confirm_password">Bestätige Passwort Änderung</string> <string name="action_confirm_password">Bestätige Passwort Änderung</string>
<string name="action_join_chat">Trete Chat bei</string> <string name="action_join_chat">Trete Chat bei</string>
...@@ -53,6 +52,7 @@ ...@@ -53,6 +52,7 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
<string name="title_update_profile">Actualización del perfil</string> <string name="title_update_profile">Actualización del perfil</string>
<string name="title_about">Acerca de</string> <string name="title_about">Acerca de</string>
<string name="title_create_channel">Crear canal</string> <string name="title_create_channel">Crear canal</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Conectar</string> <string name="action_connect">Conectar</string>
<string name="action_use_this_username">Usa este nombre de usuario</string> <string name="action_use_this_username">Usa este nombre de usuario</string>
...@@ -32,7 +33,6 @@ ...@@ -32,7 +33,6 @@
<string name="action_create_channel">Crear canal</string> <string name="action_create_channel">Crear canal</string>
<string name="action_create">Create</string> <string name="action_create">Create</string>
<string name="action_logout">Cerrar sesión</string> <string name="action_logout">Cerrar sesión</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Archivos</string> <string name="action_files">Archivos</string>
<string name="action_confirm_password">Confirmar cambio de contraseña</string> <string name="action_confirm_password">Confirmar cambio de contraseña</string>
<string name="action_join_chat">Unirse al chat</string> <string name="action_join_chat">Unirse al chat</string>
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -21,9 +21,7 @@ ...@@ -21,9 +21,7 @@
<string name="title_update_profile">Mettre à jour le profil</string> <string name="title_update_profile">Mettre à jour le profil</string>
<string name="title_about">À propos</string> <string name="title_about">À propos</string>
<string name="title_create_channel">Créer salon</string> <string name="title_create_channel">Créer salon</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Se connecter</string> <string name="action_connect">Se connecter</string>
...@@ -36,7 +34,6 @@ ...@@ -36,7 +34,6 @@
<string name="action_create_channel">Créer salon</string> <string name="action_create_channel">Créer salon</string>
<string name="action_create">Créer</string> <string name="action_create">Créer</string>
<string name="action_logout">Se déconnecter</string> <string name="action_logout">Se déconnecter</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Fichiers</string> <string name="action_files">Fichiers</string>
<string name="action_confirm_password">Confirmer le mot de passe</string> <string name="action_confirm_password">Confirmer le mot de passe</string>
<string name="action_join_chat">Rejoignez le chat</string> <string name="action_join_chat">Rejoignez le chat</string>
...@@ -55,6 +52,7 @@ ...@@ -55,6 +52,7 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
<string name="title_update_profile">प्रोफ़ाइल अपडेट करें</string> <string name="title_update_profile">प्रोफ़ाइल अपडेट करें</string>
<string name="title_about">परिचय</string> <string name="title_about">परिचय</string>
<string name="title_create_channel">चैनल बनाएं</string> <string name="title_create_channel">चैनल बनाएं</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">जुडिये</string> <string name="action_connect">जुडिये</string>
...@@ -35,7 +34,6 @@ ...@@ -35,7 +34,6 @@
<string name="action_create_channel">चैनल बनाएं</string> <string name="action_create_channel">चैनल बनाएं</string>
<string name="action_create">बनाएं</string> <string name="action_create">बनाएं</string>
<string name="action_logout">लोग आउट करें</string> <string name="action_logout">लोग आउट करें</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">फ़ाइलें</string> <string name="action_files">फ़ाइलें</string>
<string name="action_confirm_password">पासवर्ड परिवर्तन की पुष्टि करें</string> <string name="action_confirm_password">पासवर्ड परिवर्तन की पुष्टि करें</string>
<string name="action_join_chat">चैट में शामिल हों</string> <string name="action_join_chat">चैट में शामिल हों</string>
...@@ -54,6 +52,7 @@ ...@@ -54,6 +52,7 @@
<string name="action_create_server">नया सर्वर बनाएं</string> <string name="action_create_server">नया सर्वर बनाएं</string>
<string name="action_register">रजिस्टर</string> <string name="action_register">रजिस्टर</string>
<string name="action_confirm">पुष्टि करें</string> <string name="action_confirm">पुष्टि करें</string>
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -16,15 +16,14 @@ ...@@ -16,15 +16,14 @@
<string name="title_members">メンバー</string> <string name="title_members">メンバー</string>
<string name="title_counted_members">メンバー (%d)</string> <string name="title_counted_members">メンバー (%d)</string>
<string name="title_settings">設定</string> <string name="title_settings">設定</string>
<string name="title_preferences">環境設定</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">パスワードの変更</string> <string name="title_change_password">Change Password</string> <!-- TODO Add translation -->
<string name="title_admin_panel">管理パネル</string> <string name="title_admin_panel">Admin panel</string> <!-- TODO Add translation -->
<string name="title_password">パスワードの変更</string> <string name="title_password">パスワードの変更</string>
<string name="title_update_profile">プロフィールの更新</string> <string name="title_update_profile">プロフィールの更新</string>
<string name="title_about">About</string> <string name="title_about">About</string>
<string name="title_create_channel">新しいチャネルを作成</string> <string name="title_create_channel">新しいチャネルを作成します</string>
<string name="title_confirmation">ログアウトしますか?</string> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">接続</string> <string name="action_connect">接続</string>
...@@ -37,7 +36,6 @@ ...@@ -37,7 +36,6 @@
<string name="action_create_channel">チャンネル作成</string> <string name="action_create_channel">チャンネル作成</string>
<string name="action_create">作ります</string> <string name="action_create">作ります</string>
<string name="action_logout">ログアウト</string> <string name="action_logout">ログアウト</string>
<string name="action_stay">いいえ</string>
<string name="action_files">ファイル</string> <string name="action_files">ファイル</string>
<string name="action_confirm_password">変更したパスワードの確認</string> <string name="action_confirm_password">変更したパスワードの確認</string>
<string name="action_join_chat">チャットに参加</string> <string name="action_join_chat">チャットに参加</string>
...@@ -48,20 +46,21 @@ ...@@ -48,20 +46,21 @@
<string name="action_invisible">状態を隠す</string> <string name="action_invisible">状態を隠す</string>
<string name="action_drawing">絵を描く</string> <string name="action_drawing">絵を描く</string>
<string name="action_save_to_gallery">ギャラリーに保存</string> <string name="action_save_to_gallery">ギャラリーに保存</string>
<string name="action_select_photo_from_gallery">ギャラリーの写真を選択</string> <string name="action_select_photo_from_gallery">Select photo from gallery</string> <!-- TODO Add translation -->
<string name="action_take_photo">写真を撮る</string> <string name="action_take_photo">Take photo</string> <!-- TODO Add translation -->
<string name="action_reset_avatar">アバターをリセット</string> <string name="action_reset_avatar">Reset avatar</string> <!-- TODO Add translation -->
<string name="action_connect_server">サーバーに接続</string> <string name="action_connect_server">Connect with a server</string> <!-- TODO Add translation -->
<string name="action_join_community">コミュニティに参加</string> <string name="action_join_community">Join in the community</string> <!-- TODO Add translation -->
<string name="action_create_server">新規サーバーを作成</string> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">登録</string> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">確認</string> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">環境設定</item> <item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">パスワードの変更</item> <item name="item_password">Change Password</item> <!-- TODO Add translation -->
<item name="item_password">アプリ情報</item> <item name="item_password">About</item> <!-- TODO Add translation -->
<item name="item_share_app">アプリを共有する</item> <item name="item_share_app">アプリを共有する</item>
</string-array> </string-array>
...@@ -79,28 +78,28 @@ ...@@ -79,28 +78,28 @@
<string name="msg_avatar_url">アバター URL</string> <string name="msg_avatar_url">アバター URL</string>
<string name="msg_or_continue_using_social_accounts">またはソーシャルアカウントを使用する</string> <string name="msg_or_continue_using_social_accounts">またはソーシャルアカウントを使用する</string>
<string name="msg_new_user">新規ユーザー? %1$s</string> <string name="msg_new_user">新規ユーザー? %1$s</string>
<string name="msg_forgot__your_password">パスワードをお忘れですか?</string> <string name="msg_forgot__your_password">パスワードをお忘れですか? %1$s</string>
<string name="msg_reset">リセット</string> <string name="msg_reset">リセット</string>
<string name="msg_check_your_email_to_reset_your_password">メールが送信されました! パスワードを変更するためには、受信ボックスを確認してください。</string> <string name="msg_check_your_email_to_reset_your_password">メールが送信されました! パスワードを変更するためには、受信ボックスを確認してください。</string>
<string name="msg_invalid_email">有効なメールアドレスを入力してください</string> <string name="msg_invalid_email">有効なメールアドレスを入力してください</string>
<string name="msg_new_user_agreement">サインアップすることで、\n%1$s と %2$s に同意したとみなします。</string> <string name="msg_new_user_agreement">サインアップすることで、\n%1$s と %2$s に同意したとみなします。</string>
<string name="msg_today">今日</string> <string name="msg_today">Today</string> <!-- TODO Add translation -->
<string name="msg_yesterday">昨日</string> <string name="msg_yesterday">昨日</string>
<string name="msg_message">メッセージ</string> <string name="msg_message">メッセージ</string>
<string name="msg_this_room_is_read_only">この部屋は読み取り専用です</string> <string name="msg_this_room_is_read_only">この部屋は読み取り専用です</string>
<string name="msg_invalid_2fa_code">無効な 2FA コード</string> <string name="msg_invalid_2fa_code">無効な 2FA コード</string>
<string name="msg_invalid_file">無効なファイル</string> <string name="msg_invalid_file">無効なファイル</string>
<string name="msg_invalid_server_url">無効なサーバー URL</string> <string name="msg_invalid_server_url">無効なサーバー URL</string>
<string name="msg_content_description_log_in_using_facebook">Facebookでログイン</string> <string name="msg_content_description_log_in_using_facebook">Login using Facebook</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_github">Githubでログイン</string> <string name="msg_content_description_log_in_using_github">Login using Github</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_google">Googleでログイン</string> <string name="msg_content_description_log_in_using_google">Login using Google</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_linkedin">Linkedinでログイン</string> <string name="msg_content_description_log_in_using_linkedin">Login using Linkedin</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_meteor">Meteorでログイン</string> <string name="msg_content_description_log_in_using_meteor">Login using Meteor</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_twitter">Twitterでログイン</string> <string name="msg_content_description_log_in_using_twitter">Login using Twitter</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_gitlab">Gitlabでログイン</string> <string name="msg_content_description_log_in_using_gitlab">Login using Gitlab</string> <!-- TODO Add translation -->
<string name="msg_content_description_log_in_using_wordpress">WordPressでログイン</string> <string name="msg_content_description_log_in_using_wordpress">Login using WordPress</string> <!-- TODO Add translation -->
<string name="msg_content_description_send_message">メッセージを送信</string> <string name="msg_content_description_send_message">メッセージを送信</string> <!-- TODO Add translation -->
<string name="msg_content_description_show_more_login_options">その他ログインオプション</string> <string name="msg_content_description_show_more_login_options">Show more login options</string> <!-- TODO Translate-->
<string name="msg_content_description_show_attachment_options">添付ファイルオプションを表示する</string> <string name="msg_content_description_show_attachment_options">添付ファイルオプションを表示する</string>
<string name="msg_you">あなた</string> <string name="msg_you">あなた</string>
<string name="msg_unknown">不明</string> <string name="msg_unknown">不明</string>
...@@ -142,6 +141,7 @@ ...@@ -142,6 +141,7 @@
<string name="msg_file_description">ファイルの説明</string> <string name="msg_file_description">ファイルの説明</string>
<string name="msg_send">送信</string> <string name="msg_send">送信</string>
<string name="msg_sent_attachment">添付ファイルを送信しました</string> <string name="msg_sent_attachment">添付ファイルを送信しました</string>
<string name="msg_welcome_to_rocket_chat">Rocket.Chatへようこそ</string> <string name="msg_welcome_to_rocket_chat">Rocket.Chatへようこそ</string>
<string name="msg_team_communication">チームコミュニケーション</string> <string name="msg_team_communication">チームコミュニケーション</string>
<string name="msg_login_with_email"><b>e-mail</b>でログイン</string> <string name="msg_login_with_email"><b>e-mail</b>でログイン</string>
...@@ -175,14 +175,14 @@ ...@@ -175,14 +175,14 @@
<string name="msg_message_copied">メッセージをコピー</string> <string name="msg_message_copied">メッセージをコピー</string>
<string name="msg_delete_message">メッセージを削除</string> <string name="msg_delete_message">メッセージを削除</string>
<string name="msg_delete_description">このメッセージを削除してもよろしいですか?</string> <string name="msg_delete_description">このメッセージを削除してもよろしいですか?</string>
<!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">パーマリンクのコピー</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">トラッキングの分析</string> <string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<string name="msg_send_analytics_tracking">アプリ改善のための匿名統計情報を送信する</string> <string name="msg_send_analytics_tracking">Send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<string name="msg_do_not_send_analytics_tracking">アプリ改善のための匿名統計情報を送信しない</string> <string name="msg_do_not_send_analytics_tracking">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<string name="msg_not_applicable_since_it_is_a_foss_version">FOSSバージョンのため、適用できません</string> <string name="msg_not_applicable_since_it_is_a_foss_version">Not applicable since it is a FOSS version</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">ルーム名を %1$s から %2$s へ変更しました。</string> <string name="message_room_name_changed">ルーム名を %1$s から %2$s へ変更しました。</string>
...@@ -214,7 +214,7 @@ ...@@ -214,7 +214,7 @@
<string name="action_title_editing">メッセージの編集</string> <string name="action_title_editing">メッセージの編集</string>
<string name="action_msg_add_reaction">リアクションする</string> <string name="action_msg_add_reaction">リアクションする</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="action_msg_copy_permalink">パーマリンクのコピー</string> <string name="action_msg_copy_permalink">Copy permalink</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">編集は許可されていません</string> <string name="permission_editing_not_allowed">編集は許可されていません</string>
...@@ -299,7 +299,7 @@ ...@@ -299,7 +299,7 @@
<string name="menu_chatroom_sort">ソート</string> <string name="menu_chatroom_sort">ソート</string>
<string name="dialog_sort_title">ソート</string> <string name="dialog_sort_title">ソート</string>
<string name="dialog_sort_by_alphabet">アルファベット順</string> <string name="dialog_sort_by_alphabet">アルファベット順</string>
<string name="dialog_sort_by_activity">アクティビティ</string> <string name="dialog_sort_by_activity">アクティビティで並べ替える</string>
<string name="dialog_group_by_type">グループ別</string> <string name="dialog_group_by_type">グループ別</string>
<string name="dialog_group_favourites">お気に入りのグループ</string> <string name="dialog_group_favourites">お気に入りのグループ</string>
<string name="chatroom_header">ヘッダ</string> <string name="chatroom_header">ヘッダ</string>
...@@ -314,13 +314,12 @@ ...@@ -314,13 +314,12 @@
<string name="header_unknown">不明</string> <string name="header_unknown">不明</string>
<!--Notifications--> <!--Notifications-->
<string name="share_label">共有メッセージの編集</string> <string name="share_label">Edit shared message</string> <!-- TODO Add translation -->
<string name="notif_action_reply_hint">返信</string> <string name="notif_action_reply_hint">返信</string>
<string name="notif_error_sending">送信に失敗しました。もう一度お試しください。</string> <string name="notif_error_sending">送信に失敗しました。もう一度お試しください。</string>
<string name="notif_success_sending">メッセージは %1$s に送信されました!</string> <string name="notif_success_sending">メッセージは %1$s に送信されました!</string>
<string name="read_by">読者</string> <string name="read_by">読者</string>
<string name="message_information_title">メッセージ情報</string> <string name="message_information_title">メッセージ情報</string>
<!--TODO - Add proper translation-->
<string name="message_room_changed_privacy">ルームタイプを %2$s から %1$s に変更しました</string> <string name="message_room_changed_privacy">Room type changed to: %1$s by %2$s</string>
</resources> </resources>
\ No newline at end of file
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
<string name="title_update_profile">Editar perfil</string> <string name="title_update_profile">Editar perfil</string>
<string name="title_about">Sobre</string> <string name="title_about">Sobre</string>
<string name="title_create_channel">Criar chat</string> <string name="title_create_channel">Criar chat</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Você tem certeza?</string>
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Conectar</string> <string name="action_connect">Conectar</string>
...@@ -35,7 +34,6 @@ ...@@ -35,7 +34,6 @@
<string name="action_create_channel">Criar chat</string> <string name="action_create_channel">Criar chat</string>
<string name="action_create">Criar</string> <string name="action_create">Criar</string>
<string name="action_logout">Sair</string> <string name="action_logout">Sair</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Arquivos</string> <string name="action_files">Arquivos</string>
<string name="action_confirm_password">Confirme a nova senha</string> <string name="action_confirm_password">Confirme a nova senha</string>
<string name="action_join_chat">Entrar no Chat</string> <string name="action_join_chat">Entrar no Chat</string>
...@@ -49,11 +47,12 @@ ...@@ -49,11 +47,12 @@
<string name="action_select_photo_from_gallery">Escolher foto da galeria</string> <string name="action_select_photo_from_gallery">Escolher foto da galeria</string>
<string name="action_take_photo">Tirar foto</string> <string name="action_take_photo">Tirar foto</string>
<string name="action_reset_avatar">Resetar avatar</string> <string name="action_reset_avatar">Resetar avatar</string>
<string name="action_connect_server">Connect with a server</string> <!-- TODO Add translation --> <string name="action_connect_server">Conectar com um servidor</string>
<string name="action_join_community">Join in the community</string> <!-- TODO Add translation --> <string name="action_join_community">Junte-se à comunidade</string>
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Criar um novo servidor</string>
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Registrar</string>
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirmar</string>
<string name="action_delete_account">Deletar conta</string>
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
<string name="title_update_profile">Обновить профиль</string> <string name="title_update_profile">Обновить профиль</string>
<string name="title_about">О программе</string> <string name="title_about">О программе</string>
<string name="title_create_channel">Создать новый канал</string> <string name="title_create_channel">Создать новый канал</string>
<string name="title_confirmation">Вы действительно хотите выйти?</string> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Подключиться</string> <string name="action_connect">Подключиться</string>
...@@ -35,7 +34,6 @@ ...@@ -35,7 +34,6 @@
<string name="action_create_channel">Создать канал</string> <string name="action_create_channel">Создать канал</string>
<string name="action_create">Создать</string> <string name="action_create">Создать</string>
<string name="action_logout">Выйти</string> <string name="action_logout">Выйти</string>
<string name="action_stay">Остаться</string>
<string name="action_files">Файлы</string> <string name="action_files">Файлы</string>
<string name="action_confirm_password">Подтверждение изменения пароля</string> <string name="action_confirm_password">Подтверждение изменения пароля</string>
<string name="action_join_chat">Присоединиться к чату</string> <string name="action_join_chat">Присоединиться к чату</string>
...@@ -54,6 +52,7 @@ ...@@ -54,6 +52,7 @@
<string name="action_create_server">Создать новый сервер</string> <string name="action_create_server">Создать новый сервер</string>
<string name="action_register">Зарегистрировать</string> <string name="action_register">Зарегистрировать</string>
<string name="action_confirm">Подтвердить</string> <string name="action_confirm">Подтвердить</string>
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
<string name="title_update_profile">Profilinizi Düzenleyin</string> <string name="title_update_profile">Profilinizi Düzenleyin</string>
<string name="title_about">Hakkında</string> <string name="title_about">Hakkında</string>
<string name="title_create_channel">Yeni Kanal Oluştur</string> <string name="title_create_channel">Yeni Kanal Oluştur</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Bağlan</string> <string name="action_connect">Bağlan</string>
...@@ -35,7 +34,6 @@ ...@@ -35,7 +34,6 @@
<string name="action_create_channel">Yeni Kanal Oluştur</string> <string name="action_create_channel">Yeni Kanal Oluştur</string>
<string name="action_create">Oluştur</string> <string name="action_create">Oluştur</string>
<string name="action_logout">Çıkış Yap</string> <string name="action_logout">Çıkış Yap</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Dosyalar</string> <string name="action_files">Dosyalar</string>
<string name="action_confirm_password">Şifre Değişikliğini Onaylayın</string> <string name="action_confirm_password">Şifre Değişikliğini Onaylayın</string>
<string name="action_join_chat">Sohbete Bağlan</string> <string name="action_join_chat">Sohbete Bağlan</string>
...@@ -54,6 +52,7 @@ ...@@ -54,6 +52,7 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
<string name="title_update_profile">Оновити профіль</string> <string name="title_update_profile">Оновити профіль</string>
<string name="title_about">"Про програму"</string> <string name="title_about">"Про програму"</string>
<string name="title_create_channel">Створити новий канал</string> <string name="title_create_channel">Створити новий канал</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Підключитися</string> <string name="action_connect">Підключитися</string>
...@@ -35,7 +34,6 @@ ...@@ -35,7 +34,6 @@
<string name="action_create_channel">Створити канал</string> <string name="action_create_channel">Створити канал</string>
<string name="action_create">Створити</string> <string name="action_create">Створити</string>
<string name="action_logout">Вийти</string> <string name="action_logout">Вийти</string>
<string name="action_stay">Stay</string> <!-- TODO Add translation -->
<string name="action_files">Файли</string> <string name="action_files">Файли</string>
<string name="action_confirm_password">Підтвердження зміни пароля</string> <string name="action_confirm_password">Підтвердження зміни пароля</string>
<string name="action_join_chat">Приєднатися до чату</string> <string name="action_join_chat">Приєднатися до чату</string>
...@@ -54,6 +52,7 @@ ...@@ -54,6 +52,7 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
...@@ -33,7 +33,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -33,7 +33,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="title_update_profile">Update profile</string> <string name="title_update_profile">Update profile</string>
<string name="title_about">About</string> <string name="title_about">About</string>
<string name="title_create_channel">Create Channel</string> <string name="title_create_channel">Create Channel</string>
<string name="title_confirmation">Are You Sure you want to logout?</string> <string name="title_are_you_sure">Are you sure?</string>
<!-- Actions --> <!-- Actions -->
<string name="action_connect">Connect</string> <string name="action_connect">Connect</string>
...@@ -46,7 +46,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -46,7 +46,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="action_create_channel">Create channel</string> <string name="action_create_channel">Create channel</string>
<string name="action_create">Create</string> <string name="action_create">Create</string>
<string name="action_logout">Logout</string> <string name="action_logout">Logout</string>
<string name="action_stay">Stay</string>
<string name="action_files">Files</string> <string name="action_files">Files</string>
<string name="action_confirm_password">Confirm Password Change</string> <string name="action_confirm_password">Confirm Password Change</string>
<string name="action_join_chat">Join Chat</string> <string name="action_join_chat">Join Chat</string>
...@@ -65,6 +64,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -65,6 +64,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="action_create_server">Create a new server</string> <string name="action_create_server">Create a new server</string>
<string name="action_register">Register</string> <string name="action_register">Register</string>
<string name="action_confirm">Confirm</string> <string name="action_confirm">Confirm</string>
<string name="action_delete_account">Delete account</string>
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
......
package chat.rocket.android.util.extension
import java.math.BigInteger
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
@Throws(NoSuchAlgorithmException::class)
fun String.gethash(): ByteArray {
val digest = MessageDigest.getInstance("SHA-256")
digest.reset()
return digest.digest(this.toByteArray())
}
fun ByteArray.toHex(): String = String.format("%0" + this.size * 2 + "X", BigInteger(1, this))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment