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 <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2022-01-18 16:43:47 +01:00
parent 55da452887
commit 06afd7bec6
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
8 changed files with 159 additions and 68 deletions

View File

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

View File

@ -0,0 +1,64 @@
/*
* Nextcloud Talk application
*
* @author Marcel Hibbe
* Copyright (C) 2022 Marcel Hibbe <dev@mhibbe.de>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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"
}
}

View File

@ -1,57 +0,0 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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) {
}
}

View File

@ -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
}
}

View File

@ -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

View File

@ -24,4 +24,5 @@ interface ClosedInterface {
val isGooglePlayServicesAvailable: Boolean
fun providerInstallerInstallIfNeededAsync()
fun setUpPushTokenRegistration()
}

View File

@ -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() {
if(new ClosedInterfaceImpl().isGooglePlayServicesAvailable()){
PushUtils pushUtils = new PushUtils();
pushUtils.generateRsa2048KeyPair();
pushUtils.pushRegistrationToServer();
return Result.success();
}
Log.w(TAG, "executing PushRegistrationWorker doesn't make sense because Google Play Services are not " +
"available");
return Result.failure();
}
}

View File

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