fixups for missed call notifications

This commit is contained in:
Daniel Gultsch 2022-08-29 13:01:20 +02:00
parent a6b88ba9e9
commit f8b9e15634
2 changed files with 60 additions and 23 deletions

View file

@ -103,7 +103,8 @@ public class NotificationService {
private final XmppConnectionService mXmppConnectionService;
private final LinkedHashMap<String, ArrayList<Message>> notifications = new LinkedHashMap<>();
private final HashMap<Conversation, AtomicInteger> mBacklogMessageCounter = new HashMap<>();
private final LinkedHashMap<Conversational, MissedCallsInfo> mMissedCalls = new LinkedHashMap<>();
private final LinkedHashMap<Conversational, MissedCallsInfo> mMissedCalls =
new LinkedHashMap<>();
private Conversation mOpenConversation;
private boolean mIsInForeground;
private long mLastNotification;
@ -224,9 +225,11 @@ public class NotificationService {
ongoingCallsChannel.setGroup("calls");
notificationManager.createNotificationChannel(ongoingCallsChannel);
final NotificationChannel missedCallsChannel = new NotificationChannel("missed_calls",
c.getString(R.string.missed_calls_channel_name),
NotificationManager.IMPORTANCE_HIGH);
final NotificationChannel missedCallsChannel =
new NotificationChannel(
"missed_calls",
c.getString(R.string.missed_calls_channel_name),
NotificationManager.IMPORTANCE_HIGH);
missedCallsChannel.setShowBadge(true);
missedCallsChannel.setSound(null, null);
missedCallsChannel.setLightColor(LED_COLOR);
@ -413,8 +416,8 @@ public class NotificationService {
return count;
}
void finishBacklog(boolean notify) {
finishBacklog(notify, null);
void finishBacklog() {
finishBacklog(false, null);
}
private void pushToStack(final Message message) {
@ -967,7 +970,8 @@ public class NotificationService {
}
private Builder buildMissedCallsSummary(boolean publicVersion) {
final Builder builder = new NotificationCompat.Builder(mXmppConnectionService, "missed_calls");
final Builder builder =
new NotificationCompat.Builder(mXmppConnectionService, "missed_calls");
int totalCalls = 0;
final StringBuilder names = new StringBuilder();
long lastTime = 0;
@ -982,9 +986,16 @@ public class NotificationService {
if (names.length() >= 2) {
names.delete(names.length() - 2, names.length());
}
final String title = (totalCalls == 1) ? mXmppConnectionService.getString(R.string.missed_call) :
(mMissedCalls.size() == 1) ? mXmppConnectionService.getString(R.string.n_missed_calls, totalCalls) :
mXmppConnectionService.getString(R.string.n_missed_calls_from_m_contacts, totalCalls, mMissedCalls.size());
final String title =
(totalCalls == 1)
? mXmppConnectionService.getString(R.string.missed_call)
: (mMissedCalls.size() == 1)
? mXmppConnectionService.getString(
R.string.n_missed_calls, totalCalls)
: mXmppConnectionService.getString(
R.string.n_missed_calls_from_m_contacts,
totalCalls,
mMissedCalls.size());
builder.setContentTitle(title);
builder.setTicker(title);
if (!publicVersion) {
@ -1012,19 +1023,27 @@ public class NotificationService {
return builder.build();
}
private Builder buildMissedCall(final Conversational conversation, final MissedCallsInfo info, boolean publicVersion) {
final Builder builder = new NotificationCompat.Builder(mXmppConnectionService, "missed_calls");
final String title = (info.getNumberOfCalls() == 1) ? mXmppConnectionService.getString(R.string.missed_call) :
mXmppConnectionService.getString(R.string.n_missed_calls, info.getNumberOfCalls());
private Builder buildMissedCall(
final Conversational conversation, final MissedCallsInfo info, boolean publicVersion) {
final Builder builder =
new NotificationCompat.Builder(mXmppConnectionService, "missed_calls");
final String title =
(info.getNumberOfCalls() == 1)
? mXmppConnectionService.getString(R.string.missed_call)
: mXmppConnectionService.getString(
R.string.n_missed_calls, info.getNumberOfCalls());
builder.setContentTitle(title);
final String name = conversation.getContact().getDisplayName();
if (publicVersion) {
builder.setTicker(title);
} else {
if (info.getNumberOfCalls() == 1) {
builder.setTicker(mXmppConnectionService.getString(R.string.missed_call_from_x, name));
builder.setTicker(
mXmppConnectionService.getString(R.string.missed_call_from_x, name));
} else {
builder.setTicker(mXmppConnectionService.getString(R.string.n_missed_calls_from_x, info.getNumberOfCalls(), name));
builder.setTicker(
mXmppConnectionService.getString(
R.string.n_missed_calls_from_x, info.getNumberOfCalls(), name));
}
builder.setContentText(name);
}
@ -1035,15 +1054,20 @@ public class NotificationService {
builder.setContentIntent(createContentIntent(conversation));
builder.setDeleteIntent(createMissedCallsDeleteIntent(conversation));
if (!publicVersion && conversation instanceof Conversation) {
builder.setLargeIcon(mXmppConnectionService.getAvatarService()
.get((Conversation) conversation, AvatarService.getSystemUiAvatarSize(mXmppConnectionService)));
builder.setLargeIcon(
mXmppConnectionService
.getAvatarService()
.get(
(Conversation) conversation,
AvatarService.getSystemUiAvatarSize(mXmppConnectionService)));
}
modifyMissedCall(builder);
return builder;
}
private void modifyMissedCall(final Builder builder) {
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService);
final SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService);
final Resources resources = mXmppConnectionService.getResources();
final boolean led = preferences.getBoolean("led", resources.getBoolean(R.bool.led));
if (led) {
@ -1521,7 +1545,7 @@ public class NotificationService {
return createContentIntent(conversation.getUuid(), null);
}
private PendingIntent createDeleteIntent(Conversation conversation) {
private PendingIntent createDeleteIntent(final Conversation conversation) {
final Intent intent = new Intent(mXmppConnectionService, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_CLEAR_MESSAGE_NOTIFICATION);
if (conversation != null) {
@ -1548,9 +1572,21 @@ public class NotificationService {
intent.setAction(XmppConnectionService.ACTION_CLEAR_MISSED_CALL_NOTIFICATION);
if (conversation != null) {
intent.putExtra("uuid", conversation.getUuid());
return PendingIntent.getService(mXmppConnectionService, generateRequestCode(conversation, 21), intent, 0);
return PendingIntent.getService(
mXmppConnectionService,
generateRequestCode(conversation, 21),
intent,
s()
? PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
: PendingIntent.FLAG_UPDATE_CURRENT);
}
return PendingIntent.getService(mXmppConnectionService, 1, intent, 0);
return PendingIntent.getService(
mXmppConnectionService,
1,
intent,
s()
? PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
: PendingIntent.FLAG_UPDATE_CURRENT);
}
private PendingIntent createReplyIntent(
@ -1896,6 +1932,7 @@ public class NotificationService {
return lastTime;
}
}
private class VibrationRunnable implements Runnable {
@Override

View file

@ -1958,7 +1958,7 @@ public class XmppConnectionService extends Service {
restoreMessages(conversation);
}
}
mNotificationService.finishBacklog(false);
mNotificationService.finishBacklog();
restoredFromDatabaseLatch.countDown();
final long diffMessageRestore = SystemClock.elapsedRealtime() - startMessageRestore;
Log.d(Config.LOGTAG, "finished restoring messages in " + diffMessageRestore + "ms");