UnifiedPush: send unregistered to apps when 'none' account is selected
This commit is contained in:
parent
20c179c1a1
commit
1a83c290a2
|
@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
|
@ -129,6 +130,23 @@ public class UnifiedPushDatabase extends SQLiteOpenHelper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<PushTarget> deletePushTargets() {
|
||||||
|
final SQLiteDatabase sqLiteDatabase = getReadableDatabase();
|
||||||
|
final ImmutableList.Builder<PushTarget> builder = new ImmutableList.Builder<>();
|
||||||
|
try (final Cursor cursor = sqLiteDatabase.query("push",new String[]{"application","instance"},null,null,null,null,null)) {
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
builder.add(new PushTarget(
|
||||||
|
cursor.getString(cursor.getColumnIndexOrThrow("application")),
|
||||||
|
cursor.getString(cursor.getColumnIndexOrThrow("instance"))));
|
||||||
|
}
|
||||||
|
} catch (final Exception e) {
|
||||||
|
Log.d(Config.LOGTAG,"unable to retrieve push targets",e);
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
sqLiteDatabase.delete("push",null,null);
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasEndpoints(final UnifiedPushBroker.Transport transport) {
|
public boolean hasEndpoints(final UnifiedPushBroker.Transport transport) {
|
||||||
final SQLiteDatabase sqLiteDatabase = getReadableDatabase();
|
final SQLiteDatabase sqLiteDatabase = getReadableDatabase();
|
||||||
try (final Cursor cursor =
|
try (final Cursor cursor =
|
||||||
|
|
|
@ -10,10 +10,18 @@ import android.os.Messenger;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.io.BaseEncoding;
|
import com.google.common.io.BaseEncoding;
|
||||||
|
import com.google.common.util.concurrent.FutureCallback;
|
||||||
|
import com.google.common.util.concurrent.Futures;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Account;
|
import eu.siacs.conversations.entities.Account;
|
||||||
|
@ -239,6 +247,9 @@ public class UnifiedPushBroker {
|
||||||
public boolean reconfigurePushDistributor() {
|
public boolean reconfigurePushDistributor() {
|
||||||
final boolean enabled = getTransport().isPresent();
|
final boolean enabled = getTransport().isPresent();
|
||||||
setUnifiedPushDistributorEnabled(enabled);
|
setUnifiedPushDistributorEnabled(enabled);
|
||||||
|
if (!enabled) {
|
||||||
|
unregisterCurrentPushTargets();
|
||||||
|
}
|
||||||
return enabled;
|
return enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,6 +272,43 @@ public class UnifiedPushBroker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void unregisterCurrentPushTargets() {
|
||||||
|
final var future = deletePushTargets();
|
||||||
|
Futures.addCallback(
|
||||||
|
future,
|
||||||
|
new FutureCallback<>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(
|
||||||
|
final List<UnifiedPushDatabase.PushTarget> pushTargets) {
|
||||||
|
broadcastUnregistered(pushTargets);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Throwable throwable) {
|
||||||
|
Log.d(
|
||||||
|
Config.LOGTAG,
|
||||||
|
"could not delete endpoints after UnifiedPushDistributor was disabled");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MoreExecutors.directExecutor());
|
||||||
|
}
|
||||||
|
|
||||||
|
private ListenableFuture<List<UnifiedPushDatabase.PushTarget>> deletePushTargets() {
|
||||||
|
return Futures.submit(() -> UnifiedPushDatabase.getInstance(service).deletePushTargets(),SCHEDULER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void broadcastUnregistered(final List<UnifiedPushDatabase.PushTarget> pushTargets) {
|
||||||
|
for(final UnifiedPushDatabase.PushTarget pushTarget : pushTargets) {
|
||||||
|
Log.d(Config.LOGTAG,"sending unregistered to "+pushTarget);
|
||||||
|
broadcastUnregistered(pushTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void broadcastUnregistered(final UnifiedPushDatabase.PushTarget pushTarget) {
|
||||||
|
final var intent = unregisteredIntent(pushTarget);
|
||||||
|
service.sendBroadcast(intent);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean processPushMessage(
|
public boolean processPushMessage(
|
||||||
final Account account, final Jid transport, final Element push) {
|
final Account account, final Jid transport, final Element push) {
|
||||||
final String instance = push.getAttribute("instance");
|
final String instance = push.getAttribute("instance");
|
||||||
|
@ -355,6 +403,7 @@ public class UnifiedPushBroker {
|
||||||
updateIntent.putExtra("token", target.instance);
|
updateIntent.putExtra("token", target.instance);
|
||||||
updateIntent.putExtra("bytesMessage", payload);
|
updateIntent.putExtra("bytesMessage", payload);
|
||||||
updateIntent.putExtra("message", new String(payload, StandardCharsets.UTF_8));
|
updateIntent.putExtra("message", new String(payload, StandardCharsets.UTF_8));
|
||||||
|
// TODO add distributor verification?
|
||||||
service.sendBroadcast(updateIntent);
|
service.sendBroadcast(updateIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,6 +428,19 @@ public class UnifiedPushBroker {
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Intent unregisteredIntent(final UnifiedPushDatabase.PushTarget pushTarget) {
|
||||||
|
final Intent intent = new Intent(UnifiedPushDistributor.ACTION_UNREGISTERED);
|
||||||
|
intent.setPackage(pushTarget.application);
|
||||||
|
intent.putExtra("token", pushTarget.instance);
|
||||||
|
final var distributorVerificationIntent = new Intent();
|
||||||
|
distributorVerificationIntent.setPackage(service.getPackageName());
|
||||||
|
final var pendingIntent =
|
||||||
|
PendingIntent.getBroadcast(
|
||||||
|
service, 0, distributorVerificationIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
intent.putExtra("distributor", pendingIntent);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
public void rebroadcastEndpoint(final Messenger messenger, final String instance, final Transport transport) {
|
public void rebroadcastEndpoint(final Messenger messenger, final String instance, final Transport transport) {
|
||||||
final UnifiedPushDatabase unifiedPushDatabase = UnifiedPushDatabase.getInstance(service);
|
final UnifiedPushDatabase unifiedPushDatabase = UnifiedPushDatabase.getInstance(service);
|
||||||
final UnifiedPushDatabase.ApplicationEndpoint endpoint =
|
final UnifiedPushDatabase.ApplicationEndpoint endpoint =
|
||||||
|
|
|
@ -29,8 +29,15 @@ import eu.siacs.conversations.utils.Compatibility;
|
||||||
|
|
||||||
public class UnifiedPushDistributor extends BroadcastReceiver {
|
public class UnifiedPushDistributor extends BroadcastReceiver {
|
||||||
|
|
||||||
|
// distributor actions (these are actios used for connector->distributor broadcasts)
|
||||||
|
// we, the distributor, have a broadcast receiver listening for those actions
|
||||||
|
|
||||||
public static final String ACTION_REGISTER = "org.unifiedpush.android.distributor.REGISTER";
|
public static final String ACTION_REGISTER = "org.unifiedpush.android.distributor.REGISTER";
|
||||||
public static final String ACTION_UNREGISTER = "org.unifiedpush.android.distributor.UNREGISTER";
|
public static final String ACTION_UNREGISTER = "org.unifiedpush.android.distributor.UNREGISTER";
|
||||||
|
|
||||||
|
|
||||||
|
// connector actions (these are actions used for distributor->connector broadcasts)
|
||||||
|
public static final String ACTION_UNREGISTERED = "org.unifiedpush.android.connector.UNREGISTERED";
|
||||||
public static final String ACTION_BYTE_MESSAGE =
|
public static final String ACTION_BYTE_MESSAGE =
|
||||||
"org.unifiedpush.android.distributor.feature.BYTES_MESSAGE";
|
"org.unifiedpush.android.distributor.feature.BYTES_MESSAGE";
|
||||||
public static final String ACTION_REGISTRATION_FAILED =
|
public static final String ACTION_REGISTRATION_FAILED =
|
||||||
|
@ -172,6 +179,7 @@ public class UnifiedPushDistributor extends BroadcastReceiver {
|
||||||
if (unifiedPushDatabase.deleteInstance(instance)) {
|
if (unifiedPushDatabase.deleteInstance(instance)) {
|
||||||
quickLog(context, String.format("successfully unregistered token %s from UnifiedPushed (application requested unregister)", instance));
|
quickLog(context, String.format("successfully unregistered token %s from UnifiedPushed (application requested unregister)", instance));
|
||||||
Log.d(Config.LOGTAG, "successfully removed " + instance + " from UnifiedPush");
|
Log.d(Config.LOGTAG, "successfully removed " + instance + " from UnifiedPush");
|
||||||
|
// TODO send UNREGISTERED broadcast back to app?!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue