From 3ee5d00812c980e991a3a5ceccc77448280c662e Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 23 Feb 2021 18:34:58 +0100 Subject: [PATCH] some tests --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 + .../android/activities/BaseMainActivity.java | 43 +++++------------- .../asynctasks/PostSubscriptionAsyncTask.java | 10 +++-- .../java/app/fedilab/android/client/API.java | 5 ++- .../fedilab/android/client/PeertubeAPI.java | 4 +- .../fedilab/android/helper/BaseHelper.java | 1 + .../android/helper/PushNotifications.java | 15 +++++++ .../android/services/UnifiedPushService.java | 45 +++++++++++++++++-- .../fedilab/android/sqlite/AccountDAO.java | 16 +++++++ 10 files changed, 100 insertions(+), 42 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 686d93680..997a85f7a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -177,6 +177,7 @@ dependencies { implementation "com.madgag.spongycastle:prov:1.58.0.0" implementation "com.madgag.spongycastle:bcpkix-jdk15on:1.58.0.0" implementation "com.madgag.spongycastle:bcpg-jdk15on:1.58.0.0" + implementation 'com.github.UnifiedPush:android-connector:1.0.0' //Flavors diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31711a6bf..1ae852253 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -460,6 +460,8 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> + + contextReference = new WeakReference<>(BaseMainActivity.this); @@ -2440,17 +2430,6 @@ public abstract class BaseMainActivity extends BaseActivity protected abstract void launchOwnerNotificationsActivity(); - @Override - public void onSubscription(APIResponse apiResponse) { - if (apiResponse != null && apiResponse.getPushSubscription() != null) { - final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(BaseMainActivity.this)); - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.SERVER_KEY + userId + instance, apiResponse.getPushSubscription().getServer_key()); - editor.apply(); - } - } public enum iconLauncher { BUBBLES, diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostSubscriptionAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostSubscriptionAsyncTask.java index aca5ff329..ec1521bc2 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/PostSubscriptionAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/PostSubscriptionAsyncTask.java @@ -22,6 +22,7 @@ import java.lang.ref.WeakReference; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Account; import app.fedilab.android.interfaces.OnPostSubscription; @@ -30,18 +31,21 @@ public class PostSubscriptionAsyncTask { private final OnPostSubscription listener; private final WeakReference contextReference; private APIResponse apiResponse; + private final String endpoint; + private final Account account; - - public PostSubscriptionAsyncTask(Context context, OnPostSubscription onPostSubscription) { + public PostSubscriptionAsyncTask(Context context, Account account, String endpoint, OnPostSubscription onPostSubscription) { this.contextReference = new WeakReference<>(context); this.listener = onPostSubscription; + this.endpoint = endpoint; + this.account = account; doInBackground(); } protected void doInBackground() { new Thread(() -> { - apiResponse = new API(contextReference.get()).pushSubscription(); + apiResponse = new API(contextReference.get(), account.getInstance(), account.getToken()).pushSubscription(account, endpoint); Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> listener.onSubscription(apiResponse); mainHandler.post(myRunnable); diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java index 5a3b80263..d300a22ee 100644 --- a/app/src/main/java/app/fedilab/android/client/API.java +++ b/app/src/main/java/app/fedilab/android/client/API.java @@ -5779,12 +5779,13 @@ public class API { apiResponse.setLists(lists); return apiResponse; } + /** * Subscribe to push notifications * * @return APIResponse */ - public APIResponse pushSubscription() { + public APIResponse pushSubscription(Account account, String endpoint) { PushSubscription pushSubscription = new PushSubscription(); final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW, true); @@ -5801,7 +5802,7 @@ public class API { params.put("data[alerts][reblog]", String.valueOf(notif_share)); params.put("data[alerts][poll]", String.valueOf(notif_poll)); - params.put("subscription[endpoint]", getAbsoluteUrl("/streaming/user")); + params.put("subscription[endpoint]", endpoint); ECDH ecdh = ECDH.getInstance(); String pubKey = ecdh.getPublicKey(context); diff --git a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java index 3f8c3572a..b1f60ae2b 100644 --- a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java @@ -1638,8 +1638,8 @@ public class PeertubeAPI { String errorM = jsonObject.get("error").toString(); message = "Error " + statusCode + " : " + errorM; } catch (JSONException e) { - if (error.getMessage().split(".").length > 0) { - String errorM = error.getMessage().split(".")[0]; + if (error.getMessage().split("\\.").length > 0) { + String errorM = error.getMessage().split("\\.")[0]; message = "Error " + statusCode + " : " + errorM; } } diff --git a/app/src/main/java/app/fedilab/android/helper/BaseHelper.java b/app/src/main/java/app/fedilab/android/helper/BaseHelper.java index cdcdbe2da..d1ec08ed5 100644 --- a/app/src/main/java/app/fedilab/android/helper/BaseHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/BaseHelper.java @@ -278,6 +278,7 @@ public class BaseHelper { public static final String CLIENT_NAME = "client_name"; public static final String APP_PREFS = "app_prefs"; public static final String SERVER_KEY = "server_key"; + public static final String SERVER_ENDPOINT = "server_endpoint"; public static final String ID = "id"; public static final String CLIENT_ID = "client_id"; public static final String CLIENT_SECRET = "client_secret"; diff --git a/app/src/main/java/app/fedilab/android/helper/PushNotifications.java b/app/src/main/java/app/fedilab/android/helper/PushNotifications.java index fac7442f1..2d6f9e5d0 100644 --- a/app/src/main/java/app/fedilab/android/helper/PushNotifications.java +++ b/app/src/main/java/app/fedilab/android/helper/PushNotifications.java @@ -2,8 +2,14 @@ package app.fedilab.android.helper; import android.content.Context; import android.util.Base64; + +import org.unifiedpush.android.connector.Registration; + +import java.util.List; import java.util.Random; +import app.fedilab.android.activities.BaseMainActivity; + public class PushNotifications { public void registerPushNotifications(Context context, String endpoint) { ECDH ecdh = new ECDH(); @@ -19,6 +25,15 @@ public class PushNotifications { ecdh.saveServerKey(context, server_key); } + public static void getDistributors(Context context) { + List distributors = new Registration().getDistributors(context); + if (distributors.isEmpty()) { + + } else { + + } + } + public void displayNotification(Context context, String ciphered) { ECDH ecdh = new ECDH(); byte[] secret = ecdh.getSecret(context); diff --git a/app/src/main/java/app/fedilab/android/services/UnifiedPushService.java b/app/src/main/java/app/fedilab/android/services/UnifiedPushService.java index 75be23b8b..c6c935efd 100644 --- a/app/src/main/java/app/fedilab/android/services/UnifiedPushService.java +++ b/app/src/main/java/app/fedilab/android/services/UnifiedPushService.java @@ -1,6 +1,8 @@ package app.fedilab.android.services; import android.content.Context; +import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; import android.util.Log; import org.jetbrains.annotations.NotNull; @@ -8,16 +10,41 @@ import org.jetbrains.annotations.Nullable; import org.unifiedpush.android.connector.MessagingReceiver; import org.unifiedpush.android.connector.MessagingReceiverHandler; +import java.util.List; + +import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.activities.LiveNotificationSettingsAccountsActivity; +import app.fedilab.android.asynctasks.PostSubscriptionAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.PushNotifications; +import app.fedilab.android.interfaces.OnPostSubscription; +import app.fedilab.android.sqlite.AccountDAO; +import app.fedilab.android.sqlite.Sqlite; + +import static android.content.Context.MODE_PRIVATE; + +class handler implements MessagingReceiverHandler, OnPostSubscription { + + private Context context; -class handler implements MessagingReceiverHandler { @Override public void onNewEndpoint(@Nullable Context context, @NotNull String s) { Log.v(Helper.TAG, "onNewEndpoint: " + s); + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.SERVER_ENDPOINT, s); + editor.apply(); + PushNotifications push = new PushNotifications(); push.registerPushNotifications(context, s); - + this.context = context; + SQLiteDatabase db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + List accountPush = new AccountDAO(context, db).getPushNotificationAccounts(); + for (Account account : accountPush) { + new PostSubscriptionAsyncTask(context, account, s, this); + } } @Override @@ -44,9 +71,21 @@ class handler implements MessagingReceiverHandler { push.displayNotification(context, s); Log.v(Helper.TAG, "onMessage: " + s); } + + @Override + public void onSubscription(APIResponse apiResponse) { + if (apiResponse != null && apiResponse.getPushSubscription() != null) { + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(context)); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.SERVER_KEY + userId + instance, apiResponse.getPushSubscription().getServer_key()); + editor.apply(); + } + } } -class UnifiedPushService extends MessagingReceiver { +public class UnifiedPushService extends MessagingReceiver { public UnifiedPushService() { super(new handler()); } diff --git a/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java b/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java index cd963c9cc..642057991 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java @@ -278,6 +278,22 @@ public class AccountDAO { } + /** + * Returns all Account in db + * + * @return Account List + */ + public List getPushNotificationAccounts() { + + try { + Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, "(" + Sqlite.COL_SOCIAL + " = 'MASTODON' OR " + Sqlite.COL_SOCIAL + " = 'PLEROMA') AND " + Sqlite.COL_OAUTHTOKEN + " != 'null'", null, null, null, Sqlite.COL_INSTANCE + " ASC", null); + return cursorToListUser(c); + } catch (Exception e) { + return null; + } + } + + /** * Returns an Account by token *