فهرست منبع

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>
Marcel Hibbe 3 سال پیش
والد
کامیت
06afd7bec6

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

+ 64 - 0
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 <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"
+    }
+}

+ 0 - 57
app/src/gplay/java/com/nextcloud/talk/utils/ClosedInterfaceImpl.java

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

+ 65 - 0
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
+    }
+}

+ 6 - 7
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

+ 1 - 0
app/src/main/java/com/nextcloud/talk/interfaces/ClosedInterface.kt

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

+ 13 - 4
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();
     }
 }

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