Skip to content

Commit

Permalink
Don't redisplay notifications after they have been dismissed
Browse files Browse the repository at this point in the history
  • Loading branch information
moxie0 authored and BLeQuerrec committed Mar 29, 2017
1 parent 64ca1e2 commit f265f25
Show file tree
Hide file tree
Showing 20 changed files with 141 additions and 43 deletions.
4 changes: 2 additions & 2 deletions .gitmodules
@@ -1,6 +1,6 @@
[submodule "libs/com.android.support.support-v4-preferencefragment"]
path = libs/com.android.support.support-v4-preferencefragment
url = https://github.com/kolavar/android-support-v4-preferencefragment.git
url = https://github.com/SilenceIM/android-support-v4-preferencefragment.git
[submodule "libs/org.w3c.dom"]
path = libs/org.w3c.dom
url = https://github.com/SMSSecure/org.w3c.dom.git
Expand All @@ -9,7 +9,7 @@
url = https://github.com/WhisperSystems/gradle-witness.git
[submodule "libs/com.amulyakhare.textdrawable"]
path = libs/com.amulyakhare.textdrawable
url = https://github.com/amulyakhare/TextDrawable.git
url = https://github.com/SilenceIM/TextDrawable.git
[submodule "libs/org.whispersystems.jobmanager"]
path = libs/org.whispersystems.jobmanager
url = https://github.com/SMSSecure/jobmanager.git
Expand Down
4 changes: 2 additions & 2 deletions AndroidManifest.xml
Expand Up @@ -362,9 +362,9 @@
</intent-filter>
</receiver>

