From 06afd7bec62b6486e171dbf91c160cfd85f2c82d Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 18 Jan 2022 16:43:47 +0100 Subject: [PATCH] set up periodic fetch of firebase token in ClosedInterface for gplay move OneTimeWorkRequest for PushRegistrationWorker from NextcloudTalkApplication to ClosedInterface for gplay add check in PushRegistrationWorker if google services are available Signed-off-by: Marcel Hibbe --- .../talk/utils/ClosedInterfaceImpl.java | 5 ++ .../talk/jobs/GetFirebasePushTokenWorker.kt | 64 ++++++++++++++++++ .../talk/utils/ClosedInterfaceImpl.java | 57 ---------------- .../talk/utils/ClosedInterfaceImpl.kt | 65 +++++++++++++++++++ .../application/NextcloudTalkApplication.kt | 13 ++-- .../talk/interfaces/ClosedInterface.kt | 1 + .../talk/jobs/PushRegistrationWorker.java | 17 +++-- .../talk/utils/ClosedInterfaceImpl.java | 5 ++ 8 files changed, 159 insertions(+), 68 deletions(-) create mode 100644 app/src/gplay/java/com/nextcloud/talk/jobs/GetFirebasePushTokenWorker.kt delete mode 100644 app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java create mode 100644 app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.kt diff --git a/app/src/generic/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java b/app/src/generic/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java index 66496bd31..71c25e757 100644 --- a/app/src/generic/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java +++ b/app/src/generic/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java @@ -33,4 +33,9 @@ public class ClosedInterfaceImpl implements ClosedInterface { public boolean isGooglePlayServicesAvailable() { return false; } + + @Override + public void setUpPushTokenRegistration() { + // no push notifications for generic build flavour :( + } } diff --git a/app/src/gplay/java/com/nextcloud/talk/jobs/GetFirebasePushTokenWorker.kt b/app/src/gplay/java/com/nextcloud/talk/jobs/GetFirebasePushTokenWorker.kt new file mode 100644 index 000000000..89e3bd64a --- /dev/null +++ b/app/src/gplay/java/com/nextcloud/talk/jobs/GetFirebasePushTokenWorker.kt @@ -0,0 +1,64 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2022 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.jobs + +import android.annotation.SuppressLint +import android.content.Context +import android.util.Log +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters +import com.google.android.gms.tasks.OnCompleteListener +import com.google.firebase.messaging.FirebaseMessaging +import com.nextcloud.talk.utils.preferences.AppPreferences +import javax.inject.Inject + +class GetFirebasePushTokenWorker(val context: Context, workerParameters: WorkerParameters) : + Worker(context, workerParameters) { + + @JvmField + @Inject + var appPreferences: AppPreferences? = null + + @SuppressLint("LongLogTag") + override fun doWork(): Result { + FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> + if (!task.isSuccessful) { + Log.w(TAG, "Fetching FCM registration token failed", task.exception) + return@OnCompleteListener + } + + val token = task.result + Log.d(TAG, "Fetching FCM registration token succeeded. token = $token") + + appPreferences?.pushToken = token + val pushRegistrationWork = OneTimeWorkRequest.Builder(PushRegistrationWorker::class.java).build() + WorkManager.getInstance(context).enqueue(pushRegistrationWork) + }) + + return Result.success() + } + + companion object { + const val TAG = "GetFirebasePushTokenWorker" + } +} diff --git a/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java b/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java deleted file mode 100644 index 7be5866f2..000000000 --- a/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Nextcloud Talk application - * - * @author Mario Danic - * Copyright (C) 2017-2018 Mario Danic - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.nextcloud.talk.utils; - - -import android.content.Intent; - -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; -import com.google.android.gms.security.ProviderInstaller; -import com.google.android.gms.security.ProviderInstaller.ProviderInstallListener; -import com.nextcloud.talk.application.NextcloudTalkApplication; -import com.nextcloud.talk.interfaces.ClosedInterface; - -public class ClosedInterfaceImpl implements ClosedInterface, ProviderInstallListener { - @Override - public void providerInstallerInstallIfNeededAsync() { - ProviderInstaller.installIfNeededAsync(NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext(), - this); - } - - @Override - public boolean isGooglePlayServicesAvailable() { - GoogleApiAvailability api = GoogleApiAvailability.getInstance(); - int code = - api.isGooglePlayServicesAvailable(NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext()); - return code == ConnectionResult.SUCCESS; - } - - @Override - public void onProviderInstalled() { - - } - - @Override - public void onProviderInstallFailed(int i, Intent intent) { - - } -} diff --git a/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.kt b/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.kt new file mode 100644 index 000000000..b183eb087 --- /dev/null +++ b/app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.kt @@ -0,0 +1,65 @@ +package com.nextcloud.talk.utils + +import android.content.Intent +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import autodagger.AutoInjector +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.GoogleApiAvailability +import com.google.android.gms.security.ProviderInstaller +import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.interfaces.ClosedInterface +import com.nextcloud.talk.jobs.GetFirebasePushTokenWorker +import com.nextcloud.talk.jobs.PushRegistrationWorker +import java.util.concurrent.TimeUnit + +@AutoInjector(NextcloudTalkApplication::class) +class ClosedInterfaceImpl : ClosedInterface, ProviderInstaller.ProviderInstallListener { + + override val isGooglePlayServicesAvailable : Boolean = isGPlayServicesAvailable() + + override fun providerInstallerInstallIfNeededAsync() { + NextcloudTalkApplication.sharedApplication?.let { + ProviderInstaller.installIfNeededAsync( + it.applicationContext, + this + ) + } + } + + override fun onProviderInstalled() { + } + + override fun onProviderInstallFailed(p0: Int, p1: Intent?) { + } + + override fun setUpPushTokenRegistration() { + val pushRegistrationWork = OneTimeWorkRequest.Builder(PushRegistrationWorker::class.java).build() + WorkManager.getInstance().enqueue(pushRegistrationWork) + + val periodicPushRegistration = PeriodicWorkRequest.Builder( + GetFirebasePushTokenWorker::class.java, 15, // TODO: discuss intervall. joas 24h, google 1 month + TimeUnit.MINUTES + ) + .build() + + WorkManager.getInstance() + .enqueueUniquePeriodicWork( + "periodicPushRegistration", ExistingPeriodicWorkPolicy.REPLACE, + periodicPushRegistration + ) + } + + private fun isGPlayServicesAvailable() : Boolean { + val api = GoogleApiAvailability.getInstance() + val code = + NextcloudTalkApplication.sharedApplication?.let { + api.isGooglePlayServicesAvailable( + it.applicationContext + ) + } + return code == ConnectionResult.SUCCESS + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index 0dda6430c..66c766c34 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -53,7 +53,6 @@ import com.nextcloud.talk.dagger.modules.DatabaseModule import com.nextcloud.talk.dagger.modules.RestModule import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.CapabilitiesWorker -import com.nextcloud.talk.jobs.PushRegistrationWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.DeviceUtils @@ -165,7 +164,8 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync() DeviceUtils.ignoreSpecialBatteryFeatures() - val pushRegistrationWork = OneTimeWorkRequest.Builder(PushRegistrationWorker::class.java).build() + ClosedInterfaceImpl().setUpPushTokenRegistration() + val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() val periodicCapabilitiesUpdateWork = PeriodicWorkRequest.Builder( CapabilitiesWorker::class.java, @@ -174,11 +174,10 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build() val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build() - WorkManager.getInstance().enqueue(pushRegistrationWork) - WorkManager.getInstance().enqueue(accountRemovalWork) - WorkManager.getInstance().enqueue(capabilitiesUpdateWork) - WorkManager.getInstance().enqueue(signalingSettingsWork) - WorkManager.getInstance().enqueueUniquePeriodicWork( + WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork) + WorkManager.getInstance(applicationContext).enqueue(capabilitiesUpdateWork) + WorkManager.getInstance(applicationContext).enqueue(signalingSettingsWork) + WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork( "DailyCapabilitiesUpdateWork", ExistingPeriodicWorkPolicy.REPLACE, periodicCapabilitiesUpdateWork diff --git a/app/src/main/java/com/nextcloud/talk/interfaces/ClosedInterface.kt b/app/src/main/java/com/nextcloud/talk/interfaces/ClosedInterface.kt index 8e678d5e1..fee12d99b 100644 --- a/app/src/main/java/com/nextcloud/talk/interfaces/ClosedInterface.kt +++ b/app/src/main/java/com/nextcloud/talk/interfaces/ClosedInterface.kt @@ -24,4 +24,5 @@ interface ClosedInterface { val isGooglePlayServicesAvailable: Boolean fun providerInstallerInstallIfNeededAsync() + fun setUpPushTokenRegistration() } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java index ae6ccc3af..a4a917b70 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java @@ -21,9 +21,13 @@ package com.nextcloud.talk.jobs; import android.content.Context; +import android.util.Log; + import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; + +import com.nextcloud.talk.utils.ClosedInterfaceImpl; import com.nextcloud.talk.utils.PushUtils; public class PushRegistrationWorker extends Worker { @@ -36,10 +40,15 @@ public class PushRegistrationWorker extends Worker { @NonNull @Override public Result doWork() { - PushUtils pushUtils = new PushUtils(); - pushUtils.generateRsa2048KeyPair(); - pushUtils.pushRegistrationToServer(); + if(new ClosedInterfaceImpl().isGooglePlayServicesAvailable()){ + PushUtils pushUtils = new PushUtils(); + pushUtils.generateRsa2048KeyPair(); + pushUtils.pushRegistrationToServer(); - return Result.success(); + return Result.success(); + } + Log.w(TAG, "executing PushRegistrationWorker doesn't make sense because Google Play Services are not " + + "available"); + return Result.failure(); } } diff --git a/app/src/qa/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java b/app/src/qa/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java index 66496bd31..34c10d888 100644 --- a/app/src/qa/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java +++ b/app/src/qa/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java @@ -33,4 +33,9 @@ public class ClosedInterfaceImpl implements ClosedInterface { public boolean isGooglePlayServicesAvailable() { return false; } + + @Override + public void setUpPushTokenRegistration() { + // no push notifications for qa build flavour :( + } }