Skip to content

Commit 1a83c29

Browse files
committedDec 5, 2023
UnifiedPush: send unregistered to apps when 'none' account is selected
1 parent 20c179c commit 1a83c29

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed
 

‎src/main/java/eu/siacs/conversations/persistance/UnifiedPushDatabase.java

+18
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.jetbrains.annotations.NotNull;
1818

19+
import java.util.ArrayList;
1920
import java.util.List;
2021

2122
import eu.siacs.conversations.Config;
@@ -129,6 +130,23 @@ public ApplicationEndpoint getEndpoint(
129130
return null;
130131
}
131132

133+
public List<PushTarget> deletePushTargets() {
134+
final SQLiteDatabase sqLiteDatabase = getReadableDatabase();
135+
final ImmutableList.Builder<PushTarget> builder = new ImmutableList.Builder<>();
136+
try (final Cursor cursor = sqLiteDatabase.query("push",new String[]{"application","instance"},null,null,null,null,null)) {
137+
if (cursor != null && cursor.moveToFirst()) {
138+
builder.add(new PushTarget(
139+
cursor.getString(cursor.getColumnIndexOrThrow("application")),
140+
cursor.getString(cursor.getColumnIndexOrThrow("instance"))));
141+
}
142+
} catch (final Exception e) {
143+
Log.d(Config.LOGTAG,"unable to retrieve push targets",e);
144+
return builder.build();
145+
}
146+
sqLiteDatabase.delete("push",null,null);
147+
return builder.build();
148+
}
149+
132150
public boolean hasEndpoints(final UnifiedPushBroker.Transport transport) {
133151
final SQLiteDatabase sqLiteDatabase = getReadableDatabase();
134152
try (final Cursor cursor =

‎src/main/java/eu/siacs/conversations/services/UnifiedPushBroker.java

+62
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,18 @@
1010
import android.os.RemoteException;
1111
import android.preference.PreferenceManager;
1212
import android.util.Log;
13+
14+
import androidx.annotation.NonNull;
15+
1316
import com.google.common.base.Optional;
1417
import com.google.common.base.Strings;
1518
import com.google.common.collect.Iterables;
1619
import com.google.common.io.BaseEncoding;
20+
import com.google.common.util.concurrent.FutureCallback;
21+
import com.google.common.util.concurrent.Futures;
22+
import com.google.common.util.concurrent.ListenableFuture;
23+
import com.google.common.util.concurrent.MoreExecutors;
24+
1725
import eu.siacs.conversations.Config;
1826
import eu.siacs.conversations.R;
1927
import eu.siacs.conversations.entities.Account;
@@ -239,6 +247,9 @@ private void sendEndpoint(final Messenger messenger, String instance, final Unif
239247
public boolean reconfigurePushDistributor() {
240248
final boolean enabled = getTransport().isPresent();
241249
setUnifiedPushDistributorEnabled(enabled);
250+
if (!enabled) {
251+
unregisterCurrentPushTargets();
252+
}
242253
return enabled;
243254
}
244255

@@ -261,6 +272,43 @@ private void setUnifiedPushDistributorEnabled(final boolean enabled) {
261272
}
262273
}
263274

275+
private void unregisterCurrentPushTargets() {
276+
final var future = deletePushTargets();
277+
Futures.addCallback(
278+
future,
279+
new FutureCallback<>() {
280+
@Override
281+
public void onSuccess(
282+
final List<UnifiedPushDatabase.PushTarget> pushTargets) {
283+
broadcastUnregistered(pushTargets);
284+
}
285+
286+
@Override
287+
public void onFailure(@NonNull Throwable throwable) {
288+
Log.d(
289+
Config.LOGTAG,
290+
"could not delete endpoints after UnifiedPushDistributor was disabled");
291+
}
292+
},
293+
MoreExecutors.directExecutor());
294+
}
295+
296+
private ListenableFuture<List<UnifiedPushDatabase.PushTarget>> deletePushTargets() {
297+
return Futures.submit(() -> UnifiedPushDatabase.getInstance(service).deletePushTargets(),SCHEDULER);
298+
}
299+
300+
private void broadcastUnregistered(final List<UnifiedPushDatabase.PushTarget> pushTargets) {
301+
for(final UnifiedPushDatabase.PushTarget pushTarget : pushTargets) {
302+
Log.d(Config.LOGTAG,"sending unregistered to "+pushTarget);
303+
broadcastUnregistered(pushTarget);
304+
}
305+
}
306+
307+
private void broadcastUnregistered(final UnifiedPushDatabase.PushTarget pushTarget) {
308+
final var intent = unregisteredIntent(pushTarget);
309+
service.sendBroadcast(intent);
310+
}
311+
264312
public boolean processPushMessage(
265313
final Account account, final Jid transport, final Element push) {
266314
final String instance = push.getAttribute("instance");
@@ -355,6 +403,7 @@ private void broadcastPushMessage(
355403
updateIntent.putExtra("token", target.instance);
356404
updateIntent.putExtra("bytesMessage", payload);
357405
updateIntent.putExtra("message", new String(payload, StandardCharsets.UTF_8));
406+
// TODO add distributor verification?
358407
service.sendBroadcast(updateIntent);
359408
}
360409

@@ -379,6 +428,19 @@ private Intent endpointIntent(final String instance, final UnifiedPushDatabase.A
379428
return intent;
380429
}
381430

431+
private Intent unregisteredIntent(final UnifiedPushDatabase.PushTarget pushTarget) {
432+
final Intent intent = new Intent(UnifiedPushDistributor.ACTION_UNREGISTERED);
433+
intent.setPackage(pushTarget.application);
434+
intent.putExtra("token", pushTarget.instance);
435+
final var distributorVerificationIntent = new Intent();
436+
distributorVerificationIntent.setPackage(service.getPackageName());
437+
final var pendingIntent =
438+
PendingIntent.getBroadcast(
439+
service, 0, distributorVerificationIntent, PendingIntent.FLAG_IMMUTABLE);
440+
intent.putExtra("distributor", pendingIntent);
441+
return intent;
442+
}
443+
382444
public void rebroadcastEndpoint(final Messenger messenger, final String instance, final Transport transport) {
383445
final UnifiedPushDatabase unifiedPushDatabase = UnifiedPushDatabase.getInstance(service);
384446
final UnifiedPushDatabase.ApplicationEndpoint endpoint =

‎src/main/java/eu/siacs/conversations/services/UnifiedPushDistributor.java

+8
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,15 @@
2929

3030
public class UnifiedPushDistributor extends BroadcastReceiver {
3131

32+
// distributor actions (these are actios used for connector->distributor broadcasts)
33+
// we, the distributor, have a broadcast receiver listening for those actions
34+
3235
public static final String ACTION_REGISTER = "org.unifiedpush.android.distributor.REGISTER";
3336
public static final String ACTION_UNREGISTER = "org.unifiedpush.android.distributor.UNREGISTER";
37+
38+
39+
// connector actions (these are actions used for distributor->connector broadcasts)
40+
public static final String ACTION_UNREGISTERED = "org.unifiedpush.android.connector.UNREGISTERED";
3441
public static final String ACTION_BYTE_MESSAGE =
3542
"org.unifiedpush.android.distributor.feature.BYTES_MESSAGE";
3643
public static final String ACTION_REGISTRATION_FAILED =
@@ -172,6 +179,7 @@ private void unregister(final Context context, final String instance) {
172179
if (unifiedPushDatabase.deleteInstance(instance)) {
173180
quickLog(context, String.format("successfully unregistered token %s from UnifiedPushed (application requested unregister)", instance));
174181
Log.d(Config.LOGTAG, "successfully removed " + instance + " from UnifiedPush");
182+
// TODO send UNREGISTERED broadcast back to app?!
175183
}
176184
}
177185

0 commit comments

Comments
 (0)
Please sign in to comment.