<receiver android:name=".notifications.MessageNotifier$DeleteReceiver">
<receiver android:name=".notifications.DeleteNotificationReceiver">
<intent-filter>
<action android:name="org.smssecure.smssecure.MessageNotifier.DELETE_REMINDER_ACTION"/>
<action android:name="org.smssecure.smssecure.DELETE_NOTIFICATION"/>
</intent-filter>
</receiver>

Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Expand Up @@ -5,7 +5,7 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.android.tools.build:gradle:2.3.0'
classpath files('libs/gradle-witness.jar')
}
}
Expand Down Expand Up @@ -135,7 +135,7 @@ dependencyVerification {

android {
compileSdkVersion 25
buildToolsVersion '23.0.1'
buildToolsVersion '25.0.2'
useLibrary 'org.apache.http.legacy'

defaultConfig {
Expand Down Expand Up @@ -182,7 +182,7 @@ android {
release {
minifyEnabled true
proguardFiles = buildTypes.debug.proguardFiles
testProguardFiles buildTypes.debug.testProguardFiles
testProguardFiles = buildTypes.debug.testProguardFiles
signingConfig signingConfigs.release
}
}
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Expand Up @@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
distributionSha256Sum=cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
distributionSha256Sum=c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292
2 changes: 1 addition & 1 deletion libs/com.amulyakhare.textdrawable
2 changes: 1 addition & 1 deletion libs/org.whispersystems.jobmanager
2 changes: 1 addition & 1 deletion libs/org.whispersystems.libpastelog
2 changes: 1 addition & 1 deletion libs/org.whispersystems.libsignal
16 changes: 14 additions & 2 deletions src/org/smssecure/smssecure/database/DatabaseFactory.java
Expand Up @@ -74,13 +74,14 @@ public class DatabaseFactory {
private static final int MIGRATED_CONVERSATION_LIST_STATUS_VERSION = 26;
private static final int INTRODUCED_SUBSCRIPTION_ID_VERSION = 28;
private static final int INTRODUCED_LAST_SEEN = 29;
private static final int INTRODUCED_NOTIFIED = 30;

/*
* Yes, INTRODUCED_XMPP_TRANSPORT > DATABASE_VERSION to allow database
* downgrade when XMPP transport will be included in unstable branch.
*/
private static final int INTRODUCED_XMPP_TRANSPORT = 30;
private static final int DATABASE_VERSION = 29;
private static final int INTRODUCED_XMPP_TRANSPORT = 31;
private static final int DATABASE_VERSION = 30;

private static final String DATABASE_NAME = "messages.db";
private static final Object lock = new Object();
Expand Down Expand Up @@ -829,6 +830,17 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE thread ADD COLUMN last_seen INTEGER DEFAULT 0");
}

if (oldVersion < INTRODUCED_NOTIFIED) {
db.execSQL("ALTER TABLE sms ADD COLUMN notified INTEGER DEFAULT 0");
db.execSQL("ALTER TABLE mms ADD COLUMN notified INTEGER DEFAULT 0");

db.execSQL("DROP INDEX sms_read_and_thread_id_index");
db.execSQL("CREATE INDEX IF NOT EXISTS sms_read_and_notified_and_thread_id_index ON sms(read,notified,thread_id)");

db.execSQL("DROP INDEX mms_read_and_thread_id_index");
db.execSQL("CREATE INDEX IF NOT EXISTS mms_read_and_notified_and_thread_id_index ON mms(read,notified,thread_id)");
}

db.setTransactionSuccessful();
db.endTransaction();
}
Expand Down
14 changes: 12 additions & 2 deletions src/org/smssecure/smssecure/database/MmsDatabase.java
Expand Up @@ -107,12 +107,12 @@ public class MmsDatabase extends MessagingDatabase {
"ct_cls" + " INTEGER, " + "resp_txt" + " TEXT, " + "d_tm" + " INTEGER, " +
DATE_DELIVERY_RECEIVED + " INTEGER DEFAULT 0, " + MISMATCHED_IDENTITIES + " TEXT DEFAULT NULL, " +
NETWORK_FAILURE + " TEXT DEFAULT NULL," + "d_rpt" + " INTEGER, " +
SUBSCRIPTION_ID + " INTEGER DEFAULT -1);";
SUBSCRIPTION_ID + " INTEGER DEFAULT -1, " + NOTIFIED + " INTEGER DEFAULT 0);";

public static final String[] CREATE_INDEXS = {
"CREATE INDEX IF NOT EXISTS mms_thread_id_index ON " + TABLE_NAME + " (" + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS mms_read_index ON " + TABLE_NAME + " (" + READ + ");",
"CREATE INDEX IF NOT EXISTS mms_read_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS mms_read_and_notified_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + NOTIFIED + "," + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS mms_message_box_index ON " + TABLE_NAME + " (" + MESSAGE_BOX + ");",
"CREATE INDEX IF NOT EXISTS mms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");",
"CREATE INDEX IF NOT EXISTS mms_thread_date_index ON " + TABLE_NAME + " (" + THREAD_ID + ", " + DATE_RECEIVED + ");"
Expand All @@ -127,6 +127,7 @@ public class MmsDatabase extends MessagingDatabase {
MESSAGE_SIZE, STATUS, TRANSACTION_ID,
BODY, PART_COUNT, ADDRESS, ADDRESS_DEVICE_ID,
DATE_DELIVERY_RECEIVED, MISMATCHED_IDENTITIES, NETWORK_FAILURE, SUBSCRIPTION_ID,
NOTIFIED,
AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + " AS " + AttachmentDatabase.ATTACHMENT_ID_ALIAS,
AttachmentDatabase.UNIQUE_ID,
AttachmentDatabase.MMS_ID,
Expand Down Expand Up @@ -364,6 +365,15 @@ public void markAsLegacyVersion(long messageId, long threadId) {
notifyConversationListeners(threadId);
}

public void markAsNotified(long id) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();

contentValues.put(NOTIFIED, 1);

database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)});
}

