Commit 8ce5d9d3 authored by Filipe de Lima Brito's avatar Filipe de Lima Brito

Add the support for the Google Analytics For Firebase

parent aaf1bedd
package chat.rocket.android.util.helper.analytics package chat.rocket.android.analytics
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.util.helper.analytics.event.SubscriptionTypeEvent import chat.rocket.android.analytics.event.SubscriptionTypeEvent
object AnalyticsManager : Analytics { class AnswersAnalytics : Analytics {
override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) { override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {
// Do absolutely nothing // Do absolutely nothing
......
package chat.rocket.android.analytics
import android.content.Context
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.analytics.event.SubscriptionTypeEvent
import javax.inject.Inject
class GoogleAnalyticsForFirebase @Inject constructor(val context: Context) :
Analytics {
override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {
// Do absolutely nothing
}
override fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) {
// Do absolutely nothing
}
override fun logScreenView(event: ScreenViewEvent) {
// Do absolutely nothing
}
override fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) {
// Do absolutely nothing
}
override fun logMediaUploaded(event: SubscriptionTypeEvent, mimeType: String) {
// Do absolutely nothing
}
override fun logReaction(event: SubscriptionTypeEvent) {
// Do absolutely nothing
}
override fun logServerSwitch(serverUrl: String, serverCount: Int) {
// Do absolutely nothing
}
}
...@@ -7,10 +7,9 @@ import android.view.ViewGroup ...@@ -7,10 +7,9 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment 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.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.helper.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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.*
import javax.inject.Inject import javax.inject.Inject
...@@ -19,7 +18,7 @@ internal const val TAG_ABOUT_FRAGMENT = "AboutFragment" ...@@ -19,7 +18,7 @@ internal const val TAG_ABOUT_FRAGMENT = "AboutFragment"
class AboutFragment : Fragment() { class AboutFragment : Fragment() {
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
...@@ -32,9 +31,7 @@ class AboutFragment : Fragment() { ...@@ -32,9 +31,7 @@ class AboutFragment : Fragment() {
setupToolbar() setupToolbar()
setupViews() setupViews()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.About)
AnalyticsManager.logScreenView(ScreenViewEvent.About)
}
} }
private fun setupViews() { private fun setupViews() {
......
package chat.rocket.android.util.helper.analytics package chat.rocket.android.analytics
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.util.helper.analytics.event.SubscriptionTypeEvent import chat.rocket.android.analytics.event.SubscriptionTypeEvent
interface Analytics { interface Analytics {
......
package chat.rocket.android.analytics
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.analytics.event.SubscriptionTypeEvent
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import javax.inject.Inject
class AnalyticsManager @Inject constructor(
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor,
getCurrentServerInteractor: GetCurrentServerInteractor,
getAccountsInteractor: GetAccountsInteractor,
private val analytics: List<Analytics>
) {
val serverUrl = getCurrentServerInteractor.get()
val accounts = getAccountsInteractor.get()
fun logLogin(
event: AuthenticationEvent,
loginSucceeded: Boolean
) {
if (analyticsTrackingInteractor.get()) {
analytics.forEach { it.logLogin(event, loginSucceeded) }
}
}
fun logSignUp(
event: AuthenticationEvent,
signUpSucceeded: Boolean
) {
if (analyticsTrackingInteractor.get()) {
analytics.forEach { it.logSignUp(event, signUpSucceeded) }
}
}
fun logScreenView(event: ScreenViewEvent) {
if (analyticsTrackingInteractor.get()) {
analytics.forEach { it.logScreenView(event) }
}
}
fun logMessageSent(event: SubscriptionTypeEvent) {
if (analyticsTrackingInteractor.get() && serverUrl != null) {
analytics.forEach { it.logMessageSent(event, serverUrl) }
}
}
fun logMediaUploaded(event: SubscriptionTypeEvent, mimeType: String) {
if (analyticsTrackingInteractor.get()) {
analytics.forEach { it.logMediaUploaded(event, mimeType) }
}
}
fun logReaction(event: SubscriptionTypeEvent) {
if (analyticsTrackingInteractor.get()) {
analytics.forEach { it.logReaction(event) }
}
}
fun logServerSwitch() {
if (analyticsTrackingInteractor.get() && serverUrl != null) {
analytics.forEach { it.logServerSwitch(serverUrl, accounts.size) }
}
}
}
package chat.rocket.android.util.helper.analytics.event package chat.rocket.android.analytics.event
sealed class AuthenticationEvent(val methodName: String) { sealed class AuthenticationEvent(val methodName: String) {
object AuthenticationWithUserAndPassword : AuthenticationEvent("User and password") object AuthenticationWithUserAndPassword : AuthenticationEvent("User and password")
object AuthenticationWithCas : AuthenticationEvent("CAS") object AuthenticationWithCas : AuthenticationEvent("CAS")
object AuthenticationWithSaml : AuthenticationEvent("SAML") object AuthenticationWithSaml : AuthenticationEvent("SAML")
object AuthenticationWithOauth : AuthenticationEvent("Oauth") object AuthenticationWithOauth : AuthenticationEvent("Oauth")
object AuthenticationWithDeeplink : AuthenticationEvent("Deep link") object AuthenticationWithDeeplink : AuthenticationEvent("Deep link")
} }
package chat.rocket.android.util.helper.analytics.event package chat.rocket.android.analytics.event
sealed class ScreenViewEvent(val screenName: String) { sealed class ScreenViewEvent(val screenName: String) {
...@@ -23,4 +23,4 @@ sealed class ScreenViewEvent(val screenName: String) { ...@@ -23,4 +23,4 @@ sealed class ScreenViewEvent(val screenName: String) {
object Settings : ScreenViewEvent("SettingsFragment") object Settings : ScreenViewEvent("SettingsFragment")
object SignUp : ScreenViewEvent("SignupFragment") object SignUp : ScreenViewEvent("SignupFragment")
object TwoFa : ScreenViewEvent("TwoFAFragment") object TwoFa : ScreenViewEvent("TwoFAFragment")
} }
\ No newline at end of file
package chat.rocket.android.util.helper.analytics.event package chat.rocket.android.analytics.event
sealed class SubscriptionTypeEvent(val subscriptionTypeName: String) { sealed class SubscriptionTypeEvent(val subscriptionTypeName: String) {
object DirectMessage : SubscriptionTypeEvent("Direct Message") object DirectMessage : SubscriptionTypeEvent("Direct Message")
object Channel : SubscriptionTypeEvent("Channel") object Channel : SubscriptionTypeEvent("Channel")
object Group : SubscriptionTypeEvent("Group") object Group : SubscriptionTypeEvent("Group")
} }
\ No newline at end of file
package chat.rocket.android.authentication.login.presentation package chat.rocket.android.authentication.login.presentation
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo
import chat.rocket.android.authentication.presentation.AuthenticationNavigator import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
...@@ -18,8 +20,6 @@ import chat.rocket.android.util.extensions.parseColor ...@@ -18,8 +20,6 @@ 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent
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
...@@ -62,7 +62,7 @@ class LoginPresenter @Inject constructor( ...@@ -62,7 +62,7 @@ class LoginPresenter @Inject constructor(
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
private val settingsInteractor: GetSettingsInteractor, private val settingsInteractor: GetSettingsInteractor,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
serverInteractor: GetConnectingServerInteractor, serverInteractor: GetConnectingServerInteractor,
private val saveCurrentServer: SaveCurrentServerInteractor, private val saveCurrentServer: SaveCurrentServerInteractor,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
...@@ -457,9 +457,7 @@ class LoginPresenter @Inject constructor( ...@@ -457,9 +457,7 @@ class LoginPresenter @Inject constructor(
saveAccount(myself.username!!) saveAccount(myself.username!!)
saveToken(token) saveToken(token)
registerPushToken() registerPushToken()
if (analyticsTrackingInteractor.get()) { analyticsManager.logLogin(loginMethod, true)
AnalyticsManager.logLogin(loginMethod, true)
}
if (loginType == TYPE_LOGIN_USER_EMAIL) { if (loginType == TYPE_LOGIN_USER_EMAIL) {
view.saveSmartLockCredentials(usernameOrEmail, password) view.saveSmartLockCredentials(usernameOrEmail, password)
} }
...@@ -473,9 +471,7 @@ class LoginPresenter @Inject constructor( ...@@ -473,9 +471,7 @@ class LoginPresenter @Inject constructor(
navigator.toTwoFA(usernameOrEmail, password) navigator.toTwoFA(usernameOrEmail, password)
} }
else -> { else -> {
if (analyticsTrackingInteractor.get()) { analyticsManager.logLogin(loginMethod, false)
AnalyticsManager.logLogin(loginMethod, false)
}
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -6,7 +6,6 @@ import android.content.Intent ...@@ -6,7 +6,6 @@ import android.content.Intent
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.text.style.ClickableSpan import android.text.style.ClickableSpan
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
...@@ -18,20 +17,30 @@ import android.widget.LinearLayout ...@@ -18,20 +17,30 @@ import android.widget.LinearLayout
import android.widget.ScrollView import android.widget.ScrollView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.postDelayed import androidx.core.view.postDelayed
import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo
import chat.rocket.android.authentication.login.presentation.LoginPresenter 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.KeyboardHelper
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.helper.TextHelper
import chat.rocket.android.util.extensions.* import chat.rocket.android.helper.getCredentials
import chat.rocket.android.util.helper.analytics.AnalyticsManager import chat.rocket.android.helper.hasCredentialsSupport
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.helper.requestStoredCredentials
import chat.rocket.android.webview.sso.ui.INTENT_SSO_TOKEN import chat.rocket.android.helper.saveCredentials
import chat.rocket.android.webview.sso.ui.ssoWebViewIntent import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.shake
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.extensions.vibrateSmartPhone
import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_SECRET import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_SECRET
import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_TOKEN import chat.rocket.android.webview.oauth.ui.INTENT_OAUTH_CREDENTIAL_TOKEN
import chat.rocket.android.webview.oauth.ui.oauthWebViewIntent import chat.rocket.android.webview.oauth.ui.oauthWebViewIntent
import chat.rocket.android.webview.sso.ui.INTENT_SSO_TOKEN
import chat.rocket.android.webview.sso.ui.ssoWebViewIntent
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_log_in.* import kotlinx.android.synthetic.main.fragment_authentication_log_in.*
...@@ -49,7 +58,7 @@ class LoginFragment : Fragment(), LoginView { ...@@ -49,7 +58,7 @@ class LoginFragment : Fragment(), LoginView {
@Inject @Inject
lateinit var presenter: LoginPresenter lateinit var presenter: LoginPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private var isOauthViewEnable = false private var isOauthViewEnable = false
private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener { private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
areLoginOptionsNeeded() areLoginOptionsNeeded()
...@@ -97,9 +106,7 @@ class LoginFragment : Fragment(), LoginView { ...@@ -97,9 +106,7 @@ class LoginFragment : Fragment(), LoginView {
image_key.isVisible = false image_key.isVisible = false
} }
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Login)
AnalyticsManager.logScreenView(ScreenViewEvent.Login)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
package chat.rocket.android.authentication.registerusername.presentation package chat.rocket.android.authentication.registerusername.presentation
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.authentication.presentation.AuthenticationNavigator import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetConnectingServerInteractor import chat.rocket.android.server.domain.GetConnectingServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
...@@ -19,8 +20,6 @@ import chat.rocket.android.util.extension.launchUI ...@@ -19,8 +20,6 @@ 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.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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent
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
...@@ -38,7 +37,7 @@ class RegisterUsernamePresenter @Inject constructor( ...@@ -38,7 +37,7 @@ class RegisterUsernamePresenter @Inject constructor(
private val factory: RocketChatClientFactory, private val factory: RocketChatClientFactory,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
serverInteractor: GetConnectingServerInteractor, serverInteractor: GetConnectingServerInteractor,
private val saveCurrentServer: SaveCurrentServerInteractor, private val saveCurrentServer: SaveCurrentServerInteractor,
settingsInteractor: GetSettingsInteractor settingsInteractor: GetSettingsInteractor
...@@ -63,15 +62,14 @@ class RegisterUsernamePresenter @Inject constructor( ...@@ -63,15 +62,14 @@ class RegisterUsernamePresenter @Inject constructor(
saveCurrentServer.save(currentServer) saveCurrentServer.save(currentServer)
tokenRepository.save(currentServer, Token(userId, authToken)) tokenRepository.save(currentServer, Token(userId, authToken))
registerPushToken() registerPushToken()
if (analyticsTrackingInteractor.get()) { analyticsManager.logSignUp(
AnalyticsManager.logSignUp(AuthenticationEvent.AuthenticationWithOauth, true) AuthenticationEvent.AuthenticationWithOauth,
} true
)
navigator.toChatList() navigator.toChatList()
} }
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
if (analyticsTrackingInteractor.get()) { analyticsManager.logSignUp(AuthenticationEvent.AuthenticationWithOauth, false)
AnalyticsManager.logSignUp(AuthenticationEvent.AuthenticationWithOauth, false)
}
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -3,17 +3,23 @@ package chat.rocket.android.authentication.registerusername.ui ...@@ -3,17 +3,23 @@ package chat.rocket.android.authentication.registerusername.ui
import DrawableHelper import DrawableHelper
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
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.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.helper.analytics.AnalyticsManager import chat.rocket.android.util.extensions.shake
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.util.extensions.showKeyboard
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.extensions.vibrateSmartPhone
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
...@@ -24,7 +30,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ...@@ -24,7 +30,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
@Inject @Inject
lateinit var presenter: RegisterUsernamePresenter lateinit var presenter: RegisterUsernamePresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var userId: String private lateinit var userId: String
private lateinit var authToken: String private lateinit var authToken: String
...@@ -69,9 +75,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ...@@ -69,9 +75,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
setupOnClickListener() setupOnClickListener()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.RegisterUsername)
AnalyticsManager.logScreenView(ScreenViewEvent.RegisterUsername)
}
} }
override fun alertBlankUsername() { override fun alertBlankUsername() {
......
...@@ -3,18 +3,24 @@ package chat.rocket.android.authentication.resetpassword.ui ...@@ -3,18 +3,24 @@ package chat.rocket.android.authentication.resetpassword.ui
import DrawableHelper import DrawableHelper
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
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.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.helper.analytics.AnalyticsManager import chat.rocket.android.util.extensions.shake
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.util.extensions.showKeyboard
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.extensions.vibrateSmartPhone
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
...@@ -25,7 +31,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { ...@@ -25,7 +31,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView {
@Inject @Inject
lateinit var presenter: ResetPasswordPresenter lateinit var presenter: ResetPasswordPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -52,9 +58,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { ...@@ -52,9 +58,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView {
setupOnClickListener() setupOnClickListener()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.ResetPassword)
AnalyticsManager.logScreenView(ScreenViewEvent.ResetPassword)
}
} }
override fun alertBlankEmail() { override fun alertBlankEmail() {
......
...@@ -3,23 +3,29 @@ package chat.rocket.android.authentication.server.ui ...@@ -3,23 +3,29 @@ package chat.rocket.android.authentication.server.ui
import android.app.AlertDialog import android.app.AlertDialog
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
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.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo
import chat.rocket.android.authentication.server.presentation.ServerPresenter 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.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.util.extensions.hintContent
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.ifEmpty
import chat.rocket.android.util.helper.analytics.AnalyticsManager import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.util.extensions.sanitize
import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui
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.*
...@@ -32,7 +38,7 @@ class ServerFragment : Fragment(), ServerView { ...@@ -32,7 +38,7 @@ class ServerFragment : Fragment(), ServerView {
@Inject @Inject
lateinit var presenter: ServerPresenter lateinit var presenter: ServerPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private var deepLinkInfo: LoginDeepLinkInfo? = null private var deepLinkInfo: LoginDeepLinkInfo? = null
private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener { private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
text_server_url.isCursorVisible = KeyboardHelper.isSoftKeyboardShown(relative_layout.rootView) text_server_url.isCursorVisible = KeyboardHelper.isSoftKeyboardShown(relative_layout.rootView)
...@@ -97,9 +103,7 @@ class ServerFragment : Fragment(), ServerView { ...@@ -97,9 +103,7 @@ class ServerFragment : Fragment(), ServerView {
} }
} }
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Server)
AnalyticsManager.logScreenView(ScreenViewEvent.Server)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
package chat.rocket.android.authentication.signup.presentation package chat.rocket.android.authentication.signup.presentation
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.authentication.presentation.AuthenticationNavigator import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetConnectingServerInteractor import chat.rocket.android.server.domain.GetConnectingServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
...@@ -20,8 +21,6 @@ import chat.rocket.android.util.extensions.privacyPolicyUrl ...@@ -20,8 +21,6 @@ import chat.rocket.android.util.extensions.privacyPolicyUrl
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.extensions.termsOfServiceUrl import chat.rocket.android.util.extensions.termsOfServiceUrl
import chat.rocket.android.util.helper.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent
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
...@@ -39,7 +38,7 @@ class SignupPresenter @Inject constructor( ...@@ -39,7 +38,7 @@ class SignupPresenter @Inject constructor(
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val serverInteractor: GetConnectingServerInteractor, private val serverInteractor: GetConnectingServerInteractor,
private val saveCurrentServerInteractor: SaveCurrentServerInteractor, private val saveCurrentServerInteractor: SaveCurrentServerInteractor,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
private val factory: RocketChatClientFactory, private val factory: RocketChatClientFactory,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
...@@ -81,21 +80,17 @@ class SignupPresenter @Inject constructor( ...@@ -81,21 +80,17 @@ 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()
if (analyticsTrackingInteractor.get()) { analyticsManager.logSignUp(
AnalyticsManager.logSignUp( AuthenticationEvent.AuthenticationWithUserAndPassword,
AuthenticationEvent.AuthenticationWithUserAndPassword, true
true )
)
}
view.saveSmartLockCredentials(username, password) view.saveSmartLockCredentials(username, password)
navigator.toChatList() navigator.toChatList()
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
if (analyticsTrackingInteractor.get()) { analyticsManager.logSignUp(
AnalyticsManager.logSignUp( AuthenticationEvent.AuthenticationWithUserAndPassword,
AuthenticationEvent.AuthenticationWithUserAndPassword, false
false )
)
}
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -13,20 +13,19 @@ import android.view.ViewTreeObserver ...@@ -13,20 +13,19 @@ import android.view.ViewTreeObserver
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.R.string.message_credentials_saved_successfully import chat.rocket.android.R.string.message_credentials_saved_successfully
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.authentication.signup.presentation.SignupPresenter import chat.rocket.android.authentication.signup.presentation.SignupPresenter
import chat.rocket.android.authentication.signup.presentation.SignupView import chat.rocket.android.authentication.signup.presentation.SignupView
import chat.rocket.android.helper.KeyboardHelper import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.helper.TextHelper import chat.rocket.android.helper.TextHelper
import chat.rocket.android.helper.saveCredentials import chat.rocket.android.helper.saveCredentials
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.shake import chat.rocket.android.util.extensions.shake
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.extensions.vibrateSmartPhone import chat.rocket.android.util.extensions.vibrateSmartPhone
import chat.rocket.android.util.helper.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -38,7 +37,7 @@ class SignupFragment : Fragment(), SignupView { ...@@ -38,7 +37,7 @@ class SignupFragment : Fragment(), SignupView {
@Inject @Inject
lateinit var presenter: SignupPresenter lateinit var presenter: SignupPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener { private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
if (KeyboardHelper.isSoftKeyboardShown(relative_layout.rootView)) { if (KeyboardHelper.isSoftKeyboardShown(relative_layout.rootView)) {
bottom_container.setVisible(false) bottom_container.setVisible(false)
...@@ -82,9 +81,7 @@ class SignupFragment : Fragment(), SignupView { ...@@ -82,9 +81,7 @@ class SignupFragment : Fragment(), SignupView {
) )
} }
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.SignUp)
AnalyticsManager.logScreenView(ScreenViewEvent.SignUp)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
package chat.rocket.android.authentication.twofactor.presentation package chat.rocket.android.authentication.twofactor.presentation
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.authentication.presentation.AuthenticationNavigator import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetConnectingServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.PublicSettings
import chat.rocket.android.server.domain.SaveAccountInteractor
import chat.rocket.android.server.domain.SaveCurrentServerInteractor
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.favicon
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.domain.wideTile
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.avatarUrl 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent
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
...@@ -30,7 +38,7 @@ class TwoFAPresenter @Inject constructor( ...@@ -30,7 +38,7 @@ class TwoFAPresenter @Inject constructor(
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val serverInteractor: GetConnectingServerInteractor, private val serverInteractor: GetConnectingServerInteractor,
private val saveCurrentServerInteractor: SaveCurrentServerInteractor, private val saveCurrentServerInteractor: SaveCurrentServerInteractor,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
private val factory: RocketChatClientFactory, private val factory: RocketChatClientFactory,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
...@@ -68,23 +76,19 @@ class TwoFAPresenter @Inject constructor( ...@@ -68,23 +76,19 @@ class TwoFAPresenter @Inject constructor(
saveCurrentServerInteractor.save(currentServer) saveCurrentServerInteractor.save(currentServer)
tokenRepository.save(server, token) tokenRepository.save(server, token)
registerPushToken() registerPushToken()
if (analyticsTrackingInteractor.get()) { analyticsManager.logLogin(
AnalyticsManager.logLogin( AuthenticationEvent.AuthenticationWithUserAndPassword,
AuthenticationEvent.AuthenticationWithUserAndPassword, true
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 {
if (analyticsTrackingInteractor.get()) { analyticsManager.logLogin(
AnalyticsManager.logLogin( AuthenticationEvent.AuthenticationWithUserAndPassword,
AuthenticationEvent.AuthenticationWithUserAndPassword, false
false )
)
}
exception.message?.let { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
......
...@@ -10,9 +10,10 @@ import android.view.ViewGroup ...@@ -10,9 +10,10 @@ import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
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.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.shake import chat.rocket.android.util.extensions.shake
...@@ -20,8 +21,6 @@ import chat.rocket.android.util.extensions.showToast ...@@ -20,8 +21,6 @@ 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.extensions.vibrateSmartPhone import chat.rocket.android.util.extensions.vibrateSmartPhone
import chat.rocket.android.util.helper.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -32,7 +31,7 @@ class TwoFAFragment : Fragment(), TwoFAView { ...@@ -32,7 +31,7 @@ class TwoFAFragment : Fragment(), TwoFAView {
@Inject @Inject
lateinit var presenter: TwoFAPresenter lateinit var presenter: TwoFAPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
lateinit var username: String lateinit var username: String
lateinit var password: String lateinit var password: String
...@@ -66,9 +65,7 @@ class TwoFAFragment : Fragment(), TwoFAView { ...@@ -66,9 +65,7 @@ class TwoFAFragment : Fragment(), TwoFAView {
setupOnClickListener() setupOnClickListener()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.TwoFa)
AnalyticsManager.logScreenView(ScreenViewEvent.TwoFa)
}
} }
override fun alertBlankTwoFactorAuthenticationCode() { override fun alertBlankTwoFactorAuthenticationCode() {
......
...@@ -9,15 +9,14 @@ import androidx.recyclerview.widget.DefaultItemAnimator ...@@ -9,15 +9,14 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatinformation.adapter.ReadReceiptAdapter import chat.rocket.android.chatinformation.adapter.ReadReceiptAdapter
import chat.rocket.android.chatinformation.presentation.MessageInfoPresenter import chat.rocket.android.chatinformation.presentation.MessageInfoPresenter
import chat.rocket.android.chatinformation.presentation.MessageInfoView import chat.rocket.android.chatinformation.presentation.MessageInfoView
import chat.rocket.android.chatinformation.viewmodel.ReadReceiptViewModel import chat.rocket.android.chatinformation.viewmodel.ReadReceiptViewModel
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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.*
import javax.inject.Inject import javax.inject.Inject
...@@ -37,7 +36,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -37,7 +36,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
@Inject @Inject
lateinit var presenter: MessageInfoPresenter lateinit var presenter: MessageInfoPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var adapter: ReadReceiptAdapter private lateinit var adapter: ReadReceiptAdapter
private lateinit var messageId: String private lateinit var messageId: String
...@@ -67,9 +66,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -67,9 +66,7 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
setupRecyclerView() setupRecyclerView()
presenter.loadReadReceipts(messageId = messageId) presenter.loadReadReceipts(messageId = messageId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.MessageInfo)
AnalyticsManager.logScreenView(ScreenViewEvent.MessageInfo)
}
} }
private fun setupRecyclerView() { private fun setupRecyclerView() {
......
...@@ -2,6 +2,8 @@ package chat.rocket.android.chatroom.presentation ...@@ -2,6 +2,8 @@ package chat.rocket.android.chatroom.presentation
import android.net.Uri import android.net.Uri
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.SubscriptionTypeEvent
import chat.rocket.android.chatroom.adapter.AutoCompleteType import chat.rocket.android.chatroom.adapter.AutoCompleteType
import chat.rocket.android.chatroom.adapter.PEOPLE import chat.rocket.android.chatroom.adapter.PEOPLE
import chat.rocket.android.chatroom.adapter.ROOMS import chat.rocket.android.chatroom.adapter.ROOMS
...@@ -17,7 +19,6 @@ import chat.rocket.android.db.DatabaseManager ...@@ -17,7 +19,6 @@ import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.helper.MessageHelper import chat.rocket.android.helper.MessageHelper
import chat.rocket.android.helper.UserHelper import chat.rocket.android.helper.UserHelper
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.JobSchedulerInteractor import chat.rocket.android.server.domain.JobSchedulerInteractor
...@@ -34,8 +35,6 @@ import chat.rocket.android.server.infraestructure.state ...@@ -34,8 +35,6 @@ 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.SubscriptionTypeEvent
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
...@@ -93,7 +92,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -93,7 +92,7 @@ class ChatRoomPresenter @Inject constructor(
private val usersRepository: UsersRepository, private val usersRepository: UsersRepository,
private val roomsRepository: RoomRepository, private val roomsRepository: RoomRepository,
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
private val userHelper: UserHelper, private val userHelper: UserHelper,
private val mapper: UiModelMapper, private val mapper: UiModelMapper,
private val jobSchedulerInteractor: JobSchedulerInteractor, private val jobSchedulerInteractor: JobSchedulerInteractor,
...@@ -300,9 +299,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -300,9 +299,7 @@ class ChatRoomPresenter @Inject constructor(
), false ), false
) )
client.sendMessage(id, chatRoomId, text) client.sendMessage(id, chatRoomId, text)
if (analyticsTrackingInteractor.get()) { logMessageSent()
logMessageSent(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
...@@ -370,9 +367,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -370,9 +367,7 @@ class ChatRoomPresenter @Inject constructor(
inputStream inputStream
} }
} }
if (analyticsTrackingInteractor.get()) { logMediaUploaded(mimeType)
logMediaUploaded(mimeType)
}
} }
} }
} }
...@@ -944,9 +939,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -944,9 +939,7 @@ class ChatRoomPresenter @Inject constructor(
retryIO("toggleEmoji($messageId, $emoji)") { retryIO("toggleEmoji($messageId, $emoji)") {
client.toggleReaction(messageId, emoji.removeSurrounding(":")) client.toggleReaction(messageId, emoji.removeSurrounding(":"))
} }
if (analyticsTrackingInteractor.get()) { logReactionEvent()
logReactionEvent()
}
} catch (ex: RocketChatException) { } catch (ex: RocketChatException) {
Timber.e(ex) Timber.e(ex)
} }
...@@ -956,30 +949,30 @@ class ChatRoomPresenter @Inject constructor( ...@@ -956,30 +949,30 @@ class ChatRoomPresenter @Inject constructor(
private fun logReactionEvent() { private fun logReactionEvent() {
when { when {
roomTypeOf(chatRoomType) is RoomType.DirectMessage -> roomTypeOf(chatRoomType) is RoomType.DirectMessage ->
AnalyticsManager.logReaction(SubscriptionTypeEvent.DirectMessage) analyticsManager.logReaction(SubscriptionTypeEvent.DirectMessage)
roomTypeOf(chatRoomType) is RoomType.Channel -> roomTypeOf(chatRoomType) is RoomType.Channel ->
AnalyticsManager.logReaction(SubscriptionTypeEvent.Channel) analyticsManager.logReaction(SubscriptionTypeEvent.Channel)
else -> AnalyticsManager.logReaction(SubscriptionTypeEvent.Group) else -> analyticsManager.logReaction(SubscriptionTypeEvent.Group)
} }
} }
private fun logMediaUploaded(mimeType: String) { private fun logMediaUploaded(mimeType: String) {
when { when {
roomTypeOf(chatRoomType) is RoomType.DirectMessage -> roomTypeOf(chatRoomType) is RoomType.DirectMessage ->
AnalyticsManager.logMediaUploaded(SubscriptionTypeEvent.DirectMessage, mimeType) analyticsManager.logMediaUploaded(SubscriptionTypeEvent.DirectMessage, mimeType)
roomTypeOf(chatRoomType) is RoomType.Channel -> roomTypeOf(chatRoomType) is RoomType.Channel ->
AnalyticsManager.logMediaUploaded(SubscriptionTypeEvent.Channel, mimeType) analyticsManager.logMediaUploaded(SubscriptionTypeEvent.Channel, mimeType)
else -> AnalyticsManager.logMediaUploaded(SubscriptionTypeEvent.Group, mimeType) else -> analyticsManager.logMediaUploaded(SubscriptionTypeEvent.Group, mimeType)
} }
} }
private fun logMessageSent(serverUrl: String) { private fun logMessageSent() {
when { when {
roomTypeOf(chatRoomType) is RoomType.DirectMessage -> roomTypeOf(chatRoomType) is RoomType.DirectMessage ->
AnalyticsManager.logMessageSent(SubscriptionTypeEvent.DirectMessage, serverUrl) analyticsManager.logMessageSent(SubscriptionTypeEvent.DirectMessage)
roomTypeOf(chatRoomType) is RoomType.Channel -> roomTypeOf(chatRoomType) is RoomType.Channel ->
AnalyticsManager.logMessageSent(SubscriptionTypeEvent.Channel, serverUrl) analyticsManager.logMessageSent(SubscriptionTypeEvent.Channel)
else -> AnalyticsManager.logMessageSent(SubscriptionTypeEvent.Group, serverUrl) else -> analyticsManager.logMessageSent(SubscriptionTypeEvent.Group)
} }
} }
......
...@@ -29,6 +29,8 @@ import androidx.recyclerview.widget.DefaultItemAnimator ...@@ -29,6 +29,8 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter
import chat.rocket.android.chatroom.adapter.PEOPLE import chat.rocket.android.chatroom.adapter.PEOPLE
...@@ -55,7 +57,6 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener ...@@ -55,7 +57,6 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.helper.ImageHelper import chat.rocket.android.helper.ImageHelper
import chat.rocket.android.helper.KeyboardHelper import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.helper.MessageParser import chat.rocket.android.helper.MessageParser
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.asObservable
import chat.rocket.android.util.extensions.circularRevealOrUnreveal import chat.rocket.android.util.extensions.circularRevealOrUnreveal
import chat.rocket.android.util.extensions.fadeIn import chat.rocket.android.util.extensions.fadeIn
...@@ -66,8 +67,6 @@ import chat.rocket.android.util.extensions.rotateBy ...@@ -66,8 +67,6 @@ 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -138,7 +137,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -138,7 +137,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
@Inject @Inject
lateinit var parser: MessageParser lateinit var parser: MessageParser
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var adapter: ChatRoomAdapter private lateinit var adapter: ChatRoomAdapter
internal lateinit var chatRoomId: String internal lateinit var chatRoomId: String
private lateinit var chatRoomName: String private lateinit var chatRoomName: String
...@@ -209,8 +208,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -209,8 +208,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
requireNotNull(bundle) { "no arguments supplied when the fragment was instantiated" } requireNotNull(bundle) { "no arguments supplied when the fragment was instantiated" }
} }
adapter = ChatRoomAdapter(chatRoomType, chatRoomName, this, adapter = ChatRoomAdapter(
reactionListener = this) chatRoomType, chatRoomName, this,
reactionListener = this
)
} }
override fun onCreateView( override fun onCreateView(
...@@ -236,9 +237,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -236,9 +237,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
it.showToolbarChatRoomIcon(chatRoomType) it.showToolbarChatRoomIcon(chatRoomType)
} }
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.ChatRoom)
AnalyticsManager.logScreenView(ScreenViewEvent.ChatRoom)
}
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
...@@ -476,17 +475,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -476,17 +475,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
when (usernameList.size) { when (usernameList.size) {
1 -> { 1 -> {
text_typing_status.text = text_typing_status.text =
SpannableStringBuilder() SpannableStringBuilder()
.bold { append(usernameList[0]) } .bold { append(usernameList[0]) }
.append(getString(R.string.msg_is_typing)) .append(getString(R.string.msg_is_typing))
} }
2 -> { 2 -> {
text_typing_status.text = text_typing_status.text =
SpannableStringBuilder() SpannableStringBuilder()
.bold { append(usernameList[0]) } .bold { append(usernameList[0]) }
.append(getString(R.string.msg_and)) .append(getString(R.string.msg_and))
.bold { append(usernameList[1]) } .bold { append(usernameList[1]) }
.append(getString(R.string.msg_are_typing)) .append(getString(R.string.msg_are_typing))
} }
else -> { else -> {
text_typing_status.text = getString(R.string.msg_several_users_are_typing) text_typing_status.text = getString(R.string.msg_several_users_are_typing)
...@@ -711,15 +710,15 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -711,15 +710,15 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
handler.postDelayed(dismissStatus, 2000) handler.postDelayed(dismissStatus, 2000)
} }
is State.Disconnected -> text_connection_status.text = is State.Disconnected -> text_connection_status.text =
getString(R.string.status_disconnected) getString(R.string.status_disconnected)
is State.Connecting -> text_connection_status.text = is State.Connecting -> text_connection_status.text =
getString(R.string.status_connecting) getString(R.string.status_connecting)
is State.Authenticating -> text_connection_status.text = is State.Authenticating -> text_connection_status.text =
getString(R.string.status_authenticating) getString(R.string.status_authenticating)
is State.Disconnecting -> text_connection_status.text = is State.Disconnecting -> text_connection_status.text =
getString(R.string.status_disconnecting) getString(R.string.status_disconnecting)
is State.Waiting -> text_connection_status.text = is State.Waiting -> text_connection_status.text =
getString(R.string.status_waiting, state.seconds) getString(R.string.status_waiting, state.seconds)
} }
} }
} }
...@@ -779,7 +778,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -779,7 +778,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
activity?.supportFragmentManager?.registerFragmentLifecycleCallbacks( activity?.supportFragmentManager?.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() { object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) { override fun onFragmentAttached(
fm: FragmentManager,
f: Fragment,
context: Context
) {
if (f is MessageActionsBottomSheet) { if (f is MessageActionsBottomSheet) {
setReactionButtonIcon(R.drawable.ic_reaction_24dp) setReactionButtonIcon(R.drawable.ic_reaction_24dp)
emojiKeyboardPopup.dismiss() emojiKeyboardPopup.dismiss()
...@@ -790,7 +793,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -790,7 +793,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
) )
subscribeComposeTextMessage() subscribeComposeTextMessage()
emojiKeyboardPopup = emojiKeyboardPopup =
EmojiKeyboardPopup(activity!!, activity!!.findViewById(R.id.fragment_container)) EmojiKeyboardPopup(activity!!, activity!!.findViewById(R.id.fragment_container))
emojiKeyboardPopup.listener = this emojiKeyboardPopup.listener = this
text_message.listener = object : ComposerEditText.ComposerEditTextListener { text_message.listener = object : ComposerEditText.ComposerEditTextListener {
override fun onKeyboardOpened() { override fun onKeyboardOpened() {
...@@ -980,7 +983,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -980,7 +983,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
presenter.messageInfo(id) presenter.messageInfo(id)
} }
override fun citeMessage(roomName: String, roomType: String, messageId: String, mentionAuthor: Boolean) { override fun citeMessage(
roomName: String,
roomType: String,
messageId: String,
mentionAuthor: Boolean
) {
presenter.citeMessage(roomName, roomType, messageId, mentionAuthor) presenter.citeMessage(roomName, roomType, messageId, mentionAuthor)
} }
...@@ -1012,10 +1020,15 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -1012,10 +1020,15 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
ui { ui {
val builder = AlertDialog.Builder(it) val builder = AlertDialog.Builder(it)
builder.setTitle(it.getString(R.string.msg_delete_message)) builder.setTitle(it.getString(R.string.msg_delete_message))
.setMessage(it.getString(R.string.msg_delete_description)) .setMessage(it.getString(R.string.msg_delete_description))
.setPositiveButton(it.getString(R.string.msg_ok)) { _, _ -> presenter.deleteMessage(roomId, id) } .setPositiveButton(it.getString(R.string.msg_ok)) { _, _ ->
.setNegativeButton(it.getString(R.string.msg_cancel)) { _, _ -> } presenter.deleteMessage(
.show() roomId,
id
)
}
.setNegativeButton(it.getString(R.string.msg_cancel)) { _, _ -> }
.show()
} }
} }
......
...@@ -21,6 +21,8 @@ import androidx.lifecycle.ViewModelProviders ...@@ -21,6 +21,8 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatrooms.adapter.RoomsAdapter import chat.rocket.android.chatrooms.adapter.RoomsAdapter
import chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter import chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter
import chat.rocket.android.chatrooms.presentation.ChatRoomsView import chat.rocket.android.chatrooms.presentation.ChatRoomsView
...@@ -32,15 +34,12 @@ import chat.rocket.android.db.DatabaseManager ...@@ -32,15 +34,12 @@ import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.helper.ChatRoomsSortOrder import chat.rocket.android.helper.ChatRoomsSortOrder
import chat.rocket.android.helper.Constants import chat.rocket.android.helper.Constants
import chat.rocket.android.helper.SharedPreferenceHelper import chat.rocket.android.helper.SharedPreferenceHelper
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extension.onQueryTextListener import chat.rocket.android.util.extension.onQueryTextListener
import chat.rocket.android.util.extensions.fadeIn import chat.rocket.android.util.extensions.fadeIn
import chat.rocket.android.util.extensions.fadeOut 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -60,7 +59,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -60,7 +59,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
@Inject @Inject
lateinit var dbManager: DatabaseManager // TODO - remove when moving ChatRoom screen to DB lateinit var dbManager: DatabaseManager // TODO - remove when moving ChatRoom screen to DB
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
lateinit var viewModel: ChatRoomsViewModel lateinit var viewModel: ChatRoomsViewModel
private var searchView: SearchView? = null private var searchView: SearchView? = null
private var sortView: MenuItem? = null private var sortView: MenuItem? = null
...@@ -112,9 +111,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -112,9 +111,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
setupToolbar() setupToolbar()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.ChatRooms)
AnalyticsManager.logScreenView(ScreenViewEvent.ChatRooms)
}
} }
private fun subscribeUi() { private fun subscribeUi() {
...@@ -124,9 +121,13 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -124,9 +121,13 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
} }
recycler_view.layoutManager = LinearLayoutManager(it) recycler_view.layoutManager = LinearLayoutManager(it)
recycler_view.addItemDecoration(DividerItemDecoration(it, recycler_view.addItemDecoration(
DividerItemDecoration(
it,
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_start), resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_start),
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_end))) resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_end)
)
)
recycler_view.itemAnimator = DefaultItemAnimator() recycler_view.itemAnimator = DefaultItemAnimator()
recycler_view.adapter = adapter recycler_view.adapter = adapter
...@@ -141,7 +142,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -141,7 +142,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}) })
viewModel.loadingState.observe(viewLifecycleOwner, Observer { state -> viewModel.loadingState.observe(viewLifecycleOwner, Observer { state ->
when(state) { when (state) {
is LoadingState.Loading -> if (state.count == 0L) showLoading() is LoadingState.Loading -> if (state.count == 0L) showLoading()
is LoadingState.Loaded -> { is LoadingState.Loaded -> {
hideLoading() hideLoading()
...@@ -195,29 +196,41 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -195,29 +196,41 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
// TODO - simplify this // TODO - simplify this
R.id.action_sort -> { R.id.action_sort -> {
val dialogLayout = layoutInflater.inflate(R.layout.chatroom_sort_dialog, null) val dialogLayout = layoutInflater.inflate(R.layout.chatroom_sort_dialog, null)
val sortType = SharedPreferenceHelper.getInt(Constants.CHATROOM_SORT_TYPE_KEY, ChatRoomsSortOrder.ACTIVITY) val sortType = SharedPreferenceHelper.getInt(
val groupByType = SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false) Constants.CHATROOM_SORT_TYPE_KEY,
ChatRoomsSortOrder.ACTIVITY
)
val groupByType =
SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false)
val radioGroup = dialogLayout.findViewById<RadioGroup>(R.id.radio_group_sort) val radioGroup = dialogLayout.findViewById<RadioGroup>(R.id.radio_group_sort)
val groupByTypeCheckBox = dialogLayout.findViewById<CheckBox>(R.id.checkbox_group_by_type) val groupByTypeCheckBox =
dialogLayout.findViewById<CheckBox>(R.id.checkbox_group_by_type)
radioGroup.check(when (sortType) { radioGroup.check(
0 -> R.id.radio_sort_alphabetical when (sortType) {
else -> R.id.radio_sort_activity 0 -> R.id.radio_sort_alphabetical
}) else -> R.id.radio_sort_activity
}
)
radioGroup.setOnCheckedChangeListener { _, checkedId -> radioGroup.setOnCheckedChangeListener { _, checkedId ->
run { run {
SharedPreferenceHelper.putInt(Constants.CHATROOM_SORT_TYPE_KEY, when (checkedId) { SharedPreferenceHelper.putInt(
R.id.radio_sort_alphabetical -> 0 Constants.CHATROOM_SORT_TYPE_KEY, when (checkedId) {
R.id.radio_sort_activity -> 1 R.id.radio_sort_alphabetical -> 0
else -> 1 R.id.radio_sort_activity -> 1
}) else -> 1
}
)
} }
} }
groupByTypeCheckBox.isChecked = groupByType groupByTypeCheckBox.isChecked = groupByType
groupByTypeCheckBox.setOnCheckedChangeListener { _, isChecked -> groupByTypeCheckBox.setOnCheckedChangeListener { _, isChecked ->
SharedPreferenceHelper.putBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, isChecked) SharedPreferenceHelper.putBoolean(
Constants.CHATROOM_GROUP_BY_TYPE_KEY,
isChecked
)
} }
AlertDialog.Builder(context) AlertDialog.Builder(context)
...@@ -234,10 +247,13 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -234,10 +247,13 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
} }
private fun updateSort() { private fun updateSort() {
val sortType = SharedPreferenceHelper.getInt(Constants.CHATROOM_SORT_TYPE_KEY, ChatRoomsSortOrder.ACTIVITY) val sortType = SharedPreferenceHelper.getInt(
Constants.CHATROOM_SORT_TYPE_KEY,
ChatRoomsSortOrder.ACTIVITY
)
val grouped = SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false) val grouped = SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false)
val query = when(sortType) { val query = when (sortType) {
ChatRoomsSortOrder.ALPHABETICAL -> { ChatRoomsSortOrder.ALPHABETICAL -> {
Query.ByName(grouped) Query.ByName(grouped)
} }
...@@ -304,11 +320,16 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -304,11 +320,16 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
text_connection_status.text = getString(R.string.status_connected) text_connection_status.text = getString(R.string.status_connected)
handler.postDelayed(dismissStatus, 2000) handler.postDelayed(dismissStatus, 2000)
} }
is State.Disconnected -> text_connection_status.text = getString(R.string.status_disconnected) is State.Disconnected -> text_connection_status.text =
is State.Connecting -> text_connection_status.text = getString(R.string.status_connecting) getString(R.string.status_disconnected)
is State.Authenticating -> text_connection_status.text = getString(R.string.status_authenticating) is State.Connecting -> text_connection_status.text =
is State.Disconnecting -> text_connection_status.text = getString(R.string.status_disconnecting) getString(R.string.status_connecting)
is State.Waiting -> text_connection_status.text = getString(R.string.status_waiting, state.seconds) is State.Authenticating -> text_connection_status.text =
getString(R.string.status_authenticating)
is State.Disconnecting -> text_connection_status.text =
getString(R.string.status_disconnecting)
is State.Waiting -> text_connection_status.text =
getString(R.string.status_waiting, state.seconds)
} }
} }
} }
......
...@@ -15,18 +15,17 @@ import androidx.recyclerview.widget.DividerItemDecoration ...@@ -15,18 +15,17 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.createchannel.presentation.CreateChannelPresenter import chat.rocket.android.createchannel.presentation.CreateChannelPresenter
import chat.rocket.android.createchannel.presentation.CreateChannelView import chat.rocket.android.createchannel.presentation.CreateChannelView
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.adapter.MembersAdapter
import chat.rocket.android.members.uimodel.MemberUiModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extension.asObservable 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -43,7 +42,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -43,7 +42,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
@Inject @Inject
lateinit var createChannelPresenter: CreateChannelPresenter lateinit var createChannelPresenter: CreateChannelPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private val adapter: MembersAdapter = MembersAdapter { private val adapter: MembersAdapter = MembersAdapter {
if (it.username != null) { if (it.username != null) {
...@@ -77,9 +76,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -77,9 +76,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
setupRecyclerView() setupRecyclerView()
subscribeEditTexts() subscribeEditTexts()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.CreateChannel)
AnalyticsManager.logScreenView(ScreenViewEvent.CreateChannel)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -9,6 +9,10 @@ import android.content.Context ...@@ -9,6 +9,10 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import chat.rocket.android.BuildConfig import chat.rocket.android.BuildConfig
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.Analytics
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.AnswersAnalytics
import chat.rocket.android.analytics.GoogleAnalyticsForFirebase
import chat.rocket.android.authentication.infraestructure.SharedPreferencesMultiServerTokenRepository import chat.rocket.android.authentication.infraestructure.SharedPreferencesMultiServerTokenRepository
import chat.rocket.android.authentication.infraestructure.SharedPreferencesTokenRepository import chat.rocket.android.authentication.infraestructure.SharedPreferencesTokenRepository
import chat.rocket.android.chatroom.service.MessageService import chat.rocket.android.chatroom.service.MessageService
...@@ -23,10 +27,12 @@ import chat.rocket.android.push.GroupedPush ...@@ -23,10 +27,12 @@ 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.AccountsRepository
import chat.rocket.android.server.domain.ActiveUsersRepository import chat.rocket.android.server.domain.ActiveUsersRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.AnalyticsTrackingRepository import chat.rocket.android.server.domain.AnalyticsTrackingRepository
import chat.rocket.android.server.domain.ChatRoomsRepository import chat.rocket.android.server.domain.ChatRoomsRepository
import chat.rocket.android.server.domain.CurrentServerRepository import chat.rocket.android.server.domain.CurrentServerRepository
import chat.rocket.android.server.domain.GetAccountInteractor import chat.rocket.android.server.domain.GetAccountInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.JobSchedulerInteractor import chat.rocket.android.server.domain.JobSchedulerInteractor
...@@ -115,7 +121,10 @@ class AppModule { ...@@ -115,7 +121,10 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideImagePipelineConfig(context: Context, okHttpClient: OkHttpClient): ImagePipelineConfig { fun provideImagePipelineConfig(
context: Context,
okHttpClient: OkHttpClient
): ImagePipelineConfig {
val listeners = setOf(RequestLoggingListener()) val listeners = setOf(RequestLoggingListener())
return OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient) return OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient)
...@@ -185,7 +194,10 @@ class AppModule { ...@@ -185,7 +194,10 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun providePermissionsRepository(localRepository: LocalRepository, moshi: Moshi): PermissionsRepository { fun providePermissionsRepository(
localRepository: LocalRepository,
moshi: Moshi
): PermissionsRepository {
return SharedPreferencesPermissionsRepository(localRepository, moshi) return SharedPreferencesPermissionsRepository(localRepository, moshi)
} }
...@@ -234,15 +246,20 @@ class AppModule { ...@@ -234,15 +246,20 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideMultiServerTokenRepository(repository: LocalRepository, moshi: Moshi): MultiServerTokenRepository { fun provideMultiServerTokenRepository(
repository: LocalRepository,
moshi: Moshi
): MultiServerTokenRepository {
return SharedPreferencesMultiServerTokenRepository(repository, moshi) return SharedPreferencesMultiServerTokenRepository(repository, moshi)
} }
@Provides @Provides
@Singleton @Singleton
fun provideMessageRepository(@ForMessages preferences: SharedPreferences, fun provideMessageRepository(
moshi: Moshi, @ForMessages preferences: SharedPreferences,
currentServerInteractor: GetCurrentServerInteractor): MessagesRepository { moshi: Moshi,
currentServerInteractor: GetCurrentServerInteractor
): MessagesRepository {
return SharedPreferencesMessagesRepository(preferences, moshi, currentServerInteractor) return SharedPreferencesMessagesRepository(preferences, moshi, currentServerInteractor)
} }
...@@ -257,10 +274,12 @@ class AppModule { ...@@ -257,10 +274,12 @@ class AppModule {
fun provideConfiguration(context: Application): SpannableConfiguration { fun provideConfiguration(context: Application): SpannableConfiguration {
val res = context.resources val res = context.resources
return SpannableConfiguration.builder(context) return SpannableConfiguration.builder(context)
.theme(SpannableTheme.builder() .theme(
.blockMargin(0) SpannableTheme.builder()
.linkColor(res.getColor(R.color.colorAccent)) .blockMargin(0)
.build()) .linkColor(res.getColor(R.color.colorAccent))
.build()
)
.build() .build()
} }
...@@ -277,7 +296,10 @@ class AppModule { ...@@ -277,7 +296,10 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideAccountsRepository(preferences: SharedPreferences, moshi: Moshi): AccountsRepository = fun provideAccountsRepository(
preferences: SharedPreferences,
moshi: Moshi
): AccountsRepository =
SharedPreferencesAccountsRepository(preferences, moshi) SharedPreferencesAccountsRepository(preferences, moshi)
@Provides @Provides
...@@ -296,8 +318,16 @@ class AppModule { ...@@ -296,8 +318,16 @@ class AppModule {
manager: NotificationManager, manager: NotificationManager,
moshi: Moshi, moshi: Moshi,
getAccountInteractor: GetAccountInteractor, getAccountInteractor: GetAccountInteractor,
getSettingsInteractor: GetSettingsInteractor): PushManager { getSettingsInteractor: GetSettingsInteractor
return PushManager(groupedPushes, manager, moshi, getAccountInteractor, getSettingsInteractor, context) ): PushManager {
return PushManager(
groupedPushes,
manager,
moshi,
getAccountInteractor,
getSettingsInteractor,
context
)
} }
@Provides @Provides
...@@ -307,14 +337,19 @@ class AppModule { ...@@ -307,14 +337,19 @@ class AppModule {
@Provides @Provides
fun provideSendMessageJob(context: Application): JobInfo { fun provideSendMessageJob(context: Application): JobInfo {
return JobInfo.Builder(MessageService.RETRY_SEND_MESSAGE_ID, return JobInfo.Builder(
ComponentName(context, MessageService::class.java)) MessageService.RETRY_SEND_MESSAGE_ID,
ComponentName(context, MessageService::class.java)
)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build() .build()
} }
@Provides @Provides
fun provideJobSchedulerInteractor(jobScheduler: JobScheduler, jobInfo: JobInfo): JobSchedulerInteractor { fun provideJobSchedulerInteractor(
jobScheduler: JobScheduler,
jobInfo: JobInfo
): JobSchedulerInteractor {
return JobSchedulerInteractorImpl(jobScheduler, jobInfo) return JobSchedulerInteractorImpl(jobScheduler, jobInfo)
} }
...@@ -331,4 +366,33 @@ class AppModule { ...@@ -331,4 +366,33 @@ class AppModule {
): DatabaseManager { ): DatabaseManager {
return factory.create(currentServer) return factory.create(currentServer)
} }
@Provides
@Singleton
fun provideAnswersAnalytics(): AnswersAnalytics {
return AnswersAnalytics()
}
@Provides
@Singleton
fun provideGoogleAnalyticsForFirebase(context: Application): GoogleAnalyticsForFirebase {
return GoogleAnalyticsForFirebase(context)
}
@Provides
@Singleton
fun provideAnalyticsManager(
analyticsTrackingInteractor: AnalyticsTrackingInteractor,
getCurrentServerInteractor: GetCurrentServerInteractor,
getAccountsInteractor: GetAccountsInteractor,
answersAnalytics: AnswersAnalytics,
googleAnalyticsForFirebase: GoogleAnalyticsForFirebase
): AnalyticsManager {
return AnalyticsManager(
analyticsTrackingInteractor,
getCurrentServerInteractor,
getAccountsInteractor,
listOf(answersAnalytics, googleAnalyticsForFirebase)
)
}
} }
...@@ -10,18 +10,17 @@ import androidx.recyclerview.widget.DefaultItemAnimator ...@@ -10,18 +10,17 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.uimodel.BaseUiModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesPresenter import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesPresenter
import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesView import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesView
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -41,7 +40,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { ...@@ -41,7 +40,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
@Inject @Inject
lateinit var presenter: FavoriteMessagesPresenter lateinit var presenter: FavoriteMessagesPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
private val adapter = ChatRoomAdapter(enableActions = false) private val adapter = ChatRoomAdapter(enableActions = false)
...@@ -68,9 +67,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { ...@@ -68,9 +67,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
setupToolbar() setupToolbar()
presenter.loadFavoriteMessages(chatRoomId) presenter.loadFavoriteMessages(chatRoomId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.FavoriteMessages)
AnalyticsManager.logScreenView(ScreenViewEvent.FavoriteMessages)
}
} }
override fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>) { override fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>) {
......
...@@ -13,6 +13,8 @@ import androidx.recyclerview.widget.DividerItemDecoration.HORIZONTAL ...@@ -13,6 +13,8 @@ import androidx.recyclerview.widget.DividerItemDecoration.HORIZONTAL
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.files.adapter.FilesAdapter import chat.rocket.android.files.adapter.FilesAdapter
import chat.rocket.android.files.presentation.FilesPresenter import chat.rocket.android.files.presentation.FilesPresenter
...@@ -21,12 +23,9 @@ import chat.rocket.android.files.uimodel.FileUiModel ...@@ -21,12 +23,9 @@ import chat.rocket.android.files.uimodel.FileUiModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.helper.ImageHelper import chat.rocket.android.helper.ImageHelper
import chat.rocket.android.player.PlayerActivity import chat.rocket.android.player.PlayerActivity
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -46,7 +45,7 @@ class FilesFragment : Fragment(), FilesView { ...@@ -46,7 +45,7 @@ class FilesFragment : Fragment(), FilesView {
@Inject @Inject
lateinit var presenter: FilesPresenter lateinit var presenter: FilesPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private val adapter: FilesAdapter = private val adapter: FilesAdapter =
FilesAdapter { fileUiModel -> presenter.openFile(fileUiModel) } FilesAdapter { fileUiModel -> presenter.openFile(fileUiModel) }
private val linearLayoutManager = LinearLayoutManager(context) private val linearLayoutManager = LinearLayoutManager(context)
...@@ -75,9 +74,7 @@ class FilesFragment : Fragment(), FilesView { ...@@ -75,9 +74,7 @@ class FilesFragment : Fragment(), FilesView {
setupRecyclerView() setupRecyclerView()
presenter.loadFiles(chatRoomId) presenter.loadFiles(chatRoomId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Files)
AnalyticsManager.logScreenView(ScreenViewEvent.Files)
}
} }
override fun showFiles(dataSet: List<FileUiModel>, total: Long) { override fun showFiles(dataSet: List<FileUiModel>, total: Long) {
......
...@@ -6,11 +6,10 @@ import android.view.View ...@@ -6,11 +6,10 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.fragment_member_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_member_bottom_sheet.*
import javax.inject.Inject import javax.inject.Inject
...@@ -43,7 +42,7 @@ private const val BUNDLE_UTC_OFFSET = "utc_offset" ...@@ -43,7 +42,7 @@ private const val BUNDLE_UTC_OFFSET = "utc_offset"
class MemberBottomSheetFragment : BottomSheetDialogFragment() { class MemberBottomSheetFragment : BottomSheetDialogFragment() {
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var avatarUri: String private lateinit var avatarUri: String
private lateinit var realName: String private lateinit var realName: String
private lateinit var username: String private lateinit var username: String
...@@ -76,9 +75,7 @@ class MemberBottomSheetFragment : BottomSheetDialogFragment() { ...@@ -76,9 +75,7 @@ class MemberBottomSheetFragment : BottomSheetDialogFragment() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
showMemberDetails() showMemberDetails()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.MemberBottomSheet)
AnalyticsManager.logScreenView(ScreenViewEvent.MemberBottomSheet)
}
} }
private fun showMemberDetails() { private fun showMemberDetails() {
......
package chat.rocket.android.members.ui package chat.rocket.android.members.ui
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.adapter.MembersAdapter
import chat.rocket.android.members.presentation.MembersPresenter import chat.rocket.android.members.presentation.MembersPresenter
import chat.rocket.android.members.presentation.MembersView import chat.rocket.android.members.presentation.MembersView
import chat.rocket.android.members.uimodel.MemberUiModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -41,7 +40,7 @@ class MembersFragment : Fragment(), MembersView { ...@@ -41,7 +40,7 @@ class MembersFragment : Fragment(), MembersView {
@Inject @Inject
lateinit var presenter: MembersPresenter lateinit var presenter: MembersPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private val adapter: MembersAdapter = private val adapter: MembersAdapter =
MembersAdapter { memberUiModel -> presenter.toMemberDetails(memberUiModel) } MembersAdapter { memberUiModel -> presenter.toMemberDetails(memberUiModel) }
private val linearLayoutManager = LinearLayoutManager(context) private val linearLayoutManager = LinearLayoutManager(context)
...@@ -70,9 +69,7 @@ class MembersFragment : Fragment(), MembersView { ...@@ -70,9 +69,7 @@ class MembersFragment : Fragment(), MembersView {
setupRecyclerView() setupRecyclerView()
presenter.loadChatRoomsMembers(chatRoomId) presenter.loadChatRoomsMembers(chatRoomId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Members)
AnalyticsManager.logScreenView(ScreenViewEvent.Members)
}
} }
override fun showMembers(dataSet: List<MemberUiModel>, total: Long) { override fun showMembers(dataSet: List<MemberUiModel>, total: Long) {
......
...@@ -10,18 +10,17 @@ import androidx.recyclerview.widget.DefaultItemAnimator ...@@ -10,18 +10,17 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.uimodel.BaseUiModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.mentions.presentention.MentionsPresenter import chat.rocket.android.mentions.presentention.MentionsPresenter
import chat.rocket.android.mentions.presentention.MentionsView import chat.rocket.android.mentions.presentention.MentionsView
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -44,7 +43,7 @@ class MentionsFragment : Fragment(), MentionsView { ...@@ -44,7 +43,7 @@ class MentionsFragment : Fragment(), MentionsView {
@Inject @Inject
lateinit var presenter: MentionsPresenter lateinit var presenter: MentionsPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -70,9 +69,7 @@ class MentionsFragment : Fragment(), MentionsView { ...@@ -70,9 +69,7 @@ class MentionsFragment : Fragment(), MentionsView {
setupToolbar() setupToolbar()
presenter.loadMentions(chatRoomId) presenter.loadMentions(chatRoomId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Mentions)
AnalyticsManager.logScreenView(ScreenViewEvent.Mentions)
}
} }
override fun showMentions(mentions: List<BaseUiModel<*>>) { override fun showMentions(mentions: List<BaseUiModel<*>>) {
......
...@@ -10,6 +10,8 @@ import androidx.recyclerview.widget.DefaultItemAnimator ...@@ -10,6 +10,8 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.uimodel.BaseUiModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
...@@ -20,8 +22,6 @@ import chat.rocket.android.server.domain.AnalyticsTrackingInteractor ...@@ -20,8 +22,6 @@ import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -41,7 +41,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView { ...@@ -41,7 +41,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
@Inject @Inject
lateinit var presenter: PinnedMessagesPresenter lateinit var presenter: PinnedMessagesPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
private val adapter = ChatRoomAdapter(enableActions = false) private val adapter = ChatRoomAdapter(enableActions = false)
...@@ -69,9 +69,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView { ...@@ -69,9 +69,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
setupToolbar() setupToolbar()
presenter.loadPinnedMessages(chatRoomId) presenter.loadPinnedMessages(chatRoomId)
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.PinnedMessages)
AnalyticsManager.logScreenView(ScreenViewEvent.PinnedMessages)
}
} }
override fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>) { override fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>) {
......
...@@ -7,12 +7,11 @@ import android.view.ViewGroup ...@@ -7,12 +7,11 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment 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.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.preferences.presentation.PreferencesPresenter import chat.rocket.android.preferences.presentation.PreferencesPresenter
import chat.rocket.android.preferences.presentation.PreferencesView import chat.rocket.android.preferences.presentation.PreferencesView
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.helper.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.* import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_preferences.* import kotlinx.android.synthetic.main.fragment_preferences.*
...@@ -24,7 +23,7 @@ class PreferencesFragment : Fragment(), PreferencesView { ...@@ -24,7 +23,7 @@ class PreferencesFragment : Fragment(), PreferencesView {
@Inject @Inject
lateinit var presenter: PreferencesPresenter lateinit var presenter: PreferencesPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -43,17 +42,15 @@ class PreferencesFragment : Fragment(), PreferencesView { ...@@ -43,17 +42,15 @@ class PreferencesFragment : Fragment(), PreferencesView {
setupListeners() setupListeners()
presenter.loadAnalyticsTrackingInformation() presenter.loadAnalyticsTrackingInformation()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Preferences)
AnalyticsManager.logScreenView(ScreenViewEvent.Preferences)
}
} }
override fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean) { override fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean) {
if (BuildConfig.FLAVOR == "foss") { if (BuildConfig.FLAVOR == "foss") {
text_analytics_tracking_description.text =
getString(R.string.msg_not_applicable_since_it_is_a_foss_version)
switch_analytics_tracking.isChecked = false switch_analytics_tracking.isChecked = false
switch_analytics_tracking.isEnabled = false switch_analytics_tracking.isEnabled = false
text_analytics_tracking_description.text =
getString(R.string.msg_not_applicable_since_it_is_a_foss_version)
return return
} }
......
...@@ -17,10 +17,11 @@ import androidx.core.net.toUri ...@@ -17,10 +17,11 @@ import androidx.core.net.toUri
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.profile.presentation.ProfilePresenter import chat.rocket.android.profile.presentation.ProfilePresenter
import chat.rocket.android.profile.presentation.ProfileView import chat.rocket.android.profile.presentation.ProfileView
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.asObservable
import chat.rocket.android.util.extension.dispatchImageSelection import chat.rocket.android.util.extension.dispatchImageSelection
import chat.rocket.android.util.extension.dispatchTakePicture import chat.rocket.android.util.extension.dispatchTakePicture
...@@ -28,8 +29,6 @@ import chat.rocket.android.util.extensions.inflate ...@@ -28,8 +29,6 @@ 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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -48,7 +47,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -48,7 +47,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
@Inject @Inject
lateinit var presenter: ProfilePresenter lateinit var presenter: ProfilePresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private var currentName = "" private var currentName = ""
private var currentUsername = "" private var currentUsername = ""
private var currentEmail = "" private var currentEmail = ""
...@@ -81,9 +80,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -81,9 +80,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
presenter.loadUserProfile() presenter.loadUserProfile()
subscribeEditTexts() subscribeEditTexts()
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Profile)
AnalyticsManager.logScreenView(ScreenViewEvent.Profile)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -3,7 +3,7 @@ package chat.rocket.android.server.domain ...@@ -3,7 +3,7 @@ package chat.rocket.android.server.domain
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
interface AccountsRepository { interface AccountsRepository {
suspend fun save(account: Account) fun save(account: Account)
suspend fun load(): List<Account> fun load(): List<Account>
suspend fun remove(serverUrl: String) fun remove(serverUrl: String)
} }
\ No newline at end of file
...@@ -3,5 +3,5 @@ package chat.rocket.android.server.domain ...@@ -3,5 +3,5 @@ package chat.rocket.android.server.domain
import javax.inject.Inject import javax.inject.Inject
class GetAccountsInteractor @Inject constructor(val repository: AccountsRepository) { class GetAccountsInteractor @Inject constructor(val repository: AccountsRepository) {
suspend fun get() = repository.load() fun get() = repository.load()
} }
\ No newline at end of file
...@@ -6,41 +6,37 @@ import chat.rocket.android.server.domain.AccountsRepository ...@@ -6,41 +6,37 @@ import chat.rocket.android.server.domain.AccountsRepository
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import com.squareup.moshi.Moshi import com.squareup.moshi.Moshi
import com.squareup.moshi.Types import com.squareup.moshi.Types
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.withContext private const val ACCOUNTS_KEY = "ACCOUNTS_KEY"
class SharedPreferencesAccountsRepository( class SharedPreferencesAccountsRepository(
private val preferences: SharedPreferences, private val preferences: SharedPreferences,
private val moshi: Moshi private val moshi: Moshi
) : AccountsRepository { ) : AccountsRepository {
override suspend fun save(newAccount: Account) { override fun save(newAccount: Account) {
withContext(CommonPool) { val accounts = load()
val accounts = load()
val newList = accounts.filter { account -> newAccount.serverUrl != account.serverUrl } val newList = accounts.filter { account -> newAccount.serverUrl != account.serverUrl }
.toMutableList() .toMutableList()
newList.add(0, newAccount) newList.add(0, newAccount)
save(newList) save(newList)
}
} }
override suspend fun load(): List<Account> = withContext(CommonPool) { override fun load(): List<Account> {
val json = preferences.getString(ACCOUNTS_KEY, "[]") val json = preferences.getString(ACCOUNTS_KEY, "[]")
val type = Types.newParameterizedType(List::class.java, Account::class.java) val type = Types.newParameterizedType(List::class.java, Account::class.java)
val adapter = moshi.adapter<List<Account>>(type) val adapter = moshi.adapter<List<Account>>(type)
adapter.fromJson(json) ?: emptyList() return adapter.fromJson(json) ?: emptyList()
} }
override suspend fun remove(serverUrl: String) { override fun remove(serverUrl: String) {
withContext(CommonPool) { val accounts = load()
val accounts = load()
val newList = accounts.filter { account -> serverUrl != account.serverUrl } val newList = accounts.filter { account -> serverUrl != account.serverUrl }
.toMutableList() .toMutableList()
save(newList) save(newList)
}
} }
private fun save(accounts: List<Account>) { private fun save(accounts: List<Account>) {
...@@ -50,6 +46,4 @@ class SharedPreferencesAccountsRepository( ...@@ -50,6 +46,4 @@ class SharedPreferencesAccountsRepository(
putString(ACCOUNTS_KEY, adapter.toJson(accounts)) putString(ACCOUNTS_KEY, adapter.toJson(accounts))
} }
} }
} }
\ No newline at end of file
private const val ACCOUNTS_KEY = "ACCOUNTS_KEY"
\ No newline at end of file
package chat.rocket.android.server.presentation package chat.rocket.android.server.presentation
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetAccountInteractor import chat.rocket.android.server.domain.GetAccountInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
...@@ -11,7 +11,6 @@ import chat.rocket.android.server.domain.SettingsRepository ...@@ -11,7 +11,6 @@ import chat.rocket.android.server.domain.SettingsRepository
import chat.rocket.android.server.domain.TokenRepository import chat.rocket.android.server.domain.TokenRepository
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.analytics.AnalyticsManager
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import javax.inject.Inject import javax.inject.Inject
...@@ -23,7 +22,7 @@ class ChangeServerPresenter @Inject constructor( ...@@ -23,7 +22,7 @@ class ChangeServerPresenter @Inject constructor(
private val getCurrentServerInteractor: GetCurrentServerInteractor, private val getCurrentServerInteractor: GetCurrentServerInteractor,
private val getAccountInteractor: GetAccountInteractor, private val getAccountInteractor: GetAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor, private val analyticsManager: AnalyticsManager,
private val settingsRepository: SettingsRepository, private val settingsRepository: SettingsRepository,
private val tokenRepository: TokenRepository, private val tokenRepository: TokenRepository,
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
...@@ -66,9 +65,7 @@ class ChangeServerPresenter @Inject constructor( ...@@ -66,9 +65,7 @@ class ChangeServerPresenter @Inject constructor(
saveCurrentServerInteractor.save(serverUrl) saveCurrentServerInteractor.save(serverUrl)
view.hideProgress() view.hideProgress()
if (analyticsTrackingInteractor.get()) { analyticsManager.logServerSwitch()
AnalyticsManager.logServerSwitch(serverUrl, accounts.size)
}
navigator.toChatRooms(chatRoomId) navigator.toChatRooms(chatRoomId)
}.ifNull { }.ifNull {
view.hideProgress() view.hideProgress()
......
...@@ -10,15 +10,14 @@ import android.widget.Toast ...@@ -10,15 +10,14 @@ import android.widget.Toast
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.settings.password.presentation.PasswordPresenter import chat.rocket.android.settings.password.presentation.PasswordPresenter
import chat.rocket.android.settings.password.presentation.PasswordView import chat.rocket.android.settings.password.presentation.PasswordView
import chat.rocket.android.util.extension.asObservable 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.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.analytics.AnalyticsManager
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
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
...@@ -32,7 +31,7 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback { ...@@ -32,7 +31,7 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
@Inject @Inject
lateinit var presenter: PasswordPresenter lateinit var presenter: PasswordPresenter
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private val disposables = CompositeDisposable() private val disposables = CompositeDisposable()
...@@ -56,9 +55,7 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback { ...@@ -56,9 +55,7 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
disposables.add(listenToChanges()) disposables.add(listenToChanges())
if (analyticsTrackingInteractor.get()) { analyticsManager.logScreenView(ScreenViewEvent.Password)
AnalyticsManager.logScreenView(ScreenViewEvent.Password)
}
} }
override fun onDestroyView() { override fun onDestroyView() {
......
...@@ -11,16 +11,16 @@ import androidx.fragment.app.Fragment ...@@ -11,16 +11,16 @@ import androidx.fragment.app.Fragment
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.about.ui.TAG_ABOUT_FRAGMENT
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
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.PreferencesFragment
import chat.rocket.android.preferences.ui.TAG_PREFERENCES_FRAGMENT import chat.rocket.android.preferences.ui.TAG_PREFERENCES_FRAGMENT
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
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.analytics.AnalyticsManager import dagger.android.support.AndroidSupportInjection
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent
import kotlinx.android.synthetic.main.fragment_settings.* import kotlinx.android.synthetic.main.fragment_settings.*
import javax.inject.Inject import javax.inject.Inject
import kotlin.reflect.KClass import kotlin.reflect.KClass
...@@ -29,7 +29,12 @@ internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment" ...@@ -29,7 +29,12 @@ internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment"
class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListener { class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListener {
@Inject @Inject
lateinit var analyticsTrackingInteractor: AnalyticsTrackingInteractor lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
...@@ -41,10 +46,7 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen ...@@ -41,10 +46,7 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
setupListView() setupListView()
analyticsManager.logScreenView(ScreenViewEvent.Settings)
if (analyticsTrackingInteractor.get()) {
AnalyticsManager.logScreenView(ScreenViewEvent.Settings)
}
} }
override fun onResume() { override fun onResume() {
......
package chat.rocket.android.util.helper.analytics package chat.rocket.android.analytics
import chat.rocket.android.util.helper.analytics.event.AuthenticationEvent import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.util.helper.analytics.event.ScreenViewEvent import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.util.helper.analytics.event.SubscriptionTypeEvent import chat.rocket.android.analytics.event.SubscriptionTypeEvent
import com.crashlytics.android.answers.Answers import com.crashlytics.android.answers.Answers
import com.crashlytics.android.answers.CustomEvent import com.crashlytics.android.answers.CustomEvent
import com.crashlytics.android.answers.LoginEvent import com.crashlytics.android.answers.LoginEvent
import com.crashlytics.android.answers.SignUpEvent import com.crashlytics.android.answers.SignUpEvent
// TODO inject the and analyticsTrackingInteractor and GetCurrentServerInteractor class AnswersAnalytics : Analytics {
object AnalyticsManager : Analytics {
override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) = override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) =
Answers.getInstance() Answers.getInstance()
......
package chat.rocket.android.analytics
import android.content.Context
import android.os.Bundle
import chat.rocket.android.analytics.event.AuthenticationEvent
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.analytics.event.SubscriptionTypeEvent
import com.google.firebase.analytics.FirebaseAnalytics
import javax.inject.Inject
class GoogleAnalyticsForFirebase @Inject constructor(val context: Context) :
Analytics {
private val firebaseAnalytics = FirebaseAnalytics.getInstance(context)
override fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle(1).apply {
putString(FirebaseAnalytics.Param.METHOD, event.methodName)
putLong(FirebaseAnalytics.Param.SUCCESS, if (loginSucceeded) 1 else 0)
})
}
override fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) {
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SIGN_UP, Bundle(1).apply {
putString(FirebaseAnalytics.Param.METHOD, event.methodName)
putLong(FirebaseAnalytics.Param.SUCCESS, if (signUpSucceeded) 1 else 0)
})
}
override fun logScreenView(event: ScreenViewEvent) {
firebaseAnalytics.logEvent("screen_view", Bundle(1).apply {
putString("screen", event.screenName)
})
}
override fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) {
firebaseAnalytics.logEvent("message_sent", Bundle(1).apply {
putString("subscription_type", event.subscriptionTypeName)
putString("server", serverUrl)
})
}
override fun logMediaUploaded(event: SubscriptionTypeEvent, mimeType: String) {
firebaseAnalytics.logEvent("media_upload", Bundle(1).apply {
putString("subscription_type", event.subscriptionTypeName)
putString("media_type", mimeType)
})
}
override fun logReaction(event: SubscriptionTypeEvent) {
firebaseAnalytics.logEvent("reaction", Bundle(1).apply {
putString("subscription_type", event.subscriptionTypeName)
})
}
override fun logServerSwitch(serverUrl: String, serverCount: Int) {
firebaseAnalytics.logEvent("server_switch", Bundle(1).apply {
putString("server_url", serverUrl)
putInt("server_count", serverCount)
})
}
}
...@@ -21,7 +21,7 @@ ext { ...@@ -21,7 +21,7 @@ ext {
dagger : '2.16', dagger : '2.16',
firebaseCloudMessage : '17.1.0', firebaseCloudMessage : '17.1.0',
firebaseAnalytics : '16.0.1', firebaseAnalytics : '16.0.3',
playServices : '15.0.1', playServices : '15.0.1',
exoPlayer : '2.8.2', exoPlayer : '2.8.2',
flexbox : '1.0.0', flexbox : '1.0.0',
......
...@@ -23,20 +23,6 @@ android { ...@@ -23,20 +23,6 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
flavorDimensions "type"
productFlavors {
// includes proprietary libs
play {
dimension "type"
}
// only foss
foss {
dimension "type"
}
}
} }
dependencies { dependencies {
...@@ -55,9 +41,4 @@ dependencies { ...@@ -55,9 +41,4 @@ 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
// Proprietary libraries
playImplementation('com.crashlytics.sdk.android:answers:1.4.2@aar') {
transitive = true
}
} }
\ 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