Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
AloqaIM-Android
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
AloqaIM-Android
Commits
3e0f1a48
Unverified
Commit
3e0f1a48
authored
Sep 04, 2018
by
Filipe de Lima Brito
Committed by
GitHub
Sep 04, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1649 from RocketChat/fix/fix-fcm
[FIX] Fixes for FCM registration.
parents
87079b36
d245d8b9
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
233 additions
and
193 deletions
+233
-193
build.gradle
app/build.gradle
+3
-0
PushToken.kt
app/src/foss/java/chat/rocket/android/push/PushToken.kt
+2
-3
GMSManager.kt
app/src/foss/java/chat/rocket/android/util/GMSManager.kt
+0
-7
RocketChatApplication.kt
...ain/java/chat/rocket/android/app/RocketChatApplication.kt
+11
-10
LoginPresenter.kt
...droid/authentication/login/presentation/LoginPresenter.kt
+22
-12
RegisterUsernamePresenter.kt
...egisterusername/presentation/RegisterUsernamePresenter.kt
+1
-15
SignupPresenter.kt
...oid/authentication/signup/presentation/SignupPresenter.kt
+0
-14
TwoFAPresenter.kt
...d/authentication/twofactor/presentation/TwoFAPresenter.kt
+0
-14
MessageService.kt
...va/chat/rocket/android/chatroom/service/MessageService.kt
+0
-1
AppComponent.kt
app/src/main/java/chat/rocket/android/dagger/AppComponent.kt
+3
-8
AndroidWorkerInjection.kt
.../rocket/android/dagger/injector/AndroidWorkerInjection.kt
+17
-0
HasWorkerInjector.kt
.../chat/rocket/android/dagger/injector/HasWorkerInjector.kt
+8
-0
AndroidWorkerInjectionModule.kt
...ket/android/dagger/module/AndroidWorkerInjectionModule.kt
+12
-0
WorkerKey.kt
...in/java/chat/rocket/android/dagger/qualifier/WorkerKey.kt
+10
-0
MainPresenter.kt
...va/chat/rocket/android/main/presentation/MainPresenter.kt
+0
-7
MainActivity.kt
...src/main/java/chat/rocket/android/main/ui/MainActivity.kt
+2
-7
RocketChatClient.kt
...a/chat/rocket/android/util/extensions/RocketChatClient.kt
+5
-5
AndroidManifest.xml
app/src/play/AndroidManifest.xml
+0
-7
ServiceBuilder.kt
.../java/chat/rocket/android/dagger/module/ServiceBuilder.kt
+16
-6
GooglePlayServices.kt
...java/chat/rocket/android/extensions/GooglePlayServices.kt
+15
-0
FirebaseMessagingService.kt
...java/chat/rocket/android/push/FirebaseMessagingService.kt
+20
-0
FirebaseTokenService.kt
...lay/java/chat/rocket/android/push/FirebaseTokenService.kt
+0
-54
PushToken.kt
app/src/play/java/chat/rocket/android/push/PushToken.kt
+18
-0
FirebaseTokenServiceProvider.kt
...at/rocket/android/push/di/FirebaseTokenServiceProvider.kt
+0
-11
TokenRegistrationSubComponent.kt
...t/rocket/android/push/di/TokenRegistrationSubComponent.kt
+11
-0
TokenRegistrationWorker.kt
...hat/rocket/android/push/worker/TokenRegistrationWorker.kt
+52
-0
GMSManager.kt
app/src/play/java/chat/rocket/android/util/GMSManager.kt
+0
-12
dependencies.gradle
dependencies.gradle
+5
-0
No files found.
app/build.gradle
View file @
3e0f1a48
...
...
@@ -105,6 +105,7 @@ dependencies {
implementation
libraries
.
browser
implementation
libraries
.
androidKtx
implementation
libraries
.
fragmentsKtx
implementation
libraries
.
dagger
implementation
libraries
.
daggerSupport
...
...
@@ -118,6 +119,8 @@ dependencies {
kapt
libraries
.
roomProcessor
implementation
libraries
.
lifecycleExtensions
kapt
libraries
.
lifecycleCompiler
implementation
libraries
.
viewmodelKtx
implementation
libraries
.
workmanager
implementation
libraries
.
rxKotlin
implementation
libraries
.
rxAndroid
...
...
app/src/foss/java/chat/rocket/android/push/
FirebaseTokenService
.kt
→
app/src/foss/java/chat/rocket/android/push/
PushToken
.kt
View file @
3e0f1a48
package
chat.rocket.android.push
class
FirebaseTokenService
{
}
\ No newline at end of file
fun
refreshPushToken
()
{
}
app/src/foss/java/chat/rocket/android/util/GMSManager.kt
View file @
3e0f1a48
package
chat.rocket.android.util
import
chat.rocket.android.main.presentation.MainPresenter
fun
refreshFCMToken
(
presenter
:
MainPresenter
)
{
//Do absolutely nothing
}
fun
invalidateFirebaseToken
(
token
:
String
)
{
//Do absolutely nothing
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/app/RocketChatApplication.kt
View file @
3e0f1a48
...
...
@@ -8,8 +8,10 @@ import android.content.Context
import
android.content.SharedPreferences
import
androidx.core.content.edit
import
androidx.lifecycle.ProcessLifecycleOwner
import
androidx.work.Worker
import
chat.rocket.android.BuildConfig
import
chat.rocket.android.dagger.DaggerAppComponent
import
chat.rocket.android.dagger.injector.HasWorkerInjector
import
chat.rocket.android.dagger.qualifier.ForMessages
import
chat.rocket.android.helper.CrashlyticsTree
import
chat.rocket.android.infrastructure.LocalRepository
...
...
@@ -33,7 +35,7 @@ import java.lang.ref.WeakReference
import
javax.inject.Inject
class
RocketChatApplication
:
Application
(),
HasActivityInjector
,
HasServiceInjector
,
HasBroadcastReceiverInjector
{
HasBroadcastReceiverInjector
,
HasWorkerInjector
{
@Inject
lateinit
var
appLifecycleObserver
:
AppLifecycleObserver
...
...
@@ -47,6 +49,9 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
@Inject
lateinit
var
broadcastReceiverInjector
:
DispatchingAndroidInjector
<
BroadcastReceiver
>
@Inject
lateinit
var
workerInjector
:
DispatchingAndroidInjector
<
Worker
>
@Inject
lateinit
var
imagePipelineConfig
:
ImagePipelineConfig
@Inject
...
...
@@ -132,17 +137,13 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
}
}
override
fun
activityInjector
():
AndroidInjector
<
Activity
>
{
return
activityDispatchingAndroidInjector
}
override
fun
activityInjector
()
=
activityDispatchingAndroidInjector
override
fun
serviceInjector
():
AndroidInjector
<
Service
>
{
return
serviceDispatchingAndroidInjector
}
override
fun
serviceInjector
()
=
serviceDispatchingAndroidInjector
override
fun
broadcastReceiverInjector
()
:
AndroidInjector
<
BroadcastReceiver
>
{
return
broadcastReceiverInjector
}
override
fun
broadcastReceiverInjector
()
=
broadcastReceiverInjector
override
fun
workerInjector
()
=
workerInjector
companion
object
{
var
context
:
WeakReference
<
Context
>?
=
null
...
...
app/src/main/java/chat/rocket/android/authentication/login/presentation/LoginPresenter.kt
View file @
3e0f1a48
...
...
@@ -7,8 +7,29 @@ import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.helper.OauthHelper
import
chat.rocket.android.infrastructure.LocalRepository
import
chat.rocket.android.server.domain.*
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.casLoginUrl
import
chat.rocket.android.server.domain.favicon
import
chat.rocket.android.server.domain.gitlabUrl
import
chat.rocket.android.server.domain.isCasAuthenticationEnabled
import
chat.rocket.android.server.domain.isFacebookAuthenticationEnabled
import
chat.rocket.android.server.domain.isGithubAuthenticationEnabled
import
chat.rocket.android.server.domain.isGitlabAuthenticationEnabled
import
chat.rocket.android.server.domain.isGoogleAuthenticationEnabled
import
chat.rocket.android.server.domain.isLdapAuthenticationEnabled
import
chat.rocket.android.server.domain.isLinkedinAuthenticationEnabled
import
chat.rocket.android.server.domain.isLoginFormEnabled
import
chat.rocket.android.server.domain.isPasswordResetEnabled
import
chat.rocket.android.server.domain.isRegistrationEnabledForNewUsers
import
chat.rocket.android.server.domain.isWordpressAuthenticationEnabled
import
chat.rocket.android.server.domain.model.Account
import
chat.rocket.android.server.domain.wideTile
import
chat.rocket.android.server.domain.wordpressUrl
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extension.launchUI
import
chat.rocket.android.util.extensions.avatarUrl
...
...
@@ -17,7 +38,6 @@ import chat.rocket.android.util.extensions.encodeToBase64
import
chat.rocket.android.util.extensions.generateRandomString
import
chat.rocket.android.util.extensions.isEmail
import
chat.rocket.android.util.extensions.parseColor
import
chat.rocket.android.util.extensions.registerPushToken
import
chat.rocket.android.util.extensions.samlUrl
import
chat.rocket.android.util.extensions.serverLogoUrl
import
chat.rocket.android.util.retryIO
...
...
@@ -60,7 +80,6 @@ class LoginPresenter @Inject constructor(
private
val
navigator
:
AuthenticationNavigator
,
private
val
tokenRepository
:
TokenRepository
,
private
val
localRepository
:
LocalRepository
,
private
val
getAccountsInteractor
:
GetAccountsInteractor
,
private
val
settingsInteractor
:
GetSettingsInteractor
,
private
val
analyticsManager
:
AnalyticsManager
,
serverInteractor
:
GetConnectingServerInteractor
,
...
...
@@ -457,7 +476,6 @@ class LoginPresenter @Inject constructor(
localRepository
.
save
(
LocalRepository
.
CURRENT_USERNAME_KEY
,
myself
.
username
)
saveAccount
(
myself
.
username
!!
)
saveToken
(
token
)
registerPushToken
()
analyticsManager
.
logLogin
(
loginMethod
,
true
)
if
(
loginType
==
TYPE_LOGIN_USER_EMAIL
)
{
view
.
saveSmartLockCredentials
(
usernameOrEmail
,
password
)
...
...
@@ -611,12 +629,4 @@ class LoginPresenter @Inject constructor(
private
fun
saveToken
(
token
:
Token
)
{
tokenRepository
.
save
(
currentServer
,
token
)
}
private
suspend
fun
registerPushToken
()
{
localRepository
.
get
(
LocalRepository
.
KEY_PUSH_TOKEN
)
?.
let
{
client
.
registerPushToken
(
it
,
getAccountsInteractor
.
get
(),
factory
)
}
// TODO: When the push token is null, at some point we should receive it with
// onTokenRefresh() on FirebaseTokenService, we need to confirm it.
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/authentication/registerusername/presentation/RegisterUsernamePresenter.kt
View file @
3e0f1a48
...
...
@@ -4,8 +4,6 @@ import chat.rocket.android.analytics.AnalyticsManager
import
chat.rocket.android.analytics.event.AuthenticationEvent
import
chat.rocket.android.authentication.presentation.AuthenticationNavigator
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.infrastructure.LocalRepository
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
...
...
@@ -18,7 +16,6 @@ import chat.rocket.android.server.domain.wideTile
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extension.launchUI
import
chat.rocket.android.util.extensions.avatarUrl
import
chat.rocket.android.util.extensions.registerPushToken
import
chat.rocket.android.util.extensions.serverLogoUrl
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatException
...
...
@@ -33,10 +30,8 @@ class RegisterUsernamePresenter @Inject constructor(
private
val
strategy
:
CancelStrategy
,
private
val
navigator
:
AuthenticationNavigator
,
private
val
tokenRepository
:
TokenRepository
,
private
val
localRepository
:
LocalRepository
,
private
val
factory
:
RocketChatClientFactory
,
factory
:
RocketChatClientFactory
,
private
val
saveAccountInteractor
:
SaveAccountInteractor
,
private
val
getAccountsInteractor
:
GetAccountsInteractor
,
private
val
analyticsManager
:
AnalyticsManager
,
serverInteractor
:
GetConnectingServerInteractor
,
private
val
saveCurrentServer
:
SaveCurrentServerInteractor
,
...
...
@@ -61,7 +56,6 @@ class RegisterUsernamePresenter @Inject constructor(
saveAccount
(
registeredUsername
)
saveCurrentServer
.
save
(
currentServer
)
tokenRepository
.
save
(
currentServer
,
Token
(
userId
,
authToken
))
registerPushToken
()
analyticsManager
.
logSignUp
(
AuthenticationEvent
.
AuthenticationWithOauth
,
true
...
...
@@ -82,14 +76,6 @@ class RegisterUsernamePresenter @Inject constructor(
}
}
private
suspend
fun
registerPushToken
()
{
localRepository
.
get
(
LocalRepository
.
KEY_PUSH_TOKEN
)
?.
let
{
client
.
registerPushToken
(
it
,
getAccountsInteractor
.
get
(),
factory
)
}
// TODO: When the push token is null, at some point we should receive it with
// onTokenRefresh() on FirebaseTokenService, we need to confirm it.
}
private
suspend
fun
saveAccount
(
username
:
String
)
{
val
icon
=
settings
.
favicon
()
?.
let
{
currentServer
.
serverLogoUrl
(
it
)
...
...
app/src/main/java/chat/rocket/android/authentication/signup/presentation/SignupPresenter.kt
View file @
3e0f1a48
...
...
@@ -5,7 +5,6 @@ import chat.rocket.android.analytics.event.AuthenticationEvent
import
chat.rocket.android.authentication.presentation.AuthenticationNavigator
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.infrastructure.LocalRepository
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
...
...
@@ -18,13 +17,11 @@ import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extension.launchUI
import
chat.rocket.android.util.extensions.avatarUrl
import
chat.rocket.android.util.extensions.privacyPolicyUrl
import
chat.rocket.android.util.extensions.registerPushToken
import
chat.rocket.android.util.extensions.serverLogoUrl
import
chat.rocket.android.util.extensions.termsOfServiceUrl
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatException
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.login
import
chat.rocket.core.internal.rest.me
import
chat.rocket.core.internal.rest.signup
...
...
@@ -41,11 +38,9 @@ class SignupPresenter @Inject constructor(
private
val
analyticsManager
:
AnalyticsManager
,
private
val
factory
:
RocketChatClientFactory
,
private
val
saveAccountInteractor
:
SaveAccountInteractor
,
private
val
getAccountsInteractor
:
GetAccountsInteractor
,
settingsInteractor
:
GetSettingsInteractor
)
{
private
val
currentServer
=
serverInteractor
.
get
()
!!
private
val
client
:
RocketChatClient
=
factory
.
create
(
currentServer
)
private
var
settings
:
PublicSettings
=
settingsInteractor
.
get
(
serverInteractor
.
get
()
!!
)
fun
signup
(
name
:
String
,
username
:
String
,
password
:
String
,
email
:
String
)
{
...
...
@@ -79,7 +74,6 @@ class SignupPresenter @Inject constructor(
saveCurrentServerInteractor
.
save
(
currentServer
)
localRepository
.
save
(
LocalRepository
.
CURRENT_USERNAME_KEY
,
me
.
username
)
saveAccount
(
me
)
registerPushToken
()
analyticsManager
.
logSignUp
(
AuthenticationEvent
.
AuthenticationWithUserAndPassword
,
true
...
...
@@ -117,14 +111,6 @@ class SignupPresenter @Inject constructor(
}
}
private
suspend
fun
registerPushToken
()
{
localRepository
.
get
(
LocalRepository
.
KEY_PUSH_TOKEN
)
?.
let
{
client
.
registerPushToken
(
it
,
getAccountsInteractor
.
get
(),
factory
)
}
// TODO: When the push token is null, at some point we should receive it with
// onTokenRefresh() on FirebaseTokenService, we need to confirm it.
}
private
suspend
fun
saveAccount
(
me
:
Myself
)
{
val
icon
=
settings
.
favicon
()
?.
let
{
currentServer
.
serverLogoUrl
(
it
)
...
...
app/src/main/java/chat/rocket/android/authentication/twofactor/presentation/TwoFAPresenter.kt
View file @
3e0f1a48
...
...
@@ -5,7 +5,6 @@ import chat.rocket.android.analytics.event.AuthenticationEvent
import
chat.rocket.android.authentication.presentation.AuthenticationNavigator
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.infrastructure.LocalRepository
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
...
...
@@ -18,13 +17,11 @@ import chat.rocket.android.server.domain.wideTile
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extension.launchUI
import
chat.rocket.android.util.extensions.avatarUrl
import
chat.rocket.android.util.extensions.registerPushToken
import
chat.rocket.android.util.extensions.serverLogoUrl
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatAuthException
import
chat.rocket.common.RocketChatException
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.login
import
chat.rocket.core.internal.rest.me
import
chat.rocket.core.model.Myself
...
...
@@ -41,11 +38,9 @@ class TwoFAPresenter @Inject constructor(
private
val
analyticsManager
:
AnalyticsManager
,
private
val
factory
:
RocketChatClientFactory
,
private
val
saveAccountInteractor
:
SaveAccountInteractor
,
private
val
getAccountsInteractor
:
GetAccountsInteractor
,
settingsInteractor
:
GetSettingsInteractor
)
{
private
val
currentServer
=
serverInteractor
.
get
()
!!
private
val
client
:
RocketChatClient
=
factory
.
create
(
currentServer
)
private
var
settings
:
PublicSettings
=
settingsInteractor
.
get
(
serverInteractor
.
get
()
!!
)
// TODO: If the usernameOrEmail and password was informed by the user on the previous screen, then we should pass only the pin, like this: fun authenticate(pin: EditText)
...
...
@@ -76,7 +71,6 @@ class TwoFAPresenter @Inject constructor(
saveCurrentServerInteractor
.
save
(
currentServer
)
tokenRepository
.
save
(
server
,
token
)
localRepository
.
save
(
LocalRepository
.
CURRENT_USERNAME_KEY
,
me
.
username
)
registerPushToken
()
analyticsManager
.
logLogin
(
AuthenticationEvent
.
AuthenticationWithUserAndPassword
,
true
...
...
@@ -106,14 +100,6 @@ class TwoFAPresenter @Inject constructor(
fun
signup
()
=
navigator
.
toSignUp
()
private
suspend
fun
registerPushToken
()
{
localRepository
.
get
(
LocalRepository
.
KEY_PUSH_TOKEN
)
?.
let
{
client
.
registerPushToken
(
it
,
getAccountsInteractor
.
get
(),
factory
)
}
// TODO: When the push token is null, at some point we should receive it with
// onTokenRefresh() on FirebaseTokenService, we need to confirm it.
}
private
suspend
fun
saveAccount
(
me
:
Myself
)
{
val
icon
=
settings
.
favicon
()
?.
let
{
currentServer
.
serverLogoUrl
(
it
)
...
...
app/src/main/java/chat/rocket/android/chatroom/service/MessageService.kt
View file @
3e0f1a48
...
...
@@ -5,7 +5,6 @@ import android.app.job.JobService
import
chat.rocket.android.server.domain.CurrentServerRepository
import
chat.rocket.android.server.domain.MessagesRepository
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import
chat.rocket.common.RocketChatException
import
chat.rocket.core.internal.rest.sendMessage
import
chat.rocket.core.model.Message
import
dagger.android.AndroidInjection
...
...
app/src/main/java/chat/rocket/android/dagger/AppComponent.kt
View file @
3e0f1a48
package
chat.rocket.android.dagger
import
android.app.Application
import
chat.rocket.android.app.AppLifecycleObserver
import
chat.rocket.android.app.RocketChatApplication
import
chat.rocket.android.chatroom.service.MessageService
import
chat.rocket.android.dagger.module.ActivityBuilder
import
chat.rocket.android.dagger.module.AndroidWorkerInjectionModule
import
chat.rocket.android.dagger.module.AppModule
import
chat.rocket.android.dagger.module.ReceiverBuilder
import
chat.rocket.android.dagger.module.ServiceBuilder
import
chat.rocket.android.push.FirebaseTokenService
import
dagger.BindsInstance
import
dagger.Component
import
dagger.android.support.AndroidSupportInjectionModule
...
...
@@ -16,7 +15,8 @@ import javax.inject.Singleton
@Singleton
@Component
(
modules
=
[
AndroidSupportInjectionModule
::
class
,
AppModule
::
class
,
ActivityBuilder
::
class
,
ServiceBuilder
::
class
,
ReceiverBuilder
::
class
])
AppModule
::
class
,
ActivityBuilder
::
class
,
ServiceBuilder
::
class
,
ReceiverBuilder
::
class
,
AndroidWorkerInjectionModule
::
class
])
interface
AppComponent
{
@Component
.
Builder
...
...
@@ -29,10 +29,5 @@ interface AppComponent {
fun
inject
(
app
:
RocketChatApplication
)
fun
inject
(
service
:
FirebaseTokenService
)
fun
inject
(
service
:
MessageService
)
/*@Component.Builder
abstract class Builder : AndroidInjector.Builder<RocketChatApplication>()*/
}
app/src/main/java/chat/rocket/android/dagger/injector/AndroidWorkerInjection.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.dagger.injector
import
androidx.work.Worker
object
AndroidWorkerInjection
{
fun
inject
(
worker
:
Worker
)
{
val
application
=
worker
.
applicationContext
if
(
application
!
is
HasWorkerInjector
)
{
throw
RuntimeException
(
"${application.javaClass.canonicalName} does not implement ${HasWorkerInjector::class.java.canonicalName}"
)
}
val
workerInjector
=
(
application
as
HasWorkerInjector
).
workerInjector
()
checkNotNull
(
workerInjector
)
{
"${application.javaClass}.workerInjector() return null"
}
workerInjector
.
inject
(
worker
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/dagger/injector/HasWorkerInjector.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.dagger.injector
import
androidx.work.Worker
import
dagger.android.AndroidInjector
interface
HasWorkerInjector
{
fun
workerInjector
():
AndroidInjector
<
Worker
>
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/dagger/module/AndroidWorkerInjectionModule.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.dagger.module
import
androidx.work.Worker
import
dagger.Module
import
dagger.android.AndroidInjector
import
dagger.multibindings.Multibinds
@Module
abstract
class
AndroidWorkerInjectionModule
{
@Multibinds
abstract
fun
workerInjectorFactories
():
Map
<
Class
<
out
Worker
>,
AndroidInjector
.
Factory
<
out
Worker
>>
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/dagger/qualifier/WorkerKey.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.dagger.qualifier
import
androidx.work.Worker
import
dagger.MapKey
import
kotlin.reflect.KClass
@MapKey
@Retention
(
AnnotationRetention
.
RUNTIME
)
@Target
(
AnnotationTarget
.
FUNCTION
)
annotation
class
WorkerKey
(
val
value
:
KClass
<
out
Worker
>)
app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt
View file @
3e0f1a48
...
...
@@ -233,13 +233,6 @@ class MainPresenter @Inject constructor(
}
}
suspend
fun
refreshToken
(
token
:
String
?)
{
token
?.
let
{
localRepository
.
save
(
LocalRepository
.
KEY_PUSH_TOKEN
,
token
)
client
.
registerPushToken
(
token
,
getAccountsInteractor
.
get
(),
factory
)
}
}
private
suspend
fun
saveAccount
(
uiModel
:
NavHeaderUiModel
)
{
val
icon
=
settings
.
favicon
()
?.
let
{
currentServer
.
serverLogoUrl
(
it
)
...
...
app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt
View file @
3e0f1a48
...
...
@@ -18,6 +18,7 @@ import chat.rocket.android.main.adapter.Selector
import
chat.rocket.android.main.presentation.MainPresenter
import
chat.rocket.android.main.presentation.MainView
import
chat.rocket.android.main.uimodel.NavHeaderUiModel
import
chat.rocket.android.push.refreshPushToken
import
chat.rocket.android.server.domain.PermissionsInteractor
import
chat.rocket.android.server.domain.model.Account
import
chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID
...
...
@@ -26,7 +27,6 @@ import chat.rocket.android.util.extensions.fadeOut
import
chat.rocket.android.util.extensions.rotateBy
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.invalidateFirebaseToken
import
chat.rocket.android.util.refreshFCMToken
import
chat.rocket.common.model.UserStatus
import
dagger.android.AndroidInjection
import
dagger.android.AndroidInjector
...
...
@@ -36,9 +36,6 @@ import dagger.android.support.HasSupportFragmentInjector
import
kotlinx.android.synthetic.main.activity_main.*
import
kotlinx.android.synthetic.main.app_bar.*
import
kotlinx.android.synthetic.main.nav_header.view.*
import
kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.launch
import
timber.log.Timber
import
javax.inject.Inject
private
const
val
CURRENT_STATE
=
"current_state"
...
...
@@ -64,9 +61,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
super
.
onCreate
(
savedInstanceState
)
setContentView
(
R
.
layout
.
activity_main
)
launch
(
CommonPool
)
{
refreshFCMToken
(
presenter
)
}
refreshPushToken
()
chatRoomId
=
intent
.
getStringExtra
(
INTENT_CHAT_ROOM_ID
)
...
...
app/src/main/java/chat/rocket/android/util/extensions/RocketChatClient.kt
View file @
3e0f1a48
...
...
@@ -7,18 +7,18 @@ import chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.registerPushToken
import
kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.withContext
import
timber.log.Timber
suspend
fun
RocketChatClient
.
registerPushToken
(
suspend
fun
RocketChatClient
Factory
.
registerPushToken
(
token
:
String
,
accounts
:
List
<
Account
>,
factory
:
RocketChatClientFactory
accounts
:
List
<
Account
>
)
{
launch
(
CommonPool
)
{
withContext
(
CommonPool
)
{
accounts
.
forEach
{
account
->
try
{
retryIO
(
description
=
"register push token: ${account.serverUrl}"
)
{
factory
.
create
(
account
.
serverUrl
).
registerPushToken
(
token
)
create
(
account
.
serverUrl
).
registerPushToken
(
token
)
}
}
catch
(
ex
:
Exception
)
{
Timber
.
d
(
ex
,
"Error registering Push token for ${account.serverUrl}"
)
...
...
app/src/play/AndroidManifest.xml
View file @
3e0f1a48
...
...
@@ -12,13 +12,6 @@
android:roundIcon=
"@mipmap/ic_launcher_round"
android:supportsRtl=
"true"
>
<service
android:name=
".push.FirebaseTokenService"
android:exported=
"false"
>
<intent-filter>
<action
android:name=
"com.google.firebase.INSTANCE_ID_EVENT"
/>
</intent-filter>
</service>
<service
android:name=
".push.FirebaseMessagingService"
android:enabled=
"true"
...
...
app/src/play/java/chat/rocket/android/dagger/module/ServiceBuilder.kt
View file @
3e0f1a48
package
chat.rocket.android.dagger.module
import
androidx.work.Worker
import
chat.rocket.android.chatroom.di.MessageServiceProvider
import
chat.rocket.android.chatroom.service.MessageService
import
chat.rocket.android.dagger.qualifier.WorkerKey
import
chat.rocket.android.push.FirebaseMessagingService
import
chat.rocket.android.push.FirebaseTokenService
import
chat.rocket.android.push.di.FirebaseMessagingServiceProvider
import
chat.rocket.android.push.di.FirebaseTokenServiceProvider
import
chat.rocket.android.push.di.TokenRegistrationSubComponent
import
chat.rocket.android.push.worker.TokenRegistrationWorker
import
dagger.Binds
import
dagger.Module
import
dagger.android.AndroidInjector
import
dagger.android.ContributesAndroidInjector
import
dagger.multibindings.IntoMap
@Module
abstract
class
ServiceBuilder
{
@ContributesAndroidInjector
(
modules
=
[
FirebaseTokenServiceProvider
::
class
])
abstract
fun
bindFirebaseTokenService
():
FirebaseTokenService
@Module
(
subcomponents
=
[
TokenRegistrationSubComponent
::
class
])
abstract
class
ServiceBuilder
{
@ContributesAndroidInjector
(
modules
=
[
FirebaseMessagingServiceProvider
::
class
])
abstract
fun
bindGcmListenerService
():
FirebaseMessagingService
@ContributesAndroidInjector
(
modules
=
[
MessageServiceProvider
::
class
])
abstract
fun
bindMessageService
():
MessageService
@Binds
@IntoMap
@WorkerKey
(
TokenRegistrationWorker
::
class
)
abstract
fun
bindTokenRegistrationWorkerFactory
(
builder
:
TokenRegistrationSubComponent
.
Builder
):
AndroidInjector
.
Factory
<
out
Worker
>
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/extensions/GooglePlayServices.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.extensions
import
com.google.android.gms.tasks.Task
import
kotlin.coroutines.experimental.suspendCoroutine
@JvmName
(
"awaitVoid"
)
suspend
fun
Task
<
Void
>.
await
()
=
suspendCoroutine
<
Unit
>
{
continuation
->
addOnSuccessListener
{
continuation
.
resume
(
Unit
)
}
addOnFailureListener
{
continuation
.
resumeWithException
(
it
)
}
}
suspend
fun
<
TResult
>
Task
<
TResult
>.
await
()
=
suspendCoroutine
<
TResult
>
{
continuation
->
addOnSuccessListener
{
continuation
.
resume
(
it
)
}
addOnFailureListener
{
continuation
.
resumeWithException
(
it
)
}
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/FirebaseMessagingService.kt
View file @
3e0f1a48
package
chat.rocket.android.push
import
androidx.core.os.bundleOf
import
androidx.work.Constraints
import
androidx.work.NetworkType
import
androidx.work.OneTimeWorkRequestBuilder
import
androidx.work.WorkManager
import
androidx.work.workDataOf
import
chat.rocket.android.push.worker.TokenRegistrationWorker
import
com.google.firebase.messaging.FirebaseMessagingService
import
com.google.firebase.messaging.RemoteMessage
import
dagger.android.AndroidInjection
...
...
@@ -17,8 +23,22 @@ class FirebaseMessagingService : FirebaseMessagingService() {
}
override
fun
onMessageReceived
(
message
:
RemoteMessage
)
{
// XXX - for now this is ok, if we start to do network calls, use a Worker instead
message
.
data
?.
let
{
pushManager
.
handle
(
bundleOf
(*(
it
.
map
{
Pair
(
it
.
key
,
it
.
value
)
}).
toTypedArray
()))
}
}
override
fun
onNewToken
(
token
:
String
)
{
val
data
=
workDataOf
(
"token"
to
token
)
val
constraint
=
Constraints
.
Builder
().
setRequiredNetworkType
(
NetworkType
.
CONNECTED
).
build
()
val
work
=
OneTimeWorkRequestBuilder
<
TokenRegistrationWorker
>()
.
setInputData
(
data
)
.
setConstraints
(
constraint
)
.
build
()
// Schedule a job since we are using network...
WorkManager
.
getInstance
().
enqueue
(
work
)
}
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/FirebaseTokenService.kt
deleted
100644 → 0
View file @
87079b36
package
chat.rocket.android.push
import
chat.rocket.android.infrastructure.LocalRepository
import
chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatException
import
chat.rocket.core.internal.rest.registerPushToken
import
com.google.firebase.iid.FirebaseInstanceId
import
com.google.firebase.iid.FirebaseInstanceIdService
import
dagger.android.AndroidInjection
import
kotlinx.coroutines.experimental.launch
import
timber.log.Timber
import
javax.inject.Inject
class
FirebaseTokenService
:
FirebaseInstanceIdService
()
{
@Inject
lateinit
var
factory
:
RocketChatClientFactory
@Inject
lateinit
var
getCurrentServerInteractor
:
GetCurrentServerInteractor
@Inject
lateinit
var
localRepository
:
LocalRepository
override
fun
onCreate
()
{
super
.
onCreate
()
AndroidInjection
.
inject
(
this
)
}
override
fun
onTokenRefresh
()
{
try
{
val
fcmToken
=
FirebaseInstanceId
.
getInstance
().
token
val
currentServer
=
getCurrentServerInteractor
.
get
()
val
client
=
currentServer
?.
let
{
factory
.
create
(
currentServer
)
}
fcmToken
?.
let
{
localRepository
.
save
(
LocalRepository
.
KEY_PUSH_TOKEN
,
fcmToken
)
client
?.
let
{
launch
{
try
{
Timber
.
d
(
"Registering push token: $fcmToken for ${client.url}"
)
retryIO
(
"register push token"
)
{
client
.
registerPushToken
(
fcmToken
)
}
}
catch
(
ex
:
RocketChatException
)
{
Timber
.
e
(
ex
,
"Error registering push token"
)
}
}
}
}
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
,
"Error refreshing Firebase TOKEN"
)
}
}
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/PushToken.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.push
import
androidx.work.Constraints
import
androidx.work.NetworkType
import
androidx.work.OneTimeWorkRequestBuilder
import
androidx.work.WorkManager
import
chat.rocket.android.push.worker.TokenRegistrationWorker
fun
refreshPushToken
()
{
val
constraint
=
Constraints
.
Builder
().
setRequiredNetworkType
(
NetworkType
.
CONNECTED
).
build
()
val
work
=
OneTimeWorkRequestBuilder
<
TokenRegistrationWorker
>()
.
setConstraints
(
constraint
)
.
build
()
// Schedule a job since we are using network...
WorkManager
.
getInstance
().
enqueue
(
work
)
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/di/FirebaseTokenServiceProvider.kt
deleted
100644 → 0
View file @
87079b36
package
chat.rocket.android.push.di
import
chat.rocket.android.dagger.module.AppModule
import
chat.rocket.android.push.FirebaseTokenService
import
dagger.Module
import
dagger.android.ContributesAndroidInjector
@Module
abstract
class
FirebaseTokenServiceProvider
{
@ContributesAndroidInjector
(
modules
=
[
AppModule
::
class
])
abstract
fun
provideFirebaseTokenService
():
FirebaseTokenService
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/di/TokenRegistrationSubComponent.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.push.di
import
chat.rocket.android.push.worker.TokenRegistrationWorker
import
dagger.Subcomponent
import
dagger.android.AndroidInjector
@Subcomponent
interface
TokenRegistrationSubComponent
:
AndroidInjector
<
TokenRegistrationWorker
>
{
@Subcomponent
.
Builder
abstract
class
Builder
:
AndroidInjector
.
Builder
<
TokenRegistrationWorker
>()
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/push/worker/TokenRegistrationWorker.kt
0 → 100644
View file @
3e0f1a48
package
chat.rocket.android.push.worker
import
androidx.work.Worker
import
chat.rocket.android.dagger.injector.AndroidWorkerInjection
import
chat.rocket.android.extensions.await
import
chat.rocket.android.infrastructure.LocalRepository
import
chat.rocket.android.server.domain.GetAccountsInteractor
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extensions.registerPushToken
import
chat.rocket.common.util.ifNull
import
com.google.firebase.iid.FirebaseInstanceId
import
kotlinx.coroutines.experimental.runBlocking
import
timber.log.Timber
import
javax.inject.Inject
class
TokenRegistrationWorker
:
Worker
()
{
@Inject
lateinit
var
factory
:
RocketChatClientFactory
@Inject
lateinit
var
getAccountsInteractor
:
GetAccountsInteractor
@Inject
lateinit
var
localRepository
:
LocalRepository
override
fun
doWork
():
Result
{
AndroidWorkerInjection
.
inject
(
this
)
runBlocking
{
val
token
=
inputData
.
getString
(
"token"
)
?:
refreshToken
()
token
?.
let
{
fcmToken
->
localRepository
.
save
(
LocalRepository
.
KEY_PUSH_TOKEN
,
fcmToken
)
factory
.
registerPushToken
(
fcmToken
,
getAccountsInteractor
.
get
())
}.
ifNull
{
Timber
.
d
(
"Unavailable FCM Token..."
)
}
}
return
Result
.
SUCCESS
}
private
fun
refreshToken
():
String
?
{
return
runBlocking
{
try
{
FirebaseInstanceId
.
getInstance
().
instanceId
.
await
().
token
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
,
"Error refreshing Firebase TOKEN"
)
null
}
}
}
}
\ No newline at end of file
app/src/play/java/chat/rocket/android/util/GMSManager.kt
View file @
3e0f1a48
package
chat.rocket.android.util
import
chat.rocket.android.main.presentation.MainPresenter
import
com.google.firebase.iid.FirebaseInstanceId
import
com.google.firebase.messaging.FirebaseMessaging
import
timber.log.Timber
suspend
fun
refreshFCMToken
(
presenter
:
MainPresenter
)
{
try
{
val
token
=
FirebaseInstanceId
.
getInstance
().
token
Timber
.
d
(
"FCM token: $token"
)
presenter
.
refreshToken
(
token
)
}
catch
(
ex
:
Exception
)
{
Timber
.
d
(
ex
,
"Missing play services..."
)
}
}
fun
invalidateFirebaseToken
(
token
:
String
)
{
FirebaseInstanceId
.
getInstance
().
deleteToken
(
token
,
FirebaseMessaging
.
INSTANCE_ID_SCOPE
)
...
...
dependencies.gradle
View file @
3e0f1a48
...
...
@@ -18,6 +18,7 @@ ext {
cardview
:
'1.0.0-rc02'
,
browser
:
'1.0.0-rc02'
,
androidKtx
:
'1.0.0-rc02'
,
workmanager
:
'1.0.0-alpha08'
,
dagger
:
'2.16'
,
firebaseCloudMessage
:
'17.3.0'
,
...
...
@@ -73,6 +74,9 @@ ext {
cardview
:
"androidx.cardview:cardview:${versions.cardview}"
,
browser
:
"androidx.browser:browser:${versions.browser}"
,
androidKtx
:
"androidx.core:core-ktx:${versions.androidKtx}"
,
fragmentsKtx
:
"androidx.fragment:fragment-ktx:${versions.androidKtx}"
,
workmanager
:
"android.arch.work:work-runtime-ktx:${versions.workmanager}"
,
workmanagerFirebase
:
"android.arch.work:work-firebase:${versions.workmanager}"
,
dagger
:
"com.google.dagger:dagger:${versions.dagger}"
,
daggerSupport
:
"com.google.dagger:dagger-android-support:${versions.dagger}"
,
...
...
@@ -86,6 +90,7 @@ ext {
roomProcessor
:
"androidx.room:room-compiler:${versions.room}"
,
lifecycleExtensions
:
"androidx.lifecycle:lifecycle-extensions:${versions.lifecycle}"
,
lifecycleCompiler
:
"androidx.lifecycle:lifecycle-compiler:${versions.lifecycle}"
,
viewmodelKtx
:
"androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
,
livedataKtx
:
"com.shopify:livedata-ktx:${versions.livedataKtx}"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment