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 :( + } }