public void setMessagesRead(long threadId) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
Expand Down
3 changes: 2 additions & 1 deletion src/org/smssecure/smssecure/database/MmsSmsColumns.java
Expand Up @@ -14,7 +14,8 @@ public interface MmsSmsColumns {
public static final String DATE_DELIVERY_RECEIVED = "date_delivery_received";
public static final String MISMATCHED_IDENTITIES = "mismatched_identities";
public static final String UNIQUE_ROW_ID = "unique_row_id";
public static final String SUBSCRIPTION_ID = "subscription_id";
public static final String SUBSCRIPTION_ID = "subscription_id";
public static final String NOTIFIED = "notified";

public static class Types {
protected static final long TOTAL_MASK = 0xFFFFFFFF;
Expand Down
9 changes: 7 additions & 2 deletions src/org/smssecure/smssecure/database/MmsSmsDatabase.java
Expand Up @@ -102,7 +102,7 @@ public Cursor getConversationSnippet(long threadId) {

public Cursor getUnread() {
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " ASC";
String selection = MmsSmsColumns.READ + " = 0";
String selection = MmsSmsColumns.READ + " = 0 AND " + MmsSmsColumns.NOTIFIED + " = 0";

return queryTables(PROJECTION, selection, order, null);
}
Expand All @@ -128,7 +128,9 @@ private Cursor queryTables(String[] projection, String selection, String order,
MmsDatabase.CONTENT_LOCATION, MmsDatabase.TRANSACTION_ID,
MmsDatabase.MESSAGE_SIZE, MmsDatabase.EXPIRY, MmsDatabase.STATUS,
MmsSmsColumns.DATE_DELIVERY_RECEIVED, MmsSmsColumns.MISMATCHED_IDENTITIES,
MmsSmsColumns.SUBSCRIPTION_ID, MmsDatabase.NETWORK_FAILURE, TRANSPORT,
MmsSmsColumns.SUBSCRIPTION_ID,
MmsSmsColumns.NOTIFIED,
MmsDatabase.NETWORK_FAILURE, TRANSPORT,
AttachmentDatabase.UNIQUE_ID,
AttachmentDatabase.MMS_ID,
AttachmentDatabase.SIZE,
Expand All @@ -153,6 +155,7 @@ private Cursor queryTables(String[] projection, String selection, String order,
MmsDatabase.MESSAGE_SIZE, MmsDatabase.EXPIRY, MmsDatabase.STATUS,
MmsSmsColumns.DATE_DELIVERY_RECEIVED, MmsSmsColumns.MISMATCHED_IDENTITIES,
MmsSmsColumns.SUBSCRIPTION_ID,
MmsSmsColumns.NOTIFIED,
MmsDatabase.NETWORK_FAILURE, TRANSPORT,
AttachmentDatabase.UNIQUE_ID,
AttachmentDatabase.MMS_ID,
Expand Down Expand Up @@ -199,6 +202,7 @@ private Cursor queryTables(String[] projection, String selection, String order,
mmsColumnsPresent.add(MmsDatabase.TRANSACTION_ID);
mmsColumnsPresent.add(MmsDatabase.MESSAGE_SIZE);
mmsColumnsPresent.add(MmsDatabase.EXPIRY);
mmsColumnsPresent.add(MmsDatabase.NOTIFIED);
mmsColumnsPresent.add(MmsDatabase.STATUS);
mmsColumnsPresent.add(MmsDatabase.NETWORK_FAILURE);

Expand All @@ -221,6 +225,7 @@ private Cursor queryTables(String[] projection, String selection, String order,
smsColumnsPresent.add(MmsSmsColumns.DATE_DELIVERY_RECEIVED);
smsColumnsPresent.add(MmsSmsColumns.MISMATCHED_IDENTITIES);
smsColumnsPresent.add(MmsSmsColumns.SUBSCRIPTION_ID);
smsColumnsPresent.add(MmsSmsColumns.NOTIFIED);
smsColumnsPresent.add(SmsDatabase.TYPE);
smsColumnsPresent.add(SmsDatabase.SUBJECT);
smsColumnsPresent.add(SmsDatabase.DATE_SENT);
Expand Down
17 changes: 14 additions & 3 deletions src/org/smssecure/smssecure/database/SmsDatabase.java
Expand Up @@ -77,12 +77,13 @@ public class SmsDatabase extends MessagingDatabase {
DATE_RECEIVED + " INTEGER, " + DATE_SENT + " INTEGER, " + PROTOCOL + " INTEGER, " + READ + " INTEGER DEFAULT 0, " +
STATUS + " INTEGER DEFAULT -1," + TYPE + " INTEGER, " + REPLY_PATH_PRESENT + " INTEGER, " +
DATE_DELIVERY_RECEIVED + " INTEGER DEFAULT 0," + SUBJECT + " TEXT, " + BODY + " TEXT, " +
MISMATCHED_IDENTITIES + " TEXT DEFAULT NULL, " + SERVICE_CENTER + " TEXT, " + SUBSCRIPTION_ID + " INTEGER DEFAULT -1);";
MISMATCHED_IDENTITIES + " TEXT DEFAULT NULL, " + SERVICE_CENTER + " TEXT, " + SUBSCRIPTION_ID + " INTEGER DEFAULT -1, " +
NOTIFIED + " DEFAULT 0);";

public static final String[] CREATE_INDEXS = {
"CREATE INDEX IF NOT EXISTS sms_thread_id_index ON " + TABLE_NAME + " (" + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS sms_read_index ON " + TABLE_NAME + " (" + READ + ");",
"CREATE INDEX IF NOT EXISTS sms_read_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS sms_read_and_notified_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + NOTIFIED + "," + THREAD_ID + ");",
"CREATE INDEX IF NOT EXISTS sms_type_index ON " + TABLE_NAME + " (" + TYPE + ");",
"CREATE INDEX IF NOT EXISTS sms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");",
"CREATE INDEX IF NOT EXISTS sms_thread_date_index ON " + TABLE_NAME + " (" + THREAD_ID + ", " + DATE_RECEIVED + ");"
Expand All @@ -94,7 +95,8 @@ public class SmsDatabase extends MessagingDatabase {
DATE_SENT + " AS " + NORMALIZED_DATE_SENT,
PROTOCOL, READ, STATUS, TYPE,
REPLY_PATH_PRESENT, SUBJECT, BODY, SERVICE_CENTER, DATE_DELIVERY_RECEIVED,
MISMATCHED_IDENTITIES, SUBSCRIPTION_ID
MISMATCHED_IDENTITIES, SUBSCRIPTION_ID,
NOTIFIED
};

private final JobManager jobManager;
Expand Down Expand Up @@ -272,6 +274,15 @@ public void markAsSentFailed(long id) {
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE);
}

public void markAsNotified(long id) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();

contentValues.put(NOTIFIED, 1);

database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)});
}

public void setMessagesRead(long threadId) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
Expand Down
@@ -0,0 +1,41 @@
package org.smssecure.smssecure.notifications;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;

import org.smssecure.smssecure.database.DatabaseFactory;

public class DeleteNotificationReceiver extends BroadcastReceiver {

public static String DELETE_NOTIFICATION_ACTION = "org.smssecure.smssecure.DELETE_NOTIFICATION";

public static String EXTRA_IDS = "message_ids";
public static String EXTRA_MMS = "is_mms";

@Override
public void onReceive(final Context context, Intent intent) {
if (DELETE_NOTIFICATION_ACTION.equals(intent.getAction())) {
MessageNotifier.clearReminder(context);

final long[] ids = intent.getLongArrayExtra(EXTRA_IDS);
final boolean[] mms = intent.getBooleanArrayExtra(EXTRA_MMS);

if (ids == null || mms == null || ids.length != mms.length) return;

new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
for (int i=0;i<ids.length;i++) {
if (!mms[i]) DatabaseFactory.getSmsDatabase(context).markAsNotified(ids[i]);
else DatabaseFactory.getMmsDatabase(context).markAsNotified(ids[i]);
}

return null;
}
}.execute();
}
}
}
22 changes: 6 additions & 16 deletions src/org/smssecure/smssecure/notifications/MessageNotifier.java
Expand Up @@ -35,10 +35,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.util.Log;
import android.widget.Toast;

