package org.tm.archive.migrations; import android.app.Notification; import android.app.PendingIntent; import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.app.TaskStackBuilder; import org.signal.core.util.logging.Log; import org.tm.archive.MainActivity; import org.tm.archive.NewConversationActivity; import org.tm.archive.R; import org.tm.archive.conversationlist.model.ConversationFilter; import org.tm.archive.database.SignalDatabase; import org.tm.archive.database.ThreadTable; import org.tm.archive.jobmanager.Job; import org.tm.archive.keyvalue.SignalStore; import org.tm.archive.notifications.NotificationChannels; import org.tm.archive.notifications.NotificationIds; import org.tm.archive.recipients.RecipientId; import org.signal.core.util.SetUtil; import org.tm.archive.util.TextSecurePreferences; import java.util.List; import java.util.Set; /** * Show a user that contacts are newly available. Only for users that recently installed. */ public class UserNotificationMigrationJob extends MigrationJob { private static final String TAG = Log.tag(UserNotificationMigrationJob.class); public static final String KEY = "UserNotificationMigration"; UserNotificationMigrationJob() { this(new Parameters.Builder().build()); } private UserNotificationMigrationJob(Parameters parameters) { super(parameters); } @Override public @NonNull String getFactoryKey() { return KEY; } @Override boolean isUiBlocking() { return false; } @Override void performMigration() { if (!SignalStore.account().isRegistered() || SignalStore.account().getE164() == null || SignalStore.account().getAci() == null) { Log.w(TAG, "Not registered! Skipping."); return; } if (!SignalStore.settings().isNotifyWhenContactJoinsSignal()) { Log.w(TAG, "New contact notifications disabled! Skipping."); return; } if (TextSecurePreferences.getFirstInstallVersion(context) < 759) { Log.w(TAG, "Install is older than v5.0.8. Skipping."); return; } ThreadTable threadTable = SignalDatabase.threads(); int threadCount = threadTable.getUnarchivedConversationListCount(ConversationFilter.OFF) + threadTable.getArchivedConversationListCount(ConversationFilter.OFF); if (threadCount >= 3) { Log.w(TAG, "Already have 3 or more threads. Skipping."); return; } Set registered = SignalDatabase.recipients().getRegistered(); List systemContacts = SignalDatabase.recipients().getSystemContacts(); Set registeredSystemContacts = SetUtil.intersection(registered, systemContacts); Set threadRecipients = threadTable.getAllThreadRecipients(); if (threadRecipients.containsAll(registeredSystemContacts)) { Log.w(TAG, "Threads already exist for all relevant contacts. Skipping."); return; } String message = context.getResources().getQuantityString(R.plurals.UserNotificationMigrationJob_d_contacts_are_on_signal, registeredSystemContacts.size(), registeredSystemContacts.size()); Intent mainActivityIntent = new Intent(context, MainActivity.class); Intent newConversationIntent = new Intent(context, NewConversationActivity.class); PendingIntent pendingIntent = TaskStackBuilder.create(context) .addNextIntent(mainActivityIntent) .addNextIntent(newConversationIntent) .getPendingIntent(0, 0); Notification notification = new NotificationCompat.Builder(context, NotificationChannels.getInstance().getMessagesChannel()) .setSmallIcon(R.drawable.ic_notification) .setContentText(message) .setContentIntent(pendingIntent) .build(); try { NotificationManagerCompat.from(context) .notify(NotificationIds.USER_NOTIFICATION_MIGRATION, notification); } catch (Throwable t) { Log.w(TAG, "Failed to notify!", t); } } @Override boolean shouldRetry(@NonNull Exception e) { return false; } public static final class Factory implements Job.Factory { @Override public @NonNull UserNotificationMigrationJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) { return new UserNotificationMigrationJob(parameters); } } }