Commit d9845702 authored by Filipe de Lima Brito's avatar Filipe de Lima Brito

Adds analytics for Answer (Fabric).

parent 4d3e1402
...@@ -78,10 +78,8 @@ dependencies { ...@@ -78,10 +78,8 @@ dependencies {
implementation libraries.appCompat implementation libraries.appCompat
implementation libraries.recyclerview implementation libraries.recyclerview
implementation libraries.material
implementation libraries.constraintlayout implementation libraries.constraintlayout
implementation libraries.cardview implementation libraries.cardview
implementation libraries.flexbox
implementation libraries.browser implementation libraries.browser
implementation libraries.androidKtx implementation libraries.androidKtx
...@@ -90,9 +88,11 @@ dependencies { ...@@ -90,9 +88,11 @@ dependencies {
implementation libraries.daggerSupport implementation libraries.daggerSupport
kapt libraries.daggerProcessor kapt libraries.daggerProcessor
kapt libraries.daggerAndroidApt kapt libraries.daggerAndroidApt
implementation libraries.fcm implementation libraries.fcm
implementation libraries.firebaseAnalytics
implementation libraries.playServicesAuth implementation libraries.playServicesAuth
implementation libraries.flexbox
implementation libraries.material
implementation libraries.room implementation libraries.room
kapt libraries.roomProcessor kapt libraries.roomProcessor
...@@ -130,6 +130,10 @@ dependencies { ...@@ -130,6 +130,10 @@ dependencies {
transitive = true transitive = true
} }
implementation('com.crashlytics.sdk.android:answers:1.4.2@aar') {
transitive = true
}
testImplementation libraries.junit testImplementation libraries.junit
testImplementation libraries.truth testImplementation libraries.truth
androidTestImplementation libraries.espressoCore androidTestImplementation libraries.espressoCore
......
...@@ -8,24 +8,25 @@ import androidx.fragment.app.Fragment ...@@ -8,24 +8,25 @@ import androidx.fragment.app.Fragment
import chat.rocket.android.BuildConfig import chat.rocket.android.BuildConfig
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.util.helper.AnswersEvent
import kotlinx.android.synthetic.main.app_bar.* import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_about.* import kotlinx.android.synthetic.main.fragment_about.*
class AboutFragment : Fragment() { internal const val TAG_ABOUT_FRAGMENT = "AboutFragment"
companion object { class AboutFragment : Fragment() {
fun newInstance() = AboutFragment()
}
override fun onCreateView(inflater: LayoutInflater, override fun onCreateView(
container: ViewGroup?, inflater: LayoutInflater,
savedInstanceState: Bundle? container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_about, container, false) ): View? = inflater.inflate(R.layout.fragment_about, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
setupViews() setupViews()
AnswersEvent.logScreenView(TAG_ABOUT_FRAGMENT)
} }
private fun setupViews() { private fun setupViews() {
...@@ -34,16 +35,14 @@ class AboutFragment : Fragment() { ...@@ -34,16 +35,14 @@ class AboutFragment : Fragment() {
} }
private fun setupToolbar() { private fun setupToolbar() {
val toolbar = (activity as MainActivity).toolbar with((activity as MainActivity).toolbar) {
toolbar.title = getString(R.string.title_about) title = getString(R.string.title_about)
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp) setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
toolbar.setNavigationOnClickListener { setNavigationOnClickListener { activity?.onBackPressed() }
this.activity?.onBackPressed()
} }
} }
override fun onStop() { companion object {
super.onStop() fun newInstance() = AboutFragment()
(activity as MainActivity).toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp)
} }
} }
...@@ -21,6 +21,7 @@ import chat.rocket.android.server.domain.SITE_URL ...@@ -21,6 +21,7 @@ import chat.rocket.android.server.domain.SITE_URL
import chat.rocket.android.server.domain.TokenRepository import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.emoji.EmojiRepository import chat.rocket.android.emoji.EmojiRepository
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import com.crashlytics.android.answers.Answers
import com.crashlytics.android.core.CrashlyticsCore import com.crashlytics.android.core.CrashlyticsCore
import com.facebook.drawee.backends.pipeline.DraweeConfig import com.facebook.drawee.backends.pipeline.DraweeConfig
import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.backends.pipeline.Fresco
...@@ -89,7 +90,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje ...@@ -89,7 +90,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
AndroidThreeTen.init(this) AndroidThreeTen.init(this)
EmojiRepository.load(this) EmojiRepository.load(this)
setupCrashlytics() setupFabric()
setupFresco() setupFresco()
setupTimber() setupTimber()
...@@ -125,13 +126,23 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje ...@@ -125,13 +126,23 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
} }
} }
private fun setupCrashlytics() { private fun setupFabric() {
val core = CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build() val core = CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()
Fabric.with(this, Crashlytics.Builder().core(core).build()) Fabric.with(
this,
installCrashlyticsWrapper(this@RocketChatApplication, Crashlytics.Builder()
getCurrentServerInteractor, settingsInteractor, .core(core) // For Crashlytics
accountRepository, localRepository) .answers(Answers()) // For Answers
.build()
)
installCrashlyticsWrapper(
this@RocketChatApplication,
getCurrentServerInteractor,
settingsInteractor,
accountRepository,
localRepository
)
} }
private fun setupFresco() { private fun setupFresco() {
......
...@@ -40,6 +40,7 @@ import chat.rocket.android.util.extensions.parseColor ...@@ -40,6 +40,7 @@ import chat.rocket.android.util.extensions.parseColor
import chat.rocket.android.util.extensions.registerPushToken import chat.rocket.android.util.extensions.registerPushToken
import chat.rocket.android.util.extensions.samlUrl import chat.rocket.android.util.extensions.samlUrl
import chat.rocket.android.util.extensions.serverLogoUrl import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatAuthException import chat.rocket.common.RocketChatAuthException
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
...@@ -97,6 +98,7 @@ class LoginPresenter @Inject constructor( ...@@ -97,6 +98,7 @@ class LoginPresenter @Inject constructor(
private lateinit var credentialSecret: String private lateinit var credentialSecret: String
private lateinit var deepLinkUserId: String private lateinit var deepLinkUserId: String
private lateinit var deepLinkToken: String private lateinit var deepLinkToken: String
private lateinit var loginMethod: String // For Answers Log In event.
fun setupView() { fun setupView() {
setupConnectionInfo(currentServer) setupConnectionInfo(currentServer)
...@@ -118,6 +120,7 @@ class LoginPresenter @Inject constructor( ...@@ -118,6 +120,7 @@ class LoginPresenter @Inject constructor(
else -> { else -> {
this.usernameOrEmail = usernameOrEmail this.usernameOrEmail = usernameOrEmail
this.password = password this.password = password
loginMethod = AnswersEvent.LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD
doAuthentication(TYPE_LOGIN_USER_EMAIL) doAuthentication(TYPE_LOGIN_USER_EMAIL)
} }
} }
...@@ -125,17 +128,20 @@ class LoginPresenter @Inject constructor( ...@@ -125,17 +128,20 @@ class LoginPresenter @Inject constructor(
fun authenticateWithCas(casToken: String) { fun authenticateWithCas(casToken: String) {
credentialToken = casToken credentialToken = casToken
loginMethod = AnswersEvent.LOGIN_BY_CAS
doAuthentication(TYPE_LOGIN_CAS) doAuthentication(TYPE_LOGIN_CAS)
} }
fun authenticateWithSaml(samlToken: String) { fun authenticateWithSaml(samlToken: String) {
credentialToken = samlToken credentialToken = samlToken
loginMethod = AnswersEvent.LOGIN_BY_SAML
doAuthentication(TYPE_LOGIN_SAML) doAuthentication(TYPE_LOGIN_SAML)
} }
fun authenticateWithOauth(oauthToken: String, oauthSecret: String) { fun authenticateWithOauth(oauthToken: String, oauthSecret: String) {
credentialToken = oauthToken credentialToken = oauthToken
credentialSecret = oauthSecret credentialSecret = oauthSecret
loginMethod = AnswersEvent.LOGIN_OR_SIGN_UP_BY_OAUTH
doAuthentication(TYPE_LOGIN_OAUTH) doAuthentication(TYPE_LOGIN_OAUTH)
} }
...@@ -146,6 +152,7 @@ class LoginPresenter @Inject constructor( ...@@ -146,6 +152,7 @@ class LoginPresenter @Inject constructor(
deepLinkUserId = deepLinkInfo.userId deepLinkUserId = deepLinkInfo.userId
deepLinkToken = deepLinkInfo.token deepLinkToken = deepLinkInfo.token
tokenRepository.save(serverUrl, Token(deepLinkUserId, deepLinkToken)) tokenRepository.save(serverUrl, Token(deepLinkUserId, deepLinkToken))
loginMethod = AnswersEvent.LOGIN_BY_DEEP_LINK
doAuthentication(TYPE_LOGIN_DEEP_LINK) doAuthentication(TYPE_LOGIN_DEEP_LINK)
} else { } else {
// If we don't have the login credentials, just go through normal setup and user input. // If we don't have the login credentials, just go through normal setup and user input.
...@@ -465,11 +472,12 @@ class LoginPresenter @Inject constructor( ...@@ -465,11 +472,12 @@ class LoginPresenter @Inject constructor(
username = myself.username, username = myself.username,
utcOffset = myself.utcOffset utcOffset = myself.utcOffset
) )
localRepository.saveCurrentUser(url = currentServer, user = user) localRepository.saveCurrentUser(currentServer, user)
saveCurrentServer.save(currentServer) saveCurrentServer.save(currentServer)
saveAccount(myself.username!!) saveAccount(myself.username!!)
saveToken(token) saveToken(token)
registerPushToken() registerPushToken()
AnswersEvent.logLogin(loginMethod, true)
if (loginType == TYPE_LOGIN_USER_EMAIL) { if (loginType == TYPE_LOGIN_USER_EMAIL) {
view.saveSmartLockCredentials(usernameOrEmail, password) view.saveSmartLockCredentials(usernameOrEmail, password)
} }
...@@ -483,6 +491,7 @@ class LoginPresenter @Inject constructor( ...@@ -483,6 +491,7 @@ class LoginPresenter @Inject constructor(
navigator.toTwoFA(usernameOrEmail, password) navigator.toTwoFA(usernameOrEmail, password)
} }
else -> { else -> {
AnswersEvent.logLogin(loginMethod, false)
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -24,6 +24,7 @@ import chat.rocket.android.authentication.login.presentation.LoginPresenter ...@@ -24,6 +24,7 @@ import chat.rocket.android.authentication.login.presentation.LoginPresenter
import chat.rocket.android.authentication.login.presentation.LoginView import chat.rocket.android.authentication.login.presentation.LoginView
import chat.rocket.android.helper.* import chat.rocket.android.helper.*
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.android.webview.sso.ui.INTENT_SSO_TOKEN import chat.rocket.android.webview.sso.ui.INTENT_SSO_TOKEN
import chat.rocket.android.webview.sso.ui.ssoWebViewIntent import chat.rocket.android.webview.sso.ui.ssoWebViewIntent
import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_SECRET import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_SECRET
...@@ -35,6 +36,8 @@ import dagger.android.support.AndroidSupportInjection ...@@ -35,6 +36,8 @@ import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_log_in.* import kotlinx.android.synthetic.main.fragment_authentication_log_in.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_LOGIN_FRAGMENT = "LoginFragment"
internal const val REQUEST_CODE_FOR_CAS = 4 internal const val REQUEST_CODE_FOR_CAS = 4
internal const val REQUEST_CODE_FOR_SAML = 5 internal const val REQUEST_CODE_FOR_SAML = 5
internal const val REQUEST_CODE_FOR_OAUTH = 6 internal const val REQUEST_CODE_FOR_OAUTH = 6
...@@ -85,6 +88,8 @@ class LoginFragment : Fragment(), LoginView { ...@@ -85,6 +88,8 @@ class LoginFragment : Fragment(), LoginView {
}.ifNull { }.ifNull {
presenter.setupView() presenter.setupView()
} }
AnswersEvent.logScreenView(TAG_LOGIN_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -4,9 +4,14 @@ import android.content.Intent ...@@ -4,9 +4,14 @@ import android.content.Intent
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo
import chat.rocket.android.authentication.login.ui.LoginFragment import chat.rocket.android.authentication.login.ui.LoginFragment
import chat.rocket.android.authentication.login.ui.TAG_LOGIN_FRAGMENT
import chat.rocket.android.authentication.registerusername.ui.RegisterUsernameFragment import chat.rocket.android.authentication.registerusername.ui.RegisterUsernameFragment
import chat.rocket.android.authentication.registerusername.ui.TAG_REGISTER_USERNAME_FRAGMENT
import chat.rocket.android.authentication.resetpassword.ui.ResetPasswordFragment import chat.rocket.android.authentication.resetpassword.ui.ResetPasswordFragment
import chat.rocket.android.authentication.resetpassword.ui.TAG_RESET_PASSWORD_FRAGMENT
import chat.rocket.android.authentication.signup.ui.SignupFragment import chat.rocket.android.authentication.signup.ui.SignupFragment
import chat.rocket.android.authentication.signup.ui.TAG_SIGNUP_FRAGMENT
import chat.rocket.android.authentication.twofactor.ui.TAG_TWO_FA_FRAGMENT
import chat.rocket.android.authentication.twofactor.ui.TwoFAFragment import chat.rocket.android.authentication.twofactor.ui.TwoFAFragment
import chat.rocket.android.authentication.ui.AuthenticationActivity import chat.rocket.android.authentication.ui.AuthenticationActivity
import chat.rocket.android.authentication.ui.newServerIntent import chat.rocket.android.authentication.ui.newServerIntent
...@@ -19,13 +24,13 @@ import chat.rocket.android.webview.ui.webViewIntent ...@@ -19,13 +24,13 @@ import chat.rocket.android.webview.ui.webViewIntent
class AuthenticationNavigator(internal val activity: AuthenticationActivity) { class AuthenticationNavigator(internal val activity: AuthenticationActivity) {
fun toLogin() { fun toLogin() {
activity.addFragmentBackStack("LoginFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_LOGIN_FRAGMENT, R.id.fragment_container) {
LoginFragment.newInstance() LoginFragment.newInstance()
} }
} }
fun toLogin(deepLinkInfo: LoginDeepLinkInfo) { fun toLogin(deepLinkInfo: LoginDeepLinkInfo) {
activity.addFragmentBackStack("LoginFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_LOGIN_FRAGMENT, R.id.fragment_container) {
LoginFragment.newInstance(deepLinkInfo) LoginFragment.newInstance(deepLinkInfo)
} }
} }
...@@ -35,19 +40,19 @@ class AuthenticationNavigator(internal val activity: AuthenticationActivity) { ...@@ -35,19 +40,19 @@ class AuthenticationNavigator(internal val activity: AuthenticationActivity) {
} }
fun toTwoFA(username: String, password: String) { fun toTwoFA(username: String, password: String) {
activity.addFragmentBackStack("TwoFAFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_TWO_FA_FRAGMENT, R.id.fragment_container) {
TwoFAFragment.newInstance(username, password) TwoFAFragment.newInstance(username, password)
} }
} }
fun toSignUp() { fun toSignUp() {
activity.addFragmentBackStack("SignupFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_SIGNUP_FRAGMENT, R.id.fragment_container) {
SignupFragment.newInstance() SignupFragment.newInstance()
} }
} }
fun toForgotPassword() { fun toForgotPassword() {
activity.addFragmentBackStack("ResetPasswordFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_RESET_PASSWORD_FRAGMENT, R.id.fragment_container) {
ResetPasswordFragment.newInstance() ResetPasswordFragment.newInstance()
} }
} }
...@@ -58,7 +63,7 @@ class AuthenticationNavigator(internal val activity: AuthenticationActivity) { ...@@ -58,7 +63,7 @@ class AuthenticationNavigator(internal val activity: AuthenticationActivity) {
} }
fun toRegisterUsername(userId: String, authToken: String) { fun toRegisterUsername(userId: String, authToken: String) {
activity.addFragmentBackStack("RegisterUsernameFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_REGISTER_USERNAME_FRAGMENT, R.id.fragment_container) {
RegisterUsernameFragment.newInstance(userId, authToken) RegisterUsernameFragment.newInstance(userId, authToken)
} }
} }
......
...@@ -6,10 +6,11 @@ import chat.rocket.android.infrastructure.LocalRepository ...@@ -6,10 +6,11 @@ import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extensions.registerPushToken import chat.rocket.android.util.extensions.registerPushToken
import chat.rocket.android.util.extensions.serverLogoUrl import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.android.util.helper.AnswersEvent
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.model.Token import chat.rocket.common.model.Token
...@@ -51,9 +52,11 @@ class RegisterUsernamePresenter @Inject constructor( ...@@ -51,9 +52,11 @@ class RegisterUsernamePresenter @Inject constructor(
saveCurrentServer.save(currentServer) saveCurrentServer.save(currentServer)
tokenRepository.save(currentServer, Token(userId, authToken)) tokenRepository.save(currentServer, Token(userId, authToken))
registerPushToken() registerPushToken()
AnswersEvent.logSignUp(AnswersEvent.LOGIN_OR_SIGN_UP_BY_OAUTH, true)
navigator.toChatList() navigator.toChatList()
} }
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
AnswersEvent.logSignUp(AnswersEvent.LOGIN_OR_SIGN_UP_BY_OAUTH, false)
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -11,10 +11,13 @@ import chat.rocket.android.R ...@@ -11,10 +11,13 @@ import chat.rocket.android.R
import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernamePresenter import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernamePresenter
import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernameView import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernameView
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_register_username.* import kotlinx.android.synthetic.main.fragment_authentication_register_username.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_REGISTER_USERNAME_FRAGMENT = "RegisterUsernameFragment"
class RegisterUsernameFragment : Fragment(), RegisterUsernameView { class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
@Inject @Inject
lateinit var presenter: RegisterUsernamePresenter lateinit var presenter: RegisterUsernamePresenter
...@@ -61,6 +64,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ...@@ -61,6 +64,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
} }
setupOnClickListener() setupOnClickListener()
AnswersEvent.logScreenView(TAG_REGISTER_USERNAME_FRAGMENT)
} }
override fun alertBlankUsername() { override fun alertBlankUsername() {
......
...@@ -12,10 +12,13 @@ import chat.rocket.android.R ...@@ -12,10 +12,13 @@ import chat.rocket.android.R
import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordPresenter import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordPresenter
import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordView import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordView
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_reset_password.* import kotlinx.android.synthetic.main.fragment_authentication_reset_password.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_RESET_PASSWORD_FRAGMENT = "ResetPasswordFragment"
class ResetPasswordFragment : Fragment(), ResetPasswordView { class ResetPasswordFragment : Fragment(), ResetPasswordView {
@Inject @Inject
lateinit var presenter: ResetPasswordPresenter lateinit var presenter: ResetPasswordPresenter
...@@ -48,6 +51,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { ...@@ -48,6 +51,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView {
} }
setupOnClickListener() setupOnClickListener()
AnswersEvent.logScreenView(TAG_RESET_PASSWORD_FRAGMENT)
} }
override fun alertBlankEmail() { override fun alertBlankEmail() {
......
...@@ -17,12 +17,15 @@ import chat.rocket.android.authentication.server.presentation.ServerPresenter ...@@ -17,12 +17,15 @@ import chat.rocket.android.authentication.server.presentation.ServerPresenter
import chat.rocket.android.authentication.server.presentation.ServerView import chat.rocket.android.authentication.server.presentation.ServerView
import chat.rocket.android.helper.KeyboardHelper import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_server.* import kotlinx.android.synthetic.main.fragment_authentication_server.*
import okhttp3.HttpUrl import okhttp3.HttpUrl
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_SERVER_FRAGMENT = "ServerFragment"
class ServerFragment : Fragment(), ServerView { class ServerFragment : Fragment(), ServerView {
@Inject @Inject
lateinit var presenter: ServerPresenter lateinit var presenter: ServerPresenter
...@@ -100,6 +103,8 @@ class ServerFragment : Fragment(), ServerView { ...@@ -100,6 +103,8 @@ class ServerFragment : Fragment(), ServerView {
override fun onNothingSelected(parent: AdapterView<*>?) { override fun onNothingSelected(parent: AdapterView<*>?) {
} }
} }
AnswersEvent.logScreenView(TAG_SERVER_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -8,6 +8,7 @@ import chat.rocket.android.server.domain.model.Account ...@@ -8,6 +8,7 @@ import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
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
...@@ -66,9 +67,11 @@ class SignupPresenter @Inject constructor( ...@@ -66,9 +67,11 @@ class SignupPresenter @Inject constructor(
localRepository.save(LocalRepository.CURRENT_USERNAME_KEY, me.username) localRepository.save(LocalRepository.CURRENT_USERNAME_KEY, me.username)
saveAccount(me) saveAccount(me)
registerPushToken() registerPushToken()
AnswersEvent.logSignUp(AnswersEvent.LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD, true)
view.saveSmartLockCredentials(username, password) view.saveSmartLockCredentials(username, password)
navigator.toChatList() navigator.toChatList()
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
AnswersEvent.logSignUp(AnswersEvent.LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD, false)
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -19,11 +19,13 @@ import chat.rocket.android.helper.KeyboardHelper ...@@ -19,11 +19,13 @@ import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.helper.SmartLockHelper import chat.rocket.android.helper.SmartLockHelper
import chat.rocket.android.helper.TextHelper import chat.rocket.android.helper.TextHelper
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import com.google.android.gms.auth.api.credentials.Credentials import com.google.android.gms.auth.api.credentials.Credentials
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_sign_up.* import kotlinx.android.synthetic.main.fragment_authentication_sign_up.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_SIGNUP_FRAGMENT = "SignupFragment"
internal const val SAVE_CREDENTIALS = 1 internal const val SAVE_CREDENTIALS = 1
class SignupFragment : Fragment(), SignupView { class SignupFragment : Fragment(), SignupView {
...@@ -75,6 +77,8 @@ class SignupFragment : Fragment(), SignupView { ...@@ -75,6 +77,8 @@ class SignupFragment : Fragment(), SignupView {
text_email.textContent text_email.textContent
) )
} }
AnswersEvent.logScreenView(TAG_SIGNUP_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -6,10 +6,11 @@ import chat.rocket.android.infrastructure.LocalRepository ...@@ -6,10 +6,11 @@ import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extensions.registerPushToken import chat.rocket.android.util.extensions.registerPushToken
import chat.rocket.android.util.extensions.serverLogoUrl import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatAuthException import chat.rocket.common.RocketChatAuthException
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
...@@ -20,23 +21,29 @@ import chat.rocket.core.internal.rest.me ...@@ -20,23 +21,29 @@ import chat.rocket.core.internal.rest.me
import chat.rocket.core.model.Myself import chat.rocket.core.model.Myself
import javax.inject.Inject import javax.inject.Inject
class TwoFAPresenter @Inject constructor(private val view: TwoFAView, class TwoFAPresenter @Inject constructor(
private val strategy: CancelStrategy, private val view: TwoFAView,
private val navigator: AuthenticationNavigator, private val strategy: CancelStrategy,
private val tokenRepository: TokenRepository, private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository, private val tokenRepository: TokenRepository,
private val serverInteractor: GetConnectingServerInteractor, private val localRepository: LocalRepository,
private val saveCurrentServerInteractor: SaveCurrentServerInteractor, private val serverInteractor: GetConnectingServerInteractor,
private val factory: RocketChatClientFactory, private val saveCurrentServerInteractor: SaveCurrentServerInteractor,
private val saveAccountInteractor: SaveAccountInteractor, private val factory: RocketChatClientFactory,
private val getAccountsInteractor: GetAccountsInteractor, private val saveAccountInteractor: SaveAccountInteractor,
settingsInteractor: GetSettingsInteractor) { private val getAccountsInteractor: GetAccountsInteractor,
settingsInteractor: GetSettingsInteractor
) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.create(currentServer)
private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!) private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!)
// TODO: If the usernameOrEmail and password was informed by the user on the previous screen, then we should pass only the pin, like this: fun authenticate(pin: EditText) // TODO: If the usernameOrEmail and password was informed by the user on the previous screen, then we should pass only the pin, like this: fun authenticate(pin: EditText)
fun authenticate(usernameOrEmail: String, password: String, twoFactorAuthenticationCode: String) { fun authenticate(
usernameOrEmail: String,
password: String,
twoFactorAuthenticationCode: String
) {
val server = serverInteractor.get() val server = serverInteractor.get()
when { when {
server == null -> { server == null -> {
...@@ -59,11 +66,13 @@ class TwoFAPresenter @Inject constructor(private val view: TwoFAView, ...@@ -59,11 +66,13 @@ class TwoFAPresenter @Inject constructor(private val view: TwoFAView,
saveCurrentServerInteractor.save(currentServer) saveCurrentServerInteractor.save(currentServer)
tokenRepository.save(server, token) tokenRepository.save(server, token)
registerPushToken() registerPushToken()
AnswersEvent.logLogin(AnswersEvent.LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD, true)
navigator.toChatList() navigator.toChatList()
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
if (exception is RocketChatAuthException) { if (exception is RocketChatAuthException) {
view.alertInvalidTwoFactorAuthenticationCode() view.alertInvalidTwoFactorAuthenticationCode()
} else { } else {
AnswersEvent.logLogin(AnswersEvent.LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD, false)
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -13,10 +13,13 @@ import chat.rocket.android.R ...@@ -13,10 +13,13 @@ import chat.rocket.android.R
import chat.rocket.android.authentication.twofactor.presentation.TwoFAPresenter import chat.rocket.android.authentication.twofactor.presentation.TwoFAPresenter
import chat.rocket.android.authentication.twofactor.presentation.TwoFAView import chat.rocket.android.authentication.twofactor.presentation.TwoFAView
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.*
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_authentication_two_fa.* import kotlinx.android.synthetic.main.fragment_authentication_two_fa.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_TWO_FA_FRAGMENT = "TwoFAFragment"
class TwoFAFragment : Fragment(), TwoFAView { class TwoFAFragment : Fragment(), TwoFAView {
@Inject lateinit var presenter: TwoFAPresenter @Inject lateinit var presenter: TwoFAPresenter
lateinit var username: String lateinit var username: String
...@@ -60,6 +63,7 @@ class TwoFAFragment : Fragment(), TwoFAView { ...@@ -60,6 +63,7 @@ class TwoFAFragment : Fragment(), TwoFAView {
} }
setupOnClickListener() setupOnClickListener()
AnswersEvent.logScreenView(TAG_TWO_FA_FRAGMENT)
} }
override fun alertBlankTwoFactorAuthenticationCode() { override fun alertBlankTwoFactorAuthenticationCode() {
......
...@@ -10,6 +10,7 @@ import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo ...@@ -10,6 +10,7 @@ import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo
import chat.rocket.android.authentication.domain.model.getLoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.getLoginDeepLinkInfo
import chat.rocket.android.authentication.presentation.AuthenticationPresenter import chat.rocket.android.authentication.presentation.AuthenticationPresenter
import chat.rocket.android.authentication.server.ui.ServerFragment import chat.rocket.android.authentication.server.ui.ServerFragment
import chat.rocket.android.authentication.server.ui.TAG_SERVER_FRAGMENT
import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.addFragment
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
...@@ -64,7 +65,7 @@ class AuthenticationActivity : AppCompatActivity(), HasSupportFragmentInjector { ...@@ -64,7 +65,7 @@ class AuthenticationActivity : AppCompatActivity(), HasSupportFragmentInjector {
} }
fun showServerInput(deepLinkInfo: LoginDeepLinkInfo?) { fun showServerInput(deepLinkInfo: LoginDeepLinkInfo?) {
addFragment("ServerFragment", R.id.fragment_container, allowStateLoss = true) { addFragment(TAG_SERVER_FRAGMENT, R.id.fragment_container, allowStateLoss = true) {
ServerFragment.newInstance(deepLinkInfo) ServerFragment.newInstance(deepLinkInfo)
} }
} }
......
...@@ -6,7 +6,6 @@ import android.os.Bundle ...@@ -6,7 +6,6 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatinformation.ui.MessageInfoFragment.Companion.TAG_MESSAGE_INFO_FRAGMENT
import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.addFragment
import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.textContent
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
......
...@@ -16,6 +16,7 @@ import chat.rocket.android.chatinformation.viewmodel.ReadReceiptViewModel ...@@ -16,6 +16,7 @@ import chat.rocket.android.chatinformation.viewmodel.ReadReceiptViewModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.core.model.ReadReceipt import chat.rocket.core.model.ReadReceipt
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_message_info.* import kotlinx.android.synthetic.main.fragment_message_info.*
...@@ -29,6 +30,7 @@ fun newInstance(messageId: String): Fragment { ...@@ -29,6 +30,7 @@ fun newInstance(messageId: String): Fragment {
} }
} }
internal const val TAG_MESSAGE_INFO_FRAGMENT = "MessageInfoFragment"
private const val BUNDLE_MESSAGE_ID = "message_id" private const val BUNDLE_MESSAGE_ID = "message_id"
class MessageInfoFragment : Fragment(), MessageInfoView { class MessageInfoFragment : Fragment(), MessageInfoView {
...@@ -64,6 +66,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -64,6 +66,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupRecyclerView() setupRecyclerView()
presenter.loadReadReceipts(messageId = messageId) presenter.loadReadReceipts(messageId = messageId)
AnswersEvent.logScreenView(TAG_MESSAGE_INFO_FRAGMENT)
} }
private fun setupRecyclerView() { private fun setupRecyclerView() {
...@@ -93,8 +96,4 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -93,8 +96,4 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
override fun showReadReceipts(messageReceipts: List<ReadReceiptViewModel>) { override fun showReadReceipts(messageReceipts: List<ReadReceiptViewModel>) {
adapter.addAll(messageReceipts) adapter.addAll(messageReceipts)
} }
companion object {
const val TAG_MESSAGE_INFO_FRAGMENT = "MessageInfoFragment"
}
} }
...@@ -4,37 +4,42 @@ import chat.rocket.android.R ...@@ -4,37 +4,42 @@ import chat.rocket.android.R
import chat.rocket.android.chatinformation.ui.messageInformationIntent import chat.rocket.android.chatinformation.ui.messageInformationIntent
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.ui.chatRoomIntent import chat.rocket.android.chatroom.ui.chatRoomIntent
import chat.rocket.android.favoritemessages.ui.TAG_FAVORITE_MESSAGES_FRAGMENT
import chat.rocket.android.files.ui.TAG_FILES_FRAGMENT
import chat.rocket.android.members.ui.TAG_MEMBERS_FRAGMENT
import chat.rocket.android.mentions.ui.TAG_MENTIONS_FRAGMENT
import chat.rocket.android.pinnedmessages.ui.TAG_PINNED_MESSAGES_FRAGMENT
import chat.rocket.android.server.ui.changeServerIntent import chat.rocket.android.server.ui.changeServerIntent
import chat.rocket.android.util.extensions.addFragmentBackStack import chat.rocket.android.util.extensions.addFragmentBackStack
class ChatRoomNavigator(internal val activity: ChatRoomActivity) { class ChatRoomNavigator(internal val activity: ChatRoomActivity) {
fun toMembersList(chatRoomId: String) { fun toMembersList(chatRoomId: String) {
activity.addFragmentBackStack("MembersFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_MEMBERS_FRAGMENT, R.id.fragment_container) {
chat.rocket.android.members.ui.newInstance(chatRoomId) chat.rocket.android.members.ui.newInstance(chatRoomId)
} }
} }
fun toMentions(chatRoomId: String) { fun toMentions(chatRoomId: String) {
activity.addFragmentBackStack("MentionsFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_MENTIONS_FRAGMENT, R.id.fragment_container) {
chat.rocket.android.mentions.ui.newInstance(chatRoomId) chat.rocket.android.mentions.ui.newInstance(chatRoomId)
} }
} }
fun toPinnedMessageList(chatRoomId: String) { fun toPinnedMessageList(chatRoomId: String) {
activity.addFragmentBackStack("PinnedMessages", R.id.fragment_container) { activity.addFragmentBackStack(TAG_PINNED_MESSAGES_FRAGMENT, R.id.fragment_container) {
chat.rocket.android.pinnedmessages.ui.newInstance(chatRoomId) chat.rocket.android.pinnedmessages.ui.newInstance(chatRoomId)
} }
} }
fun toFavoriteMessageList(chatRoomId: String) { fun toFavoriteMessageList(chatRoomId: String) {
activity.addFragmentBackStack("FavoriteMessages", R.id.fragment_container) { activity.addFragmentBackStack(TAG_FAVORITE_MESSAGES_FRAGMENT, R.id.fragment_container) {
chat.rocket.android.favoritemessages.ui.newInstance(chatRoomId) chat.rocket.android.favoritemessages.ui.newInstance(chatRoomId)
} }
} }
fun toFileList(chatRoomId: String) { fun toFileList(chatRoomId: String) {
activity.addFragmentBackStack("Files", R.id.fragment_container) { activity.addFragmentBackStack(TAG_FILES_FRAGMENT, R.id.fragment_container) {
chat.rocket.android.files.ui.newInstance(chatRoomId) chat.rocket.android.files.ui.newInstance(chatRoomId)
} }
} }
......
...@@ -33,6 +33,7 @@ import chat.rocket.android.server.infraestructure.state ...@@ -33,6 +33,7 @@ import chat.rocket.android.server.infraestructure.state
import chat.rocket.android.util.extension.compressImageAndGetInputStream import chat.rocket.android.util.extension.compressImageAndGetInputStream
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.helper.AnswersEvent
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.model.RoomType import chat.rocket.common.model.RoomType
...@@ -107,7 +108,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -107,7 +108,7 @@ class ChatRoomPresenter @Inject constructor(
private val messagesChannel = Channel<Message>() private val messagesChannel = Channel<Message>()
private var chatRoomId: String? = null private var chatRoomId: String? = null
private var chatRoomType: String? = null private lateinit var chatRoomType: String
private var chatIsBroadcast: Boolean = false private var chatIsBroadcast: Boolean = false
private var chatRoles = emptyList<ChatRoomRole>() private var chatRoles = emptyList<ChatRoomRole>()
private val stateChannel = Channel<State>() private val stateChannel = Channel<State>()
...@@ -261,7 +262,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -261,7 +262,7 @@ class ChatRoomPresenter @Inject constructor(
try { try {
// ignore message for now, will receive it on the stream // ignore message for now, will receive it on the stream
val id = UUID.randomUUID().toString() val id = UUID.randomUUID().toString()
val message = if (messageId == null) { if (messageId == null) {
val username = userHelper.username() val username = userHelper.username()
val newMessage = Message( val newMessage = Message(
id = id, id = id,
...@@ -296,6 +297,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -296,6 +297,7 @@ class ChatRoomPresenter @Inject constructor(
), false ), false
) )
client.sendMessage(id, chatRoomId, text) client.sendMessage(id, chatRoomId, text)
AnswersEvent.logMessageSent(chatRoomType, currentServer)
} catch (ex: Exception) { } catch (ex: Exception) {
// Ok, not very beautiful, but the backend sends us a not valid response // Ok, not very beautiful, but the backend sends us a not valid response
// When someone sends a message on a read-only channel, so we just ignore it // When someone sends a message on a read-only channel, so we just ignore it
...@@ -366,6 +368,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -366,6 +368,7 @@ class ChatRoomPresenter @Inject constructor(
inputStream inputStream
} }
} }
AnswersEvent.logMediaUploaded(chatRoomType, mimeType)
} }
} }
} }
...@@ -938,6 +941,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -938,6 +941,7 @@ class ChatRoomPresenter @Inject constructor(
retryIO("toggleEmoji($messageId, $emoji)") { retryIO("toggleEmoji($messageId, $emoji)") {
client.toggleReaction(messageId, emoji.removeSurrounding(":")) client.toggleReaction(messageId, emoji.removeSurrounding(":"))
} }
AnswersEvent.logReaction(chatRoomType)
} catch (ex: RocketChatException) { } catch (ex: RocketChatException) {
Timber.e(ex) Timber.e(ex)
} }
......
...@@ -6,8 +6,6 @@ import android.content.Intent ...@@ -6,8 +6,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.text.SpannableStringBuilder
import androidx.core.view.isVisible
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.presentation.ChatRoomNavigator import chat.rocket.android.chatroom.presentation.ChatRoomNavigator
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
...@@ -169,8 +167,4 @@ class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector { ...@@ -169,8 +167,4 @@ class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector {
super.onBackPressed() super.onBackPressed()
overridePendingTransition(R.anim.close_enter, R.anim.close_exit) overridePendingTransition(R.anim.close_enter, R.anim.close_exit)
} }
companion object {
const val TAG_CHAT_ROOM_FRAGMENT = "ChatRoomFragment"
}
} }
\ No newline at end of file
...@@ -65,6 +65,7 @@ import chat.rocket.android.util.extensions.rotateBy ...@@ -65,6 +65,7 @@ import chat.rocket.android.util.extensions.rotateBy
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.helper.AnswersEvent
import chat.rocket.common.model.RoomType import chat.rocket.common.model.RoomType
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
...@@ -107,6 +108,8 @@ fun newInstance( ...@@ -107,6 +108,8 @@ fun newInstance(
} }
} }
internal const val TAG_CHAT_ROOM_FRAGMENT = "ChatRoomFragment"
private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id" private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id"
private const val BUNDLE_CHAT_ROOM_NAME = "chat_room_name" private const val BUNDLE_CHAT_ROOM_NAME = "chat_room_name"
private const val BUNDLE_CHAT_ROOM_TYPE = "chat_room_type" private const val BUNDLE_CHAT_ROOM_TYPE = "chat_room_type"
...@@ -228,6 +231,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -228,6 +231,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
it.showToolbarTitle(chatRoomName) it.showToolbarTitle(chatRoomName)
it.showToolbarChatRoomIcon(chatRoomType) it.showToolbarChatRoomIcon(chatRoomType)
} }
AnswersEvent.logScreenView(TAG_CHAT_ROOM_FRAGMENT)
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
......
...@@ -38,6 +38,7 @@ import chat.rocket.android.util.extensions.fadeOut ...@@ -38,6 +38,7 @@ import chat.rocket.android.util.extensions.fadeOut
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.android.widget.DividerItemDecoration import chat.rocket.android.widget.DividerItemDecoration
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
...@@ -45,6 +46,8 @@ import kotlinx.android.synthetic.main.fragment_chat_rooms.* ...@@ -45,6 +46,8 @@ import kotlinx.android.synthetic.main.fragment_chat_rooms.*
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_CHAT_ROOMS_FRAGMENT = "ChatRoomsFragment"
private const val BUNDLE_CHAT_ROOM_ID = "BUNDLE_CHAT_ROOM_ID" private const val BUNDLE_CHAT_ROOM_ID = "BUNDLE_CHAT_ROOM_ID"
class ChatRoomsFragment : Fragment(), ChatRoomsView { class ChatRoomsFragment : Fragment(), ChatRoomsView {
...@@ -108,6 +111,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -108,6 +111,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
subscribeUi() subscribeUi()
setupToolbar() setupToolbar()
AnswersEvent.logScreenView(TAG_CHAT_ROOMS_FRAGMENT)
} }
private fun subscribeUi() { private fun subscribeUi() {
......
...@@ -24,6 +24,7 @@ import chat.rocket.android.util.extension.asObservable ...@@ -24,6 +24,7 @@ import chat.rocket.android.util.extension.asObservable
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.common.model.RoomType import chat.rocket.common.model.RoomType
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
...@@ -34,6 +35,8 @@ import kotlinx.android.synthetic.main.fragment_create_channel.* ...@@ -34,6 +35,8 @@ import kotlinx.android.synthetic.main.fragment_create_channel.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_CREATE_CHANNEL_FRAGMENT = "CreateChannelFragment"
class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback { class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback {
@Inject @Inject
lateinit var createChannelPresenter: CreateChannelPresenter lateinit var createChannelPresenter: CreateChannelPresenter
...@@ -69,6 +72,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -69,6 +72,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
setupViewListeners() setupViewListeners()
setupRecyclerView() setupRecyclerView()
subscribeEditTexts() subscribeEditTexts()
AnswersEvent.logScreenView(TAG_CREATE_CHANNEL_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -25,6 +25,7 @@ import chat.rocket.android.main.ui.MainActivity ...@@ -25,6 +25,7 @@ import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.members.di.MembersFragmentProvider import chat.rocket.android.members.di.MembersFragmentProvider
import chat.rocket.android.mentions.di.MentionsFragmentProvider import chat.rocket.android.mentions.di.MentionsFragmentProvider
import chat.rocket.android.pinnedmessages.di.PinnedMessagesFragmentProvider import chat.rocket.android.pinnedmessages.di.PinnedMessagesFragmentProvider
import chat.rocket.android.preferences.di.PreferencesFragmentProvider
import chat.rocket.android.profile.di.ProfileFragmentProvider import chat.rocket.android.profile.di.ProfileFragmentProvider
import chat.rocket.android.server.di.ChangeServerModule import chat.rocket.android.server.di.ChangeServerModule
import chat.rocket.android.server.ui.ChangeServerActivity import chat.rocket.android.server.ui.ChangeServerActivity
...@@ -56,7 +57,8 @@ abstract class ActivityBuilder { ...@@ -56,7 +57,8 @@ abstract class ActivityBuilder {
ChatRoomsFragmentProvider::class, ChatRoomsFragmentProvider::class,
CreateChannelProvider::class, CreateChannelProvider::class,
ProfileFragmentProvider::class, ProfileFragmentProvider::class,
SettingsFragmentProvider::class SettingsFragmentProvider::class,
PreferencesFragmentProvider::class
] ]
) )
abstract fun bindMainActivity(): MainActivity abstract fun bindMainActivity(): MainActivity
......
...@@ -21,32 +21,8 @@ import chat.rocket.android.infrastructure.LocalRepository ...@@ -21,32 +21,8 @@ import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesLocalRepository import chat.rocket.android.infrastructure.SharedPreferencesLocalRepository
import chat.rocket.android.push.GroupedPush import chat.rocket.android.push.GroupedPush
import chat.rocket.android.push.PushManager import chat.rocket.android.push.PushManager
import chat.rocket.android.server.domain.AccountsRepository import chat.rocket.android.server.domain.*
import chat.rocket.android.server.domain.ActiveUsersRepository import chat.rocket.android.server.infraestructure.*
import chat.rocket.android.server.domain.ChatRoomsRepository
import chat.rocket.android.server.domain.CurrentServerRepository
import chat.rocket.android.server.domain.GetAccountInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.JobSchedulerInteractor
import chat.rocket.android.server.domain.MessagesRepository
import chat.rocket.android.server.domain.MultiServerTokenRepository
import chat.rocket.android.server.domain.PermissionsRepository
import chat.rocket.android.server.domain.RoomRepository
import chat.rocket.android.server.domain.SettingsRepository
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.UsersRepository
import chat.rocket.android.server.infraestructure.JobSchedulerInteractorImpl
import chat.rocket.android.server.infraestructure.MemoryActiveUsersRepository
import chat.rocket.android.server.infraestructure.MemoryChatRoomsRepository
import chat.rocket.android.server.infraestructure.MemoryRoomRepository
import chat.rocket.android.server.infraestructure.MemoryUsersRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesAccountsRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesMessagesRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesPermissionsRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesSettingsRepository
import chat.rocket.android.server.infraestructure.SharedPrefsConnectingServerRepository
import chat.rocket.android.server.infraestructure.SharedPrefsCurrentServerRepository
import chat.rocket.android.util.AppJsonAdapterFactory import chat.rocket.android.util.AppJsonAdapterFactory
import chat.rocket.android.util.HttpLoggingInterceptor import chat.rocket.android.util.HttpLoggingInterceptor
import chat.rocket.android.util.TimberLogger import chat.rocket.android.util.TimberLogger
...@@ -163,6 +139,12 @@ class AppModule { ...@@ -163,6 +139,12 @@ class AppModule {
return SharedPrefsCurrentServerRepository(prefs) return SharedPrefsCurrentServerRepository(prefs)
} }
@Provides
@Singleton
fun provideAnalyticsTrackingRepository(prefs: SharedPreferences): AnalyticsTrackingRepository {
return SharedPrefsAnalyticsTrackingRepository(prefs)
}
@Provides @Provides
@ForAuthentication @ForAuthentication
fun provideConnectingServerRepository(prefs: SharedPreferences): CurrentServerRepository { fun provideConnectingServerRepository(prefs: SharedPreferences): CurrentServerRepository {
......
...@@ -19,6 +19,7 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener ...@@ -19,6 +19,7 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_favorite_messages.* import kotlinx.android.synthetic.main.fragment_favorite_messages.*
import javax.inject.Inject import javax.inject.Inject
...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment { ...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment {
} }
} }
internal const val TAG_FAVORITE_MESSAGES_FRAGMENT = "FavoriteMessagesFragment"
private const val INTENT_CHAT_ROOM_ID = "chat_room_id" private const val INTENT_CHAT_ROOM_ID = "chat_room_id"
class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
...@@ -61,6 +63,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { ...@@ -61,6 +63,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
presenter.loadFavoriteMessages(chatRoomId) presenter.loadFavoriteMessages(chatRoomId)
AnswersEvent.logScreenView(TAG_FAVORITE_MESSAGES_FRAGMENT)
} }
override fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>) { override fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>) {
......
...@@ -24,6 +24,7 @@ import chat.rocket.android.player.PlayerActivity ...@@ -24,6 +24,7 @@ import chat.rocket.android.player.PlayerActivity
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_files.* import kotlinx.android.synthetic.main.fragment_files.*
import javax.inject.Inject import javax.inject.Inject
...@@ -36,6 +37,7 @@ fun newInstance(chatRoomId: String): Fragment { ...@@ -36,6 +37,7 @@ fun newInstance(chatRoomId: String): Fragment {
} }
} }
internal const val TAG_FILES_FRAGMENT = "FilesFragment"
private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id" private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id"
class FilesFragment : Fragment(), FilesView { class FilesFragment : Fragment(), FilesView {
...@@ -68,6 +70,7 @@ class FilesFragment : Fragment(), FilesView { ...@@ -68,6 +70,7 @@ class FilesFragment : Fragment(), FilesView {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupRecyclerView() setupRecyclerView()
presenter.loadFiles(chatRoomId) presenter.loadFiles(chatRoomId)
AnswersEvent.logScreenView(TAG_FILES_FRAGMENT)
} }
override fun showFiles(dataSet: List<FileUiModel>, total: Long) { override fun showFiles(dataSet: List<FileUiModel>, total: Long) {
......
...@@ -4,35 +4,39 @@ import chat.rocket.android.R ...@@ -4,35 +4,39 @@ import chat.rocket.android.R
import chat.rocket.android.authentication.ui.newServerIntent import chat.rocket.android.authentication.ui.newServerIntent
import chat.rocket.android.chatroom.ui.chatRoomIntent import chat.rocket.android.chatroom.ui.chatRoomIntent
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import chat.rocket.android.chatrooms.ui.TAG_CHAT_ROOMS_FRAGMENT
import chat.rocket.android.createchannel.ui.CreateChannelFragment import chat.rocket.android.createchannel.ui.CreateChannelFragment
import chat.rocket.android.createchannel.ui.TAG_CREATE_CHANNEL_FRAGMENT
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.profile.ui.ProfileFragment import chat.rocket.android.profile.ui.ProfileFragment
import chat.rocket.android.profile.ui.TAG_PROFILE_FRAGMENT
import chat.rocket.android.server.ui.changeServerIntent import chat.rocket.android.server.ui.changeServerIntent
import chat.rocket.android.settings.ui.SettingsFragment import chat.rocket.android.settings.ui.SettingsFragment
import chat.rocket.android.settings.ui.TAG_SETTINGS_FRAGMENT
import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.addFragment
class MainNavigator(internal val activity: MainActivity) { class MainNavigator(internal val activity: MainActivity) {
fun toChatList(chatRoomId: String? = null) { fun toChatList(chatRoomId: String? = null) {
activity.addFragment("ChatRoomsFragment", R.id.fragment_container) { activity.addFragment(TAG_CHAT_ROOMS_FRAGMENT, R.id.fragment_container) {
ChatRoomsFragment.newInstance(chatRoomId) ChatRoomsFragment.newInstance(chatRoomId)
} }
} }
fun toCreateChannel() { fun toCreateChannel() {
activity.addFragment("CreateChannelFragment", R.id.fragment_container) { activity.addFragment(TAG_CREATE_CHANNEL_FRAGMENT, R.id.fragment_container) {
CreateChannelFragment.newInstance() CreateChannelFragment.newInstance()
} }
} }
fun toUserProfile() { fun toUserProfile() {
activity.addFragment("ProfileFragment", R.id.fragment_container) { activity.addFragment(TAG_PROFILE_FRAGMENT, R.id.fragment_container) {
ProfileFragment.newInstance() ProfileFragment.newInstance()
} }
} }
fun toSettings() { fun toSettings() {
activity.addFragment("SettingsFragment", R.id.fragment_container) { activity.addFragment(TAG_SETTINGS_FRAGMENT, R.id.fragment_container) {
SettingsFragment.newInstance() SettingsFragment.newInstance()
} }
} }
...@@ -62,7 +66,17 @@ class MainNavigator(internal val activity: MainActivity) { ...@@ -62,7 +66,17 @@ class MainNavigator(internal val activity: MainActivity) {
activity.overridePendingTransition(R.anim.open_enter, R.anim.open_exit) activity.overridePendingTransition(R.anim.open_enter, R.anim.open_exit)
} }
fun toNewServer(serverUrl: String? = null) { /**
* Switches to a server, given a [serverUrl] or adds a new server (navigating to the
* AuthenticationActivity) if the user server list only contains one server and the
* user logs out from this server.
* NOTE: If the user has more than one server and logs out from the current server, then it will
* switch to the first server in the server list.
*
* @param serverUrl The server URL to switch from, or null in case user logs out from the
* current server.
*/
fun switchOrAddNewServer(serverUrl: String? = null) {
activity.startActivity(activity.changeServerIntent(serverUrl = serverUrl)) activity.startActivity(activity.changeServerIntent(serverUrl = serverUrl))
activity.finish() activity.finish()
} }
......
...@@ -28,14 +28,12 @@ import chat.rocket.common.RocketChatException ...@@ -28,14 +28,12 @@ import chat.rocket.common.RocketChatException
import chat.rocket.common.model.UserStatus 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.realtime.setDefaultStatus
import chat.rocket.core.internal.rest.logout 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.internal.rest.unregisterPushToken
import chat.rocket.core.model.Myself import chat.rocket.core.model.Myself
import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.channels.Channel import kotlinx.coroutines.experimental.channels.Channel
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.withContext import kotlinx.coroutines.experimental.withContext
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
...@@ -145,7 +143,7 @@ class MainPresenter @Inject constructor( ...@@ -145,7 +143,7 @@ class MainPresenter @Inject constructor(
tokenRepository.remove(currentServer) tokenRepository.remove(currentServer)
withContext(CommonPool) { dbManager.logout() } withContext(CommonPool) { dbManager.logout() }
navigator.toNewServer() navigator.switchOrAddNewServer()
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.d(ex, "Error cleaning up the session...") Timber.d(ex, "Error cleaning up the session...")
} }
...@@ -165,7 +163,7 @@ class MainPresenter @Inject constructor( ...@@ -165,7 +163,7 @@ class MainPresenter @Inject constructor(
fun changeServer(serverUrl: String) { fun changeServer(serverUrl: String) {
if (currentServer != serverUrl) { if (currentServer != serverUrl) {
navigator.toNewServer(serverUrl) navigator.switchOrAddNewServer(serverUrl)
} else { } else {
view.closeServerSelection() view.closeServerSelection()
} }
......
package chat.rocket.android.members.presentation package chat.rocket.android.members.presentation
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.members.ui.TAG_MEMBER_BOTTOM_SHEET_FRAGMENT
import chat.rocket.android.members.ui.newInstance import chat.rocket.android.members.ui.newInstance
class MembersNavigator(internal val activity: ChatRoomActivity) { class MembersNavigator(internal val activity: ChatRoomActivity) {
...@@ -8,7 +9,7 @@ class MembersNavigator(internal val activity: ChatRoomActivity) { ...@@ -8,7 +9,7 @@ class MembersNavigator(internal val activity: ChatRoomActivity) {
fun toMemberDetails(avatarUri: String, realName: String, username: String, email: String, utcOffset: String) { fun toMemberDetails(avatarUri: String, realName: String, username: String, email: String, utcOffset: String) {
activity.apply { activity.apply {
newInstance(avatarUri, realName, username, email, utcOffset) newInstance(avatarUri, realName, username, email, utcOffset)
.show(supportFragmentManager, "MemberBottomSheetFragment") .show(supportFragmentManager, TAG_MEMBER_BOTTOM_SHEET_FRAGMENT)
} }
} }
} }
...@@ -9,6 +9,7 @@ import androidx.core.view.isVisible ...@@ -9,6 +9,7 @@ import androidx.core.view.isVisible
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.content
import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.helper.AnswersEvent
import kotlinx.android.synthetic.main.fragment_member_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_member_bottom_sheet.*
fun newInstance(avatarUri: String, fun newInstance(avatarUri: String,
...@@ -27,6 +28,8 @@ fun newInstance(avatarUri: String, ...@@ -27,6 +28,8 @@ fun newInstance(avatarUri: String,
} }
} }
internal const val TAG_MEMBER_BOTTOM_SHEET_FRAGMENT = "MemberBottomSheetFragment"
private const val BUNDLE_AVATAR_URI = "avatar_uri" private const val BUNDLE_AVATAR_URI = "avatar_uri"
private const val BUNDLE_REAL_NAME = "real_name" private const val BUNDLE_REAL_NAME = "real_name"
private const val BUNDLE_USERNAME = "username" private const val BUNDLE_USERNAME = "username"
...@@ -60,6 +63,7 @@ class MemberBottomSheetFragment: BottomSheetDialogFragment() { ...@@ -60,6 +63,7 @@ class MemberBottomSheetFragment: BottomSheetDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
showMemberDetails() showMemberDetails()
AnswersEvent.logScreenView(TAG_MEMBER_BOTTOM_SHEET_FRAGMENT)
} }
private fun showMemberDetails() { private fun showMemberDetails() {
......
...@@ -19,6 +19,7 @@ import chat.rocket.android.members.uimodel.MemberUiModel ...@@ -19,6 +19,7 @@ import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_members.* import kotlinx.android.synthetic.main.fragment_members.*
import javax.inject.Inject import javax.inject.Inject
...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment { ...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment {
} }
} }
internal const val TAG_MEMBERS_FRAGMENT = "MembersFragment"
private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id" private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id"
class MembersFragment : Fragment(), MembersView { class MembersFragment : Fragment(), MembersView {
...@@ -63,6 +65,7 @@ class MembersFragment : Fragment(), MembersView { ...@@ -63,6 +65,7 @@ class MembersFragment : Fragment(), MembersView {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupRecyclerView() setupRecyclerView()
presenter.loadChatRoomsMembers(chatRoomId) presenter.loadChatRoomsMembers(chatRoomId)
AnswersEvent.logScreenView(TAG_MEMBERS_FRAGMENT)
} }
override fun showMembers(dataSet: List<MemberUiModel>, total: Long) { override fun showMembers(dataSet: List<MemberUiModel>, total: Long) {
......
...@@ -19,6 +19,7 @@ import chat.rocket.android.mentions.presentention.MentionsView ...@@ -19,6 +19,7 @@ import chat.rocket.android.mentions.presentention.MentionsView
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_mentions.* import kotlinx.android.synthetic.main.fragment_mentions.*
import javax.inject.Inject import javax.inject.Inject
...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment { ...@@ -31,6 +32,7 @@ fun newInstance(chatRoomId: String): Fragment {
} }
} }
internal const val TAG_MENTIONS_FRAGMENT = "MentionsFragment"
private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id" private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id"
class MentionsFragment : Fragment(), MentionsView { class MentionsFragment : Fragment(), MentionsView {
...@@ -63,6 +65,7 @@ class MentionsFragment : Fragment(), MentionsView { ...@@ -63,6 +65,7 @@ class MentionsFragment : Fragment(), MentionsView {
setupToolbar() setupToolbar()
presenter.loadMentions(chatRoomId) presenter.loadMentions(chatRoomId)
AnswersEvent.logScreenView(TAG_MENTIONS_FRAGMENT)
} }
override fun showMentions(mentions: List<BaseUiModel<*>>) { override fun showMentions(mentions: List<BaseUiModel<*>>) {
......
...@@ -19,6 +19,7 @@ import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesView ...@@ -19,6 +19,7 @@ import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesView
import chat.rocket.android.util.extensions.inflate 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.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.fragment_pinned_messages.* import kotlinx.android.synthetic.main.fragment_pinned_messages.*
import javax.inject.Inject import javax.inject.Inject
...@@ -31,10 +32,10 @@ fun newInstance(chatRoomId: String): Fragment { ...@@ -31,10 +32,10 @@ fun newInstance(chatRoomId: String): Fragment {
} }
} }
internal const val TAG_PINNED_MESSAGES_FRAGMENT = "PinnedMessagesFragment"
private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id" private const val BUNDLE_CHAT_ROOM_ID = "chat_room_id"
class PinnedMessagesFragment : Fragment(), PinnedMessagesView { class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
private val adapter = ChatRoomAdapter(enableActions = false) private val adapter = ChatRoomAdapter(enableActions = false)
@Inject @Inject
...@@ -63,6 +64,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView { ...@@ -63,6 +64,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
setupToolbar() setupToolbar()
presenter.loadPinnedMessages(chatRoomId) presenter.loadPinnedMessages(chatRoomId)
AnswersEvent.logScreenView(TAG_PINNED_MESSAGES_FRAGMENT)
} }
override fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>) { override fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>) {
......
package chat.rocket.android.preferences.di
import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.preferences.presentation.PreferencesView
import chat.rocket.android.preferences.ui.PreferencesFragment
import dagger.Module
import dagger.Provides
@Module
class PreferencesFragmentModule {
@Provides
@PerFragment
fun preferencesView(frag: PreferencesFragment): PreferencesView {
return frag
}
}
\ No newline at end of file
package chat.rocket.android.preferences.di
import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.preferences.ui.PreferencesFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class PreferencesFragmentProvider {
@ContributesAndroidInjector(modules = [PreferencesFragmentModule::class])
@PerFragment
abstract fun providePreferencesFragment(): PreferencesFragment
}
\ No newline at end of file
package chat.rocket.android.preferences.presentation
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import javax.inject.Inject
class PreferencesPresenter @Inject constructor(
private val view: PreferencesView,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor
) {
fun loadAnalyticsTrackingInformation() {
view.setupAnalyticsTrackingView(analyticsTrackingInteractor.get())
}
fun enableAnalyticsTracking() {
analyticsTrackingInteractor.save(true)
}
fun disableAnalyticsTracking() {
analyticsTrackingInteractor.save(false)
}
}
\ No newline at end of file
package chat.rocket.android.preferences.presentation
interface PreferencesView {
/**
* Setups the analytics tracking view.
*
* @param isAnalyticsTrackingEnabled Whether the analytics tracking is enabled
*/
fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean)
}
\ No newline at end of file
package chat.rocket.android.preferences.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import chat.rocket.android.R
import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.preferences.presentation.PreferencesPresenter
import chat.rocket.android.preferences.presentation.PreferencesView
import chat.rocket.android.util.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_preferences.*
import javax.inject.Inject
internal const val TAG_PREFERENCES_FRAGMENT = "PreferencesFragment"
class PreferencesFragment : Fragment(), PreferencesView {
@Inject
lateinit var presenter: PreferencesPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_preferences, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupToolbar()
setupListeners()
presenter.loadAnalyticsTrackingInformation()
AnswersEvent.logScreenView(TAG_PREFERENCES_FRAGMENT)
}
override fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean) {
if (isAnalyticsTrackingEnabled) {
text_analytics_tracking_description.text =
getString(R.string.msg_send_analytics_tracking)
} else {
text_analytics_tracking_description.text =
getString(R.string.msg_do_not_send_analytics_tracking)
}
switch_analytics_tracking.isChecked = isAnalyticsTrackingEnabled
}
private fun setupToolbar() {
with((activity as MainActivity).toolbar) {
title = getString(R.string.title_preferences)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
}
private fun setupListeners() {
switch_analytics_tracking.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
text_analytics_tracking_description.text =
getString(R.string.msg_send_analytics_tracking)
presenter.enableAnalyticsTracking()
} else {
text_analytics_tracking_description.text =
getString(R.string.msg_do_not_send_analytics_tracking)
presenter.disableAnalyticsTracking()
}
}
}
companion object {
fun newInstance() = PreferencesFragment()
}
}
...@@ -23,6 +23,7 @@ import chat.rocket.android.util.extensions.inflate ...@@ -23,6 +23,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.helper.AnswersEvent
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
...@@ -32,6 +33,8 @@ import kotlinx.android.synthetic.main.fragment_profile.* ...@@ -32,6 +33,8 @@ import kotlinx.android.synthetic.main.fragment_profile.*
import kotlinx.android.synthetic.main.update_avatar_options.* import kotlinx.android.synthetic.main.update_avatar_options.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_PROFILE_FRAGMENT = "ProfileFragment"
private const val REQUEST_CODE_FOR_PERFORM_SAF = 1 private const val REQUEST_CODE_FOR_PERFORM_SAF = 1
private const val REQUEST_CODE_FOR_PERFORM_CAMERA = 2 private const val REQUEST_CODE_FOR_PERFORM_CAMERA = 2
...@@ -69,6 +72,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -69,6 +72,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
} }
presenter.loadUserProfile() presenter.loadUserProfile()
subscribeEditTexts() subscribeEditTexts()
AnswersEvent.logScreenView(TAG_PROFILE_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
package chat.rocket.android.server.domain
import javax.inject.Inject
class AnalyticsTrackingInteractor @Inject constructor(val repository: AnalyticsTrackingRepository) {
fun save(isAnalyticsTrackingEnable: Boolean) = repository.save(isAnalyticsTrackingEnable)
fun get(): Boolean = repository.get()
}
\ No newline at end of file
package chat.rocket.android.server.domain
interface AnalyticsTrackingRepository {
fun save(isAnalyticsTrackingEnable: Boolean)
fun get(): Boolean
}
\ No newline at end of file
package chat.rocket.android.server.infraestructure
import android.content.SharedPreferences
import chat.rocket.android.server.domain.AnalyticsTrackingRepository
private const val ANALYTICS_TRACKING_KEY = "ANALYTICS_TRACKING_KEY"
class SharedPrefsAnalyticsTrackingRepository(private val preferences: SharedPreferences) :
AnalyticsTrackingRepository {
override fun save(isAnalyticsTrackingEnable: Boolean) =
preferences.edit().putBoolean(ANALYTICS_TRACKING_KEY, isAnalyticsTrackingEnable).apply()
override fun get() = preferences.getBoolean(ANALYTICS_TRACKING_KEY, true)
}
\ No newline at end of file
...@@ -7,6 +7,7 @@ import chat.rocket.android.server.ui.ChangeServerActivity ...@@ -7,6 +7,7 @@ import chat.rocket.android.server.ui.ChangeServerActivity
import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID
class ChangeServerNavigator (internal val activity: ChangeServerActivity) { class ChangeServerNavigator (internal val activity: ChangeServerActivity) {
fun toServerScreen() { fun toServerScreen() {
activity.startActivity(activity.newServerIntent()) activity.startActivity(activity.newServerIntent())
activity.finish() activity.finish()
......
...@@ -5,6 +5,7 @@ import chat.rocket.android.infrastructure.LocalRepository ...@@ -5,6 +5,7 @@ import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.helper.AnswersEvent
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import javax.inject.Inject import javax.inject.Inject
...@@ -21,12 +22,14 @@ class ChangeServerPresenter @Inject constructor( ...@@ -21,12 +22,14 @@ class ChangeServerPresenter @Inject constructor(
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val connectionManager: ConnectionManagerFactory private val connectionManager: ConnectionManagerFactory
) { ) {
fun loadServer(newUrl: String?, chatRoomId: String? = null) { fun loadServer(newUrl: String?, chatRoomId: String? = null) {
launchUI(strategy) { launchUI(strategy) {
view.showProgress() view.showProgress()
var url = newUrl var url = newUrl
if (url == null) { // Try to load next server on the list... val accounts = getAccountsInteractor.get()
val accounts = getAccountsInteractor.get() if (url == null) {
// Try to load next server on the list...
url = accounts.firstOrNull()?.serverUrl url = accounts.firstOrNull()?.serverUrl
} }
...@@ -56,6 +59,7 @@ class ChangeServerPresenter @Inject constructor( ...@@ -56,6 +59,7 @@ class ChangeServerPresenter @Inject constructor(
saveCurrentServerInteractor.save(serverUrl) saveCurrentServerInteractor.save(serverUrl)
view.hideProgress() view.hideProgress()
AnswersEvent.logServerSwitch(serverUrl, accounts.size)
navigator.toChatRooms(chatRoomId) navigator.toChatRooms(chatRoomId)
}.ifNull { }.ifNull {
view.hideProgress() view.hideProgress()
......
...@@ -11,6 +11,18 @@ import chat.rocket.android.util.extensions.showToast ...@@ -11,6 +11,18 @@ import chat.rocket.android.util.extensions.showToast
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
import javax.inject.Inject import javax.inject.Inject
private const val INTENT_SERVER_URL = "INTENT_SERVER_URL"
const val INTENT_CHAT_ROOM_ID = "INTENT_CHAT_ROOM_ID"
fun Context.changeServerIntent(serverUrl: String? = null, chatRoomId: String? = ""): Intent {
return Intent(this, ChangeServerActivity::class.java).apply {
serverUrl?.let { url ->
putExtra(INTENT_SERVER_URL, url)
putExtra(INTENT_CHAT_ROOM_ID, chatRoomId)
}
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
}
class ChangeServerActivity : AppCompatActivity(), ChangeServerView { class ChangeServerActivity : AppCompatActivity(), ChangeServerView {
@Inject lateinit var presenter: ChangeServerPresenter @Inject lateinit var presenter: ChangeServerPresenter
...@@ -37,18 +49,3 @@ class ChangeServerActivity : AppCompatActivity(), ChangeServerView { ...@@ -37,18 +49,3 @@ class ChangeServerActivity : AppCompatActivity(), ChangeServerView {
progress?.dismiss() progress?.dismiss()
} }
} }
private const val INTENT_SERVER_URL = "INTENT_SERVER_URL"
private const val INTENT_CHAT_ROOM_NAME = "INTENT_CHAT_ROOM_NAME"
private const val INTENT_CHAT_ROOM_TYPE = "INTENT_CHAT_ROOM_TYPE"
const val INTENT_CHAT_ROOM_ID = "INTENT_CHAT_ROOM_ID"
fun Context.changeServerIntent(serverUrl: String? = null, chatRoomId: String? = ""): Intent {
return Intent(this, ChangeServerActivity::class.java).apply {
serverUrl?.let { url ->
putExtra(INTENT_SERVER_URL, url)
putExtra(INTENT_CHAT_ROOM_ID, chatRoomId)
}
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
}
\ No newline at end of file
...@@ -4,7 +4,6 @@ import android.os.Bundle ...@@ -4,7 +4,6 @@ import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.addFragment
import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.textContent
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
...@@ -23,7 +22,7 @@ class PasswordActivity : AppCompatActivity(), HasSupportFragmentInjector { ...@@ -23,7 +22,7 @@ class PasswordActivity : AppCompatActivity(), HasSupportFragmentInjector {
setContentView(R.layout.activity_password) setContentView(R.layout.activity_password)
setupToolbar() setupToolbar()
addFragment("PasswordFragment") addFragment(TAG_PASSWORD_FRAGMENT)
} }
override fun onBackPressed() { override fun onBackPressed() {
...@@ -47,6 +46,6 @@ class PasswordActivity : AppCompatActivity(), HasSupportFragmentInjector { ...@@ -47,6 +46,6 @@ class PasswordActivity : AppCompatActivity(), HasSupportFragmentInjector {
private fun setupToolbar() { private fun setupToolbar() {
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
text_change_password.textContent = resources.getString(R.string.title_password) text_change_password.textContent = resources.getString(R.string.title_change_password)
} }
} }
...@@ -12,6 +12,7 @@ import androidx.appcompat.view.ActionMode ...@@ -12,6 +12,7 @@ import androidx.appcompat.view.ActionMode
import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.asObservable
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.helper.AnswersEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
...@@ -19,6 +20,8 @@ import io.reactivex.rxkotlin.Observables ...@@ -19,6 +20,8 @@ import io.reactivex.rxkotlin.Observables
import kotlinx.android.synthetic.main.fragment_password.* import kotlinx.android.synthetic.main.fragment_password.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_PASSWORD_FRAGMENT = "PasswordFragment"
class PasswordFragment: Fragment(), PasswordView, ActionMode.Callback { class PasswordFragment: Fragment(), PasswordView, ActionMode.Callback {
@Inject lateinit var presenter: PasswordPresenter @Inject lateinit var presenter: PasswordPresenter
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
...@@ -39,6 +42,7 @@ class PasswordFragment: Fragment(), PasswordView, ActionMode.Callback { ...@@ -39,6 +42,7 @@ class PasswordFragment: Fragment(), PasswordView, ActionMode.Callback {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
disposables.add(listenToChanges()) disposables.add(listenToChanges())
AnswersEvent.logScreenView(TAG_PASSWORD_FRAGMENT)
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -10,18 +10,21 @@ import android.view.ViewGroup ...@@ -10,18 +10,21 @@ import android.view.ViewGroup
import android.widget.AdapterView import android.widget.AdapterView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.about.ui.AboutFragment import chat.rocket.android.about.ui.AboutFragment
import chat.rocket.android.about.ui.TAG_ABOUT_FRAGMENT
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.preferences.ui.PreferencesFragment
import chat.rocket.android.preferences.ui.TAG_PREFERENCES_FRAGMENT
import chat.rocket.android.settings.password.ui.PasswordActivity import chat.rocket.android.settings.password.ui.PasswordActivity
import chat.rocket.android.settings.presentation.SettingsView import chat.rocket.android.settings.presentation.SettingsView
import chat.rocket.android.util.extensions.addFragmentBackStack import chat.rocket.android.util.extensions.addFragmentBackStack
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.helper.AnswersEvent
import kotlinx.android.synthetic.main.fragment_settings.* import kotlinx.android.synthetic.main.fragment_settings.*
import kotlin.reflect.KClass import kotlin.reflect.KClass
internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment"
class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListener { class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListener {
companion object {
fun newInstance() = SettingsFragment()
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
...@@ -33,23 +36,32 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen ...@@ -33,23 +36,32 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
setupListView() setupListView()
AnswersEvent.logScreenView(TAG_SETTINGS_FRAGMENT)
} }
override fun onResume() { override fun onResume() {
// FIXME - gambiarra ahead. will fix when moving to new androidx Navigation // FIXME - gambiarra ahead. will fix when moving to new androidx Navigation
(activity as? MainActivity)?.let { (activity as? MainActivity)?.setupNavigationView()
it.setupNavigationView()
}
super.onResume() super.onResume()
} }
override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
when (parent?.getItemAtPosition(position).toString()) { when (parent?.getItemAtPosition(position).toString()) {
resources.getString(R.string.title_password) -> { resources.getString(R.string.title_preferences) -> {
startNewActivity(PasswordActivity::class) (activity as AppCompatActivity).addFragmentBackStack(
TAG_PREFERENCES_FRAGMENT,
R.id.fragment_container
) {
PreferencesFragment.newInstance()
}
} }
resources.getString(R.string.title_change_password) ->
startNewActivity(PasswordActivity::class)
resources.getString(R.string.title_about) -> { resources.getString(R.string.title_about) -> {
(activity as AppCompatActivity).addFragmentBackStack("AboutFragmnet", R.id.fragment_container){ (activity as AppCompatActivity).addFragmentBackStack(
TAG_ABOUT_FRAGMENT,
R.id.fragment_container
) {
AboutFragment.newInstance() AboutFragment.newInstance()
} }
} }
...@@ -69,4 +81,8 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen ...@@ -69,4 +81,8 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen
startActivity(Intent(activity, classType.java)) startActivity(Intent(activity, classType.java))
activity?.overridePendingTransition(R.anim.open_enter, R.anim.open_exit) activity?.overridePendingTransition(R.anim.open_enter, R.anim.open_exit)
} }
companion object {
fun newInstance() = SettingsFragment()
}
} }
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
tools:text="@string/title_password" /> tools:text="@string/title_change_password" />
</RelativeLayout> </RelativeLayout>
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingBottom="16dp" android:paddingBottom="16dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
tools:context=".members.ui.MemberBottomSheetFragment">
<com.facebook.drawee.view.SimpleDraweeView <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_bottom_sheet_avatar" android:id="@+id/image_bottom_sheet_avatar"
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
android:id="@+id/root_layout" android:id="@+id/root_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".chatinformation.ui.MessageInfoActivity"> tools:context=".chatinformation.ui.MessageInfoFragment">
<com.wang.avi.AVLoadingIndicatorView <com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading" android:id="@+id/view_loading"
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools"
tools:context=".settings.password.ui.PasswordFragment">
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/layout_new_password" android:id="@+id/layout_new_password"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
tools:context="preferences.ui.PreferencesFragment">
<com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:indicatorColor="@color/colorBlack"
app:indicatorName="BallPulseIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<TextView
android:id="@+id/text_analytics_tracking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg_analytics_tracking"
android:textColor="@color/colorPrimaryText"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_analytics_tracking_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg_send_analytics_tracking"
android:textColor="@color/colorSecondaryText"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_analytics_tracking" />
<Switch
android:id="@+id/switch_analytics_tracking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
app:layout_constraintBottom_toBottomOf="@+id/text_analytics_tracking_description"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_analytics_tracking" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"> android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".settings.ui.SettingsFragment">
<ListView <ListView
android:id="@+id/settings_list" android:id="@+id/settings_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:entries="@array/settings_actions"/> android:entries="@array/settings_actions" />
</RelativeLayout> </RelativeLayout>
\ No newline at end of file
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
<string name="title_profile">Profil</string> <string name="title_profile">Profil</string>
<string name="title_members">Benutzer (%d)</string> <string name="title_members">Benutzer (%d)</string>
<string name="title_settings">Einstellungen</string> <string name="title_settings">Einstellungen</string>
<string name="title_password">Ändere Passwort</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">Ändere Passwort</string>
<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>
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">Ändere Passwort</item> <item name="item_password">Ändere Passwort</item>
<item name="item_password">Über</item> <item name="item_password">Über</item>
</string-array> </string-array>
...@@ -144,6 +146,11 @@ ...@@ -144,6 +146,11 @@
<string name="msg_delete_message">Lösche Nachricht</string> <string name="msg_delete_message">Lösche Nachricht</string>
<string name="msg_delete_description">Sind Sie sicher, dass Sie diese Nachricht löschen wollen?</string> <string name="msg_delete_description">Sind Sie sicher, dass Sie diese Nachricht löschen wollen?</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<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">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Raum Namen geändert zu: %1$s von %2$s</string> <string name="message_room_name_changed">Raum Namen geändert zu: %1$s von %2$s</string>
<string name="message_user_added_by">Benutzer %1$s hinzugefügt von %2$s</string> <string name="message_user_added_by">Benutzer %1$s hinzugefügt von %2$s</string>
...@@ -173,7 +180,6 @@ ...@@ -173,7 +180,6 @@
<string name="action_msg_share">Teilen</string> <string name="action_msg_share">Teilen</string>
<string name="action_title_editing">Nachricht bearbeiten</string> <string name="action_title_editing">Nachricht bearbeiten</string>
<string name="action_msg_add_reaction">Reaktion hinzufügen</string> <string name="action_msg_add_reaction">Reaktion hinzufügen</string>
<string name="action_share">Teilen</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">Bearbeiten nicht erlaubt</string> <string name="permission_editing_not_allowed">Bearbeiten nicht erlaubt</string>
......
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
<string name="title_profile">Perfil</string> <string name="title_profile">Perfil</string>
<string name="title_members">Miembros (%d)</string> <string name="title_members">Miembros (%d)</string>
<string name="title_settings">Configuraciones</string> <string name="title_settings">Configuraciones</string>
<string name="title_password">Cambia la contraseña</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">Cambia la contraseña</string>
<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>
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">Cambia la contraseña</item> <item name="item_password">Cambia la contraseña</item>
<item name="item_password">Acerca de</item> <item name="item_password">Acerca de</item>
</string-array> </string-array>
...@@ -138,6 +140,11 @@ ...@@ -138,6 +140,11 @@
<string name="msg_member_not_found">Miembro no encontrado</string> <string name="msg_member_not_found">Miembro no encontrado</string>
<string name="msg_channel_created_successfully">Canal creado con éxito</string> <string name="msg_channel_created_successfully">Canal creado con éxito</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<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">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nombre de la sala cambiado para: %1$s por %2$s</string> <string name="message_room_name_changed">Nombre de la sala cambiado para: %1$s por %2$s</string>
<string name="message_user_added_by">Usuario %1$s añadido por %2$s</string> <string name="message_user_added_by">Usuario %1$s añadido por %2$s</string>
......
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
<string name="title_profile">Profil</string> <string name="title_profile">Profil</string>
<string name="title_members">Membres (%d)</string> <string name="title_members">Membres (%d)</string>
<string name="title_settings">Paramètres</string> <string name="title_settings">Paramètres</string>
<string name="title_password">Changer le mot de passe</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">Changer le mot de passe</string>
<string name="title_update_profile">Update profile</string> <string name="title_update_profile">Update profile</string>
<string name="title_about">Sur</string> <string name="title_about">Sur</string>
// TODO: Add proper translation. // TODO: Add proper translation.
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">Changer le mot de passe</item> <item name="item_password">Changer le mot de passe</item>
<item name="item_password">Sur</item> <item name="item_password">Sur</item>
</string-array> </string-array>
...@@ -156,6 +158,11 @@ ...@@ -156,6 +158,11 @@
<string name="msg_member_not_found">Member not found</string> <string name="msg_member_not_found">Member not found</string>
<string name="msg_channel_created_successfully">Channel created successfully</string> <string name="msg_channel_created_successfully">Channel created successfully</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<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">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Le nom de le salle a changé à: %1$s par %2$s</string> <string name="message_room_name_changed">Le nom de le salle a changé à: %1$s par %2$s</string>
<string name="message_user_added_by">Utilisateur %1$s ajouté par %2$s</string> <string name="message_user_added_by">Utilisateur %1$s ajouté par %2$s</string>
...@@ -187,7 +194,6 @@ ...@@ -187,7 +194,6 @@
<string name="action_msg_share">Partager</string> <string name="action_msg_share">Partager</string>
<string name="action_title_editing">Modification du message</string> <string name="action_title_editing">Modification du message</string>
<string name="action_msg_add_reaction">Ajouter une réaction</string> <string name="action_msg_add_reaction">Ajouter une réaction</string>
<string name="action_share">Partager</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">L\'édition n\'est pas autorisée</string> <string name="permission_editing_not_allowed">L\'édition n\'est pas autorisée</string>
......
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
<string name="title_profile">प्रोफाइल</string> <string name="title_profile">प्रोफाइल</string>
<string name="title_members">सदस्य (%d)</string> <string name="title_members">सदस्य (%d)</string>
<string name="title_settings">सेटिंग्स</string> <string name="title_settings">सेटिंग्स</string>
<string name="title_password">पासवर्ड बदलें</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">पासवर्ड बदलें</string>
<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>
...@@ -42,10 +43,10 @@ ...@@ -42,10 +43,10 @@
<string name="action_select_photo_from_gallery">Select photo from gallery</string> <!-- TODO Add translation --> <string name="action_select_photo_from_gallery">Select photo from gallery</string> <!-- TODO Add translation -->
<string name="action_take_photo">Select photo from gallery</string> <!-- TODO Add translation --> <string name="action_take_photo">Select photo from gallery</string> <!-- TODO Add translation -->
<string name="action_reset_avatar">Reset avatar</string> <!-- TODO Add translation --> <string name="action_reset_avatar">Reset avatar</string> <!-- TODO Add translation -->
<string name="action_share">शेयर</string>
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">पासवर्ड बदलें</item> <item name="item_password">पासवर्ड बदलें</item>
<item name="item_password">परिचय</item> <item name="item_password">परिचय</item>
</string-array> </string-array>
...@@ -145,6 +146,11 @@ ...@@ -145,6 +146,11 @@
<string name="msg_member_not_found">सदस्य नहीं मिला</string> <string name="msg_member_not_found">सदस्य नहीं मिला</string>
<string name="msg_channel_created_successfully">चैनल सफलतापूर्वक बनाया गया</string> <string name="msg_channel_created_successfully">चैनल सफलतापूर्वक बनाया गया</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<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">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">%2$s ने रूम का नाम बदलकर %1$s किया</string> <string name="message_room_name_changed">%2$s ने रूम का नाम बदलकर %1$s किया</string>
<string name="message_user_added_by">उपयोगकर्ता %1$s द्वारा %2$s को जोड़ा गया</string> <string name="message_user_added_by">उपयोगकर्ता %1$s द्वारा %2$s को जोड़ा गया</string>
......
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
<string name="title_profile">Perfil</string> <string name="title_profile">Perfil</string>
<string name="title_members">Membros (%d)</string> <string name="title_members">Membros (%d)</string>
<string name="title_settings">Configurações</string> <string name="title_settings">Configurações</string>
<string name="title_password">Alterar senha</string> <string name="title_preferences">Preferencias</string>
<string name="title_change_password">Alterar senha</string>
<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>
...@@ -45,6 +46,7 @@ ...@@ -45,6 +46,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferencias</item>
<item name="item_password">Alterar senha</item> <item name="item_password">Alterar senha</item>
<item name="item_password">Sobre</item> <item name="item_password">Sobre</item>
</string-array> </string-array>
...@@ -144,6 +146,11 @@ ...@@ -144,6 +146,11 @@
<string name="msg_member_not_found">Membro não encontrado</string> <string name="msg_member_not_found">Membro não encontrado</string>
<string name="msg_channel_created_successfully">Chat criado com sucesso</string> <string name="msg_channel_created_successfully">Chat criado com sucesso</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Rastreamento de análises</string>
<string name="msg_send_analytics_tracking">Envie estatísticas anônimas para ajudar a melhorar este app</string>
<string name="msg_do_not_send_analytics_tracking">Não envie estatísticas anônimas para ajudar a melhorar este app</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string> <string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string>
<string name="message_user_added_by">Usuário %1$s adicionado por %2$s</string> <string name="message_user_added_by">Usuário %1$s adicionado por %2$s</string>
...@@ -275,7 +282,6 @@ ...@@ -275,7 +282,6 @@
<string name="notif_action_reply_hint">RESPONDER</string> <string name="notif_action_reply_hint">RESPONDER</string>
<string name="notif_error_sending">Falha ao enviar a mensagem.</string> <string name="notif_error_sending">Falha ao enviar a mensagem.</string>
<string name="notif_success_sending">Mensagem enviada para %1$s!</string> <string name="notif_success_sending">Mensagem enviada para %1$s!</string>
<string name="action_share">Compartilhar</string>
<string name="read_by">Lida por</string> <string name="read_by">Lida por</string>
<string name="message_information_title">Informações da mensagem</string> <string name="message_information_title">Informações da mensagem</string>
<string name="msg_log_out">Deslogando…</string> <string name="msg_log_out">Deslogando…</string>
......
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
<string name="title_profile">Профиль</string> <string name="title_profile">Профиль</string>
<string name="title_members">Пользователи (%d)</string> <string name="title_members">Пользователи (%d)</string>
<string name="title_settings">Настройки</string> <string name="title_settings">Настройки</string>
<string name="title_password">Изменить пароль</string> <string name="title_preferences">Preferences</string> <!-- TODO Add translation -->
<string name="title_change_password">Изменить пароль</string>
<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>
...@@ -45,6 +46,7 @@ ...@@ -45,6 +46,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item> <!-- TODO Add translation -->
<item name="item_password">Изменить пароль</item> <item name="item_password">Изменить пароль</item>
<item name="item_password">О программе</item> <item name="item_password">О программе</item>
</string-array> </string-array>
...@@ -143,6 +145,11 @@ ...@@ -143,6 +145,11 @@
<string name="msg_member_not_found">Пользователь не найден</string> <string name="msg_member_not_found">Пользователь не найден</string>
<string name="msg_channel_created_successfully">Канал создан успешно</string> <string name="msg_channel_created_successfully">Канал создан успешно</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
<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">Do not send anonymous statics to help improving this app</string> <!-- TODO Add translation -->
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Название канала изменено на: %1$s by %2$s</string> <string name="message_room_name_changed">Название канала изменено на: %1$s by %2$s</string>
<string name="message_user_added_by">Пользователь %1$s добавлен пользователем %2$s</string> <string name="message_user_added_by">Пользователь %1$s добавлен пользователем %2$s</string>
...@@ -172,7 +179,6 @@ ...@@ -172,7 +179,6 @@
<string name="action_msg_share">Поделиться</string> <string name="action_msg_share">Поделиться</string>
<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>
<string name="action_share">Поделиться</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">Редактирование запрещено</string> <string name="permission_editing_not_allowed">Редактирование запрещено</string>
......
...@@ -13,7 +13,8 @@ ...@@ -13,7 +13,8 @@
<string name="title_profile">Profile</string> <string name="title_profile">Profile</string>
<string name="title_members">Members (%d)</string> <string name="title_members">Members (%d)</string>
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
<string name="title_password">Change Password</string> <string name="title_preferences">Preferences</string>
<string name="title_change_password">Change Password</string>
<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>
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
<!-- Settings List --> <!-- Settings List -->
<string-array name="settings_actions"> <string-array name="settings_actions">
<item name="item_preferences">Preferences</item>
<item name="item_password">Change Password</item> <item name="item_password">Change Password</item>
<item name="item_password">About</item> <item name="item_password">About</item>
</string-array> </string-array>
...@@ -145,6 +147,11 @@ ...@@ -145,6 +147,11 @@
<string name="msg_message_copied">Message copied</string> <string name="msg_message_copied">Message copied</string>
<string name="msg_delete_message">Delete Message</string> <string name="msg_delete_message">Delete Message</string>
<string name="msg_delete_description">Are you sure you want to delete this message</string> <string name="msg_delete_description">Are you sure you want to delete this message</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string>
<string name="msg_send_analytics_tracking">Send anonymous statics to help improving this app</string>
<string name="msg_do_not_send_analytics_tracking">Do not send anonymous statics to help improving this app</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string> <string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string>
...@@ -175,7 +182,6 @@ ...@@ -175,7 +182,6 @@
<string name="action_msg_share">Share</string> <string name="action_msg_share">Share</string>
<string name="action_title_editing">Editing Message</string> <string name="action_title_editing">Editing Message</string>
<string name="action_msg_add_reaction">Add reaction</string> <string name="action_msg_add_reaction">Add reaction</string>
<string name="action_share">Share</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">Editing is not allowed</string> <string name="permission_editing_not_allowed">Editing is not allowed</string>
......
...@@ -10,7 +10,7 @@ buildscript { ...@@ -10,7 +10,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.3.0-alpha03' classpath 'com.android.tools.build:gradle:3.3.0-alpha04'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"
classpath 'com.google.gms:google-services:4.0.2' classpath 'com.google.gms:google-services:4.0.2'
......
...@@ -9,7 +9,7 @@ ext { ...@@ -9,7 +9,7 @@ ext {
dokka : '0.9.16', dokka : '0.9.16',
// For app // For app
kotlin : '1.2.51', kotlin : '1.2.60',
coroutine : '0.24.0', coroutine : '0.24.0',
appCompat : '1.0.0-beta01', appCompat : '1.0.0-beta01',
...@@ -20,7 +20,8 @@ ext { ...@@ -20,7 +20,8 @@ ext {
androidKtx : '1.0.0-beta01', androidKtx : '1.0.0-beta01',
dagger : '2.16', dagger : '2.16',
firebase : '15.0.0', firebaseCloudMessage : '17.1.0',
firebaseAnalytics : '16.0.1',
playServices : '15.0.1', playServices : '15.0.1',
exoPlayer : '2.8.2', exoPlayer : '2.8.2',
flexbox : '1.0.0', flexbox : '1.0.0',
...@@ -74,7 +75,8 @@ ext { ...@@ -74,7 +75,8 @@ ext {
daggerSupport : "com.google.dagger:dagger-android-support:${versions.dagger}", daggerSupport : "com.google.dagger:dagger-android-support:${versions.dagger}",
daggerProcessor : "com.google.dagger:dagger-compiler:${versions.dagger}", daggerProcessor : "com.google.dagger:dagger-compiler:${versions.dagger}",
daggerAndroidApt : "com.google.dagger:dagger-android-processor:${versions.dagger}", daggerAndroidApt : "com.google.dagger:dagger-android-processor:${versions.dagger}",
fcm : "com.google.firebase:firebase-messaging:${versions.firebase}", fcm : "com.google.firebase:firebase-messaging:${versions.firebaseCloudMessage}",
firebaseAnalytics : "com.google.firebase:firebase-core:${versions.firebaseAnalytics}",
playServicesAuth : "com.google.android.gms:play-services-auth:${versions.playServices}", playServicesAuth : "com.google.android.gms:play-services-auth:${versions.playServices}",
exoPlayer : "com.google.android.exoplayer:exoplayer:${versions.exoPlayer}", exoPlayer : "com.google.android.exoplayer:exoplayer:${versions.exoPlayer}",
flexbox : "com.google.android:flexbox:${versions.flexbox}", flexbox : "com.google.android:flexbox:${versions.flexbox}",
......
...@@ -36,4 +36,8 @@ dependencies { ...@@ -36,4 +36,8 @@ dependencies {
// TODO This is a dependency from the core module, but the util module are unable to get that dependencies. Check why it is occurring since transitive is enable by default // TODO This is a dependency from the core module, but the util module are unable to get that dependencies. Check why it is occurring since transitive is enable by default
implementation libraries.lifecycleExtensions implementation libraries.lifecycleExtensions
kapt libraries.lifecycleCompiler kapt libraries.lifecycleCompiler
implementation('com.crashlytics.sdk.android:answers:1.4.2@aar') {
transitive = true
}
} }
\ No newline at end of file
package chat.rocket.android.util.helper
import com.crashlytics.android.answers.Answers
import com.crashlytics.android.answers.CustomEvent
import com.crashlytics.android.answers.LoginEvent
import com.crashlytics.android.answers.SignUpEvent
object AnswersEvent {
const val LOGIN_OR_SIGN_UP_BY_USER_AND_PASSWORD = "USER-AND-PASSWORD"
const val LOGIN_BY_CAS = "CAS"
const val LOGIN_BY_SAML = "SAML"
const val LOGIN_OR_SIGN_UP_BY_OAUTH = "OAUTH"
const val LOGIN_BY_DEEP_LINK = "DEEP-LINK"
/**
* Logs the Log In event.
*
* @param loginMethod The method that the user used to log in.
* @param loginSucceeded True if the user successful logged in, false otherwise.
*/
fun logLogin(loginMethod: String, loginSucceeded: Boolean) =
Answers.getInstance()
.logLogin(
LoginEvent()
.putMethod(loginMethod)
.putSuccess(loginSucceeded)
)
/**
* Logs the Sign Up event.
*
* @param signUpMethod The method that the user used to sign up.
* @param signUpSucceeded True if the user successful signed up, false otherwise.
*/
fun logSignUp(signUpMethod: String, signUpSucceeded: Boolean) =
Answers.getInstance()
.logSignUp(
SignUpEvent()
.putMethod(signUpMethod)
.putSuccess(signUpSucceeded)
)
/**
* Logs the screen view custom event.
*
* @param screenName The name of the screen to log.
*/
fun logScreenView(screenName: String) =
Answers.getInstance()
.logCustom(CustomEvent("screen_view").putCustomAttribute("screen", screenName))
/**
* Logs the message sent custom event.
*
* @param roomType The room type to log.
* @param serverUrl The server URL to log.
*/
fun logMessageSent(roomType: String, serverUrl: String) =
Answers.getInstance()
.logCustom(
CustomEvent("message_sent")
.putCustomAttribute("subscription_type", roomType)
.putCustomAttribute("server", serverUrl)
)
/**
* Logs the media upload custom event.
*
* @param roomType The room type to log.
* @param mimeType The mime type of the media to log.
*/
fun logMediaUploaded(roomType: String, mimeType: String) =
Answers.getInstance()
.logCustom(
CustomEvent("media_upload")
.putCustomAttribute("subscription_type", roomType)
.putCustomAttribute("media_type", mimeType)
)
/**
* Logs the reaction custom event.
*
* @param roomType The room type to log.
*/
fun logReaction(roomType: String) =
Answers.getInstance()
.logCustom(
CustomEvent("reaction").putCustomAttribute("subscription_type", roomType)
)
/**
* Logs the server switch custom event.
*
* @param serverUrl The server URL to log.
* @param serverCount The number of server(s) the use own.
*/
fun logServerSwitch(serverUrl: String, serverCount: Int) =
Answers.getInstance()
.logCustom(
CustomEvent("server_switch")
.putCustomAttribute("server_url", serverUrl)
.putCustomAttribute("server_count", serverCount)
)
}
\ No newline at end of file
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