Expand All @@ -55,7 +52,6 @@
import org.smssecure.smssecure.database.model.MessageRecord;
import org.smssecure.smssecure.mms.SlideDeck;
import org.smssecure.smssecure.recipients.Recipient;
import org.smssecure.smssecure.recipients.RecipientFactory;
import org.smssecure.smssecure.recipients.Recipients;
import org.smssecure.smssecure.service.KeyCachingService;
import org.smssecure.smssecure.util.ServiceUtil;
Expand Down Expand Up @@ -291,6 +287,7 @@ private static void sendSingleThreadNotification(Context context,
notifications.get(0).getText(), notifications.get(0).getSlideDeck());
builder.setContentIntent(notifications.get(0).getPendingIntent(context));
builder.setGroup(NOTIFICATION_GROUP);
builder.setDeleteIntent(notificationState.getDeleteIntent(context));

long timestamp = notifications.get(0).getTimestamp();
if (timestamp != 0) builder.setWhen(timestamp);
Expand Down Expand Up @@ -331,6 +328,7 @@ private static void sendMultipleThreadNotification(Context context,
builder.setMessageCount(notificationState.getMessageCount(), notificationState.getThreadCount());
builder.setMostRecentSender(notifications.get(0).getIndividualRecipient());
builder.setGroup(NOTIFICATION_GROUP);
builder.setDeleteIntent(notificationState.getDeleteIntent(context));

long timestamp = notifications.get(0).getTimestamp();
if (timestamp != 0) builder.setWhen(timestamp);
Expand Down Expand Up @@ -414,6 +412,8 @@ private static NotificationState constructNotificationState(Context context,
else reader = DatabaseFactory.getMmsSmsDatabase(context).readerFor(cursor, masterSecret);

while ((record = reader.getNext()) != null) {
long id = record.getId();
boolean mms = record.isMms() || record.isMmsNotification();
Recipient recipient = record.getIndividualRecipient();
Recipients recipients = record.getRecipients();
long threadId = record.getThreadId();
Expand All @@ -439,7 +439,7 @@ private static NotificationState constructNotificationState(Context context,
}

if (threadRecipients == null || !threadRecipients.isMuted()) {
notificationState.addNotification(new NotificationItem(recipient, recipients, threadRecipients, threadId, body, timestamp, slideDeck));
notificationState.addNotification(new NotificationItem(id, mms, recipient, recipients, threadRecipients, threadId, body, timestamp, slideDeck));
}
}

Expand All @@ -462,7 +462,7 @@ private static void scheduleReminder(Context context, int count) {
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeout, pendingIntent);
}

private static void clearReminder(Context context) {
public static void clearReminder(Context context) {
Intent alarmIntent = new Intent(ReminderReceiver.REMINDER_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Expand All @@ -488,16 +488,6 @@ protected Void doInBackground(Void... params) {
}
}

public static class DeleteReceiver extends BroadcastReceiver {

public static final String DELETE_REMINDER_ACTION = "org.smssecure.smssecure.MessageNotifier.DELETE_REMINDER_ACTION";

@Override
public void onReceive(Context context, Intent intent) {
clearReminder(context);
}
}

private static void updateBadge(Context context, int count) {
BadgeWidgetProvider.getInstance(context, (Class) ConversationListActivity.class).updateBadge(count);
}
Expand Down
Expand Up @@ -30,7 +30,6 @@ public MultipleRecipientNotificationBuilder(Context context, NotificationPrivacy
setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, ConversationListActivity.class), 0));
setCategory(NotificationCompat.CATEGORY_MESSAGE);
setPriority(NotificationCompat.PRIORITY_HIGH);
setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(MessageNotifier.DeleteReceiver.DELETE_REMINDER_ACTION), 0));
setGroupSummary(true);
}

Expand Down

0 comments on commit f265f25

Please sign in to